※この連載の全ての記事は、タグ「ビッグカツ」の検索一覧から探すことができます。
※この連載で作ったゲームは「BigBreakOut(ゲームの作り方の記事付き) | フリーゲーム投稿サイト GodotPlayer」でプレイできます。
昔から人気の駄菓子「ビッグカツ」のフリー素材画像が公開されたので、無料・軽快な 2D / 3D 用のゲームエンジン Godot Engine 4 を使って、ビッグカツ画像を使ったブロック崩しを作成します。
「ビッグカツブロック崩し」作成の第23回では、ゲームオーバー時に表示される、リトライボタンが押されたときにシグナルを用いて関数を呼び出す設定と、その面(レベル)をリセットしてやり直すリトライ処理の実装例、それらのテスト結果について紹介します。
※ GodotEngine 4.3 を使用しています。.NET 版ではありません。
※スクリプトは自己責任でご使用ください。
前回の記事
前回は、ゲームオーバーとゲームクリア時に表示する UI 群を作成して、外観や表示順の設定などを行いました。
ボタンが押された際の関数呼び出しの設定
ゲームオーバー時に表示される GameOverUI ノード( Control クラス)の子ノードに作成した ボタン、RetryButton ノード( Button クラス)が押された際に呼び出す関数を作成します。
リトライボタンの UI の配置の詳細は以下の記事を参照してください。
シーンドックで RetryButton ノードを選択した後、ノードドックで button_up() シグナルをダブルクリックします。
「メソッドにシグナルを接続」ダイアログで、スクリプトをすでに割り当ててある Stage ルートノードを選択して「接続」ボタンを押すと、下側の「受信側メソッド」に指定された名前の関数が追加され RetryButton のボタンが離されたタイミングで発せられるシグナルと接続します。
Script ワークスペースに切り替わり、 stage.gd が開かれ、追加された受信側メソッドの関数が表示されます。
ノードドックでは、RetryButton ノードの button_up() シグナルの下位に、追加された関数名が表示されます。
Giveup ボタンにも同様に _on_giveup_button_button_up 関数を stage.gd に追加して button_up() シグナルと接続します。
ギブアップとリトライ処理のスクリプト例
stage.gd に追加した RetryButton と GiveupButton の button_up() シグナルの受信側メソッドの関数にそれぞれ以下の処理を上書きします。
※詳しくはスクリプト内のコメントを参照してください。
## RetryButton が離されたタイミングで呼び出される受信側メソッドです。
## 同じレベルを再び読み込み、リトライを行います。
func _on_retry_button_button_up():
# 現在のレベルを読み込みなおします。
current_level_index -= 1
next_level()
return
## GiveupButton が離されたタイミングで呼び出される受信側メソッドです。
## タイトルシーンに戻ります。
func _on_giveup_button_button_up():
# タイトルシーンに戻ります。
get_tree().change_scene_to_file("res://title_scene.tscn")
return
リトライの処理では、次の面(レベル)を読み込む next_level 関数を、現在の面(レベル)のインデックスを1つ減らし(戻し)てから呼び出すことで、同じ面(レベル)を再び読み込ませて、リトライを実装しました。
next_level 関数については、以下の記事を参照してください。
https://compota-soft.work/wp1/wp-admin/post.php?post=42225&action=edit
タイトルのシーンに切り替える実装では SceneTree クラスの change_scene_to_file 関数にタイトルのシーンのファイルを渡して呼び出しています。
Changes the running scene to the one at the given
path
, after loading it into a PackedScene and creating a new instance.Returns @GlobalScope.OK on success, @GlobalScope.ERR_CANT_OPEN if the
path
cannot be loaded into a PackedScene, or @GlobalScope.ERR_CANT_CREATE if that scene cannot be instantiated.Note: See change_scene_to_packed for details on the order of operations.
PackedScene にロードして新しいインスタンスを作成した後、実行中のシーンを指定されたパスにあるシーンに変更します。 成功した場合は @GlobalScope.OK を返し、パスを PackedScene にロードできない場合は @GlobalScope.ERR_CANT_OPEN を返し、そのシーンをインスタンス化できない場合は @GlobalScope.ERR_CANT_CREATE を返します。 注: 操作の順序の詳細については、「change_scene_to_packed」を参照してください。SceneTree — Godot Engine (4.x)の日本語のドキュメント #change-scene-to-file と Google 翻訳
シーンの切り替え方には、他にもいくつかの方法があり、それぞれに長所と短所があります。
詳細は、公式サイト「シーンを手動で変更する — Godot Engine (4.x)の日本語のドキュメント」を参照してください。
テスト
F6 キーで開いているステージのシーンを実行します。
ボールが画面外に落下したタイミングで、ゲームオーバーの UI が表示され、リトライボタンを押すとリトライカウントが1増え、同じレベルを再びプレイできした。
ギブアップボタンを押すとタイトルに戻りました。
まとめ
「ビッグカツブロック崩し」作成の第23回では、ゲームオーバー時に表示される、リトライボタンが押されたときにシグナルを用いて関数を呼び出す設定と、その面(レベル)をリセットしてやり直すリトライ処理の実装例、それらのテスト結果について紹介しました。
参照サイト Thank You!
- Godot Engine – Free and open source 2D and 3D game engine
- Xユーザーのビッグカツといか姿フライのすぐる【公式】さん: 「使いどころは思いつきませんが、フリー素材としてどうぞご自由にお使いくださいませ! https://t.co/8F9q3hS02b」 / X
- しょかきうたげ【フリーフォント版あり】 – ぼんのう堂 – BOOTH
- シグナルの使用 — Godot Engine (4.x)の日本語のドキュメント
- シーンを手動で変更する — Godot Engine (4.x)の日本語のドキュメント
- SceneTree — Godot Engine (4.x)の日本語のドキュメント #change-scene-to-file
記事一覧 → Compota-Soft-Press
コメント