10.ヘッドアップディスプレイのスクリプトの作成
スクリプトをアタッチ
「HUD」のスクリプトを書いていきましょう。
「シーン」ドックの「HUD」を右クリックして「スクリプトをアタッチ」を選択します。すでに何度も出てきた作業です。
テンプレートのチェックを外して、そのままhud.gdの名前で保存します。ここでは_ready関数と_process関数を作る必要はないです。
先頭行がextends CanvasLayerとなっています。
extendsの行のあとにシグナルを書き、これから作る関数を仮の状態で書きます。
extends CanvasLayer # Mainノードに、ボタンが押されたことを報せる signal start_game # メッセージを表示 func show_message(text) -> void: pass # ゲームオーバーの表示 func show_game_over() -> void: pass # 得点の更新 func update_score(score) -> void: pass
関数の処理の実装
関数の処理を順番に書いていきます。
まずはshow_message関数です。
# メッセージを表示 func show_message(text) -> void: $Message.text = text # テキストを更新 $Message.show() # 表示 $MessageTimer.start() # メッセージタイマーを開始
処理の内容を説明します。「Message」ノードの「text」プロパティを更新して、show関数で表示します。最後に、MessageTimerを開始します。
次はshow_game_over関数です。
# ゲームオーバーの表示
func show_game_over() -> void:
# ゲーム終了の表示
show_message("Game Over") # メッセージを表示
# MessageTimerがタイムアウトするまで待つ
await $MessageTimer.timeout
# ゲーム開始の表示
$Message.text = "Dodge the Creeps!" # テキストを更新
$Message.show() # 表示
# 単発のタイマー、1秒待つ
await get_tree().create_timer(1.0).timeout
$StartButton.show() # 開始ボタンを表示
await $MessageTimer.timeoutの行に注目してください。awaitを使えばシグナルを待機できます。ここでは2ヶ所でawaitを利用しています。
また、ノードがシーンツリーの一部である場合、get_tree関数を使うことで、シーンツリーを取得できます。
シーンツリーはインスタンスが1つしかないシングルトンで、ノードの階層を介してゲーム ループを管理します。
await get_tree().create_timer(1.0).timeoutは、一度きりの遅延タイマーを作成するスクリプトです。ここでは1秒待ちます。
続いてupdate_score関数です。
# 得点の更新 func update_score(score) -> void: $ScoreLabel.text = str(score) # テキストを更新
引数のscoreをテキストに変換して、「ScoreLabel」ノードのtextプロパティに設定します。得点の数値以外が引数に渡される可能性もありますが、ここでは得点が渡されるものとします。
StartButtonのシグナルの接続
「StartButton」のシグナルを接続します。
「シーン」ドックで「StartButton」を選択します。そして右側のサイドバーの「ノード」ドックを表示して、「シグナル」タブ>「BaseButton」>「pressed()」を右クリックして「接続」を選択します。
「メソッドにシグナルを接続」ダイアログが開きます。「受信側メソッド」は「_on_start_button_pressed」のまま「接続」ボタンを押します。
hud.gdに関数が追加されて接続の緑色アイコンが表示されます。
作成された_on_start_button_pressed関数に処理を書きます。
func _on_start_button_pressed() -> void: $StartButton.hide() # 開始ボタンを隠す start_game.emit() # start_gameシグナルを送る
start_gameは、hud.gdの冒頭で書いたシグナルです。emit関数でシグナルを発信します。
MessageTimerのシグナルの接続
次は「MessageTimer」のシグナルを接続します。
「シーン」ドックで「MessageTimer」を選択します。そして右側のサイドバーの「ノード」ドックを表示して、「シグナル」タブ>「Timer」>「timeout()」を右クリックして「接続」を選択します。
「メソッドにシグナルを接続」ダイアログが開きます。「受信側メソッド」は「_on_message_timer_timeout」のまま「接続」ボタンを押します。
hud.gdに関数が追加されて接続の緑色アイコンが表示されます。
作成された_on_message_timer_timeout関数に処理を書きます。
func _on_message_timer_timeout() -> void: $Message.hide() # メッセージを隠す
ここまでのスクリプト
ここまでのスクリプトを掲載します。
extends CanvasLayer
# Mainノードに、ボタンが押されたことを報せる
signal start_game
# メッセージを表示
func show_message(text) -> void:
$Message.text = text # テキストを更新
$Message.show() # 表示
$MessageTimer.start() # メッセージタイマーを開始
# ゲームオーバーの表示
func show_game_over() -> void:
# ゲーム終了の表示
show_message("Game Over") # メッセージを表示
# MessageTimerがタイムアウトするまで待つ
await $MessageTimer.timeout
# ゲーム開始の表示
$Message.text = "Dodge the Creeps!" # テキストを更新
$Message.show() # 表示
# 単発のタイマー、1秒待つ
await get_tree().create_timer(1.0).timeout
$StartButton.show() # 開始ボタンを表示
# 得点の更新
func update_score(score) -> void:
$ScoreLabel.text = str(score) # テキストを更新
func _on_start_button_pressed() -> void:
$StartButton.hide() # 開始ボタンを隠す
start_game.emit() # start_gameシグナルを送る
func _on_message_timer_timeout() -> void:
$Message.hide() # メッセージを隠す
