HUDとメインの統合
HUDをメインに接続
続いてHUDをメインに接続します。
画面上部のタブで「2D」を選び、2Dビューにします。そして「main」シーンを開きます。「main」シーンをすでに閉じてしまっている時は、「ファイルシステム」ドックからmain.tscnをダブルクリックします。
「シーン」ドックの「Main」ノードを選択します。そして、「シーン」ドックの鎖アイコンをクリックして、「hud」シーンをインスタンス化して追加します。あるいは「Main」ノードを右クリックして、「子シーンをインスタンス化」を選択します。
「Ctrl+S」で変更を保存します。
「シーン」ドックの、「HUD」ノードを選択します。右側のサイドバーの「ノード」ドックの「シグナル」タブの「hud.gd」>「start_game()」を右クリックして、「接続」を選択します。
「メソッドにシグナルを接続」ダイアログが開きます。「Main」ノードを選択した状態で、「受信側メソッド」の右横にある「選択」ボタンを押します。
「メソッドの選択」ダイアログが開きますので、「new_game()」を選択して「OK」ボタンを押します。
「メソッドにシグナルを接続」ダイアログに戻るので、ダイアログの下にある「接続」ボタンを押します。
「Ctrl+S」で変更を保存します。main.gdのnew_game関数と、hud.gdのstart_gameシグナルが接続されました。
これで、hud.gd内でstart_game.emit()を実行すると、main.gdのnew_game関数が実行されます。
main.gdへのスクリプトの追加
それではnew_game関数にスクリプトを追加しましょう。末尾に2行追加します。
# 新ゲーム開始
func new_game() -> void:
score = 0
$Player.start($StartPosition.position)
$StartTimer.start()
$HUD.update_score(score) # 得点の更新
$HUD.show_message("Get Ready") # メッセージの表示
「HUD」ノードのupdate_score関数を実行して、scoreの値(ここでは0)を設定します。
そして、「HUD」ノードのshow_message関数を実行して、"Get Ready"のテキストを表示します。
また、game_over関数にもスクリプトを追加します。末尾に1行追加します。
# ゲーム終了 func game_over() -> void: $ScoreTimer.stop() $MobTimer.stop() $HUD.show_game_over() # ゲーム終了
もう1ヶ所、_on_score_timer_timeout関数にもスクリプトを追加します。末尾に1行追加します。
func _on_score_timer_timeout() -> void: score += 1 $HUD.update_score(score) # 得点の更新
古い敵の削除
続いて、古い敵を削除する機能を追加します。新しいゲームの開始時に、古い敵をまとめて削除するためです。
まず、「シーン」ドックで、「Mob」ルートノードを選択します。そして、右側のサイドバーの「ノード」ドックを開き、「グループ」タブを選択します。そして、「グループを絞り込む」の左にある「+記号のボタン」(新規グループを追加する)を押します。
「新規グループを作成」ダイアログが開きますので、「名前」に「mobs」と入力して「OK」ボタンを押します。
「シーングループ」に「mobs」が追加されました。「Ctrl+S」で変更を保存します。
これで、すべての「Mob」が「mobs」グループに含まれるようになります。この「mobs」の名前を利用して、まとめて「Mob」を操作できます。
次に、main.gdを開きます。そしてnew_game関数の末尾にスクリプトを1行追加します。
# 新ゲーム開始
func new_game() -> void:
score = 0
$Player.start($StartPosition.position)
$StartTimer.start()
$HUD.update_score(score) # 得点の更新
$HUD.show_message("Get Ready") # メッセージの表示
get_tree().call_group("mobs", "queue_free") # Mobをまとめて削除
get_tree関数はすでに出てきました。シーンツリーを取得する関数です。
このシーンツリーのcall_group関数は、第1引数のグループに対して、第2引数のメソッドを呼び出します。ここでは全ての「Mob」のインスタンスを削除します。
ゲームの実行
画面右上の「▶ボタン」(プロジェクトを実行)をクリックして、ここまでの処理を確かめます。
ここまでで一通り遊ぶことができます。次は最後の仕上げです。
