2020/10/28(水) [n年前の日記]
#3 [godot] Godot EngineでHUDシーンにスクリプトを追加
Godot Enigne 3.2.3 x64 の勉強を兼ねて、Apple Catcher っぽいゲームを作成中。
今回は、スコア、ゲームタイトル、スタートボタンの表示を担当するHUDシーンにスクリプトを追加する。後々、メインシーンから「スコア表示を更新しろ」だの「GAME OVERを表示しろ」だの色々指示されるはずなので、そういった処理を書く。
今回は、スコア、ゲームタイトル、スタートボタンの表示を担当するHUDシーンにスクリプトを追加する。後々、メインシーンから「スコア表示を更新しろ」だの「GAME OVERを表示しろ」だの色々指示されるはずなので、そういった処理を書く。
◎ スクリプトファイルを追加。 :
Hudノードを選んでおいて、右上のスクリプトをアタッチするボタンをクリック。
res://scripts/ 以下に Hud.gd というファイル名でスクリプトファイルを作成。
スクリプトを記述するエディタ画面が開かれた。
res://scripts/ 以下に Hud.gd というファイル名でスクリプトファイルを作成。
スクリプトを記述するエディタ画面が開かれた。
◎ スタートボタンを押したときのメソッドを用意する。 :
スタートボタンが押された時に、ゲーム開始処理を行わないといけない。そのあたりの処理を行うメソッドを用意する。
StartButtonノードを選択。

Buttonノードがマウスクリックされると、pressed() というシグナルが発行される。このシグナルにメソッドを接続する。ノードタブをクリックして、pressed() を選択して「接続」。

Hudノードを選択して「接続」。
Hud.gd 内に _on_StartButton_pressed() というメソッドが用意された。このメソッドの中にスタートボタンが押されたときに必要な処理を書いていけばいい。
StartButtonノードを選択。

Buttonノードがマウスクリックされると、pressed() というシグナルが発行される。このシグナルにメソッドを接続する。ノードタブをクリックして、pressed() を選択して「接続」。

Hudノードを選択して「接続」。
Hud.gd 内に _on_StartButton_pressed() というメソッドが用意された。このメソッドの中にスタートボタンが押されたときに必要な処理を書いていけばいい。
◎ スクリプト内容を記述。 :
Hud.gd にスクリプトを記述していく。
記述内容は以下。
_Hud.gd
内容を簡単に説明すると…。
カスタムシグナルについては少し説明が必要かもしれない。各ノードはあらかじめ色々なシグナルを持っているけれど、スクリプトファイルの最初のあたりに「signal hoge」と書いておけば、hogeシグナルを新規に用意することができる。
この hogeシグナルに何かメソッドを接続しておいて、どこかで「emit_signal("hoge")」を呼んでhogeシグナルを発行してやれば、そのタイミングで接続されているメソッドが実行される。
今回は、スタートボタンが押されたタイミングで、メインシーンに対して「スタートボタンが押されたよ」と知らせてゲーム開始処理を行いたいので、new_game というカスタムシグナルを用意した。後々、この new_game シグナルに、Main.gd 内のメソッドを接続する予定。
スクリプトを書けたので、F6キーを押して実行してみる。
スタートボタンが押された時に _on_StartButton_pressed() が呼ばれるけれど、そこでは「MessageノードとStartButtonノードを非表示にせよ」と書いてあるので…。スタートボタンをクリックするとその2つのノードが画面内で非表示になった。ちゃんとスクリプトは動いてる。
次回は、このHudシーンをメインシーンに合体させる。
記述内容は以下。
_Hud.gd
extends CanvasLayer
signal new_game
func _ready():
pass # Replace with function body.
#func _process(delta):
# pass
func _on_StartButton_pressed():
$Message.hide()
$StartButton.hide()
emit_signal("new_game")
func update_score(score):
$Score.text = "SCORE: " + str(score)
func show_message(text):
$Message.text = text
$Message.show()
func hide_message():
$Message.hide()
func show_startbutton():
$StartButton.show()
内容を簡単に説明すると…。
- _on_StartButton_pressed() : スタートボタンが押されたときの処理。
- update_score(score) : スコア表示更新処理。score には整数が入ってくる。
- show_message(text) : ゲームタイトルや「GAME OVER」等のメッセージ(?)を表示する。text には文字列が入ってくる。
- hide_messsage() : メッセージ表示を隠す。
- show_startbutton() : スタートボタンを表示する。
- $ノード名.show() で、そのノードを表示状態にできる。
- $ノード名.hide() で、そのノードを非表示状態にできる。
- signal new_game で、カスタムシグナルを作っている。
- emit_signal("new_game") でカスタムシグナルを発行。
カスタムシグナルについては少し説明が必要かもしれない。各ノードはあらかじめ色々なシグナルを持っているけれど、スクリプトファイルの最初のあたりに「signal hoge」と書いておけば、hogeシグナルを新規に用意することができる。
この hogeシグナルに何かメソッドを接続しておいて、どこかで「emit_signal("hoge")」を呼んでhogeシグナルを発行してやれば、そのタイミングで接続されているメソッドが実行される。
今回は、スタートボタンが押されたタイミングで、メインシーンに対して「スタートボタンが押されたよ」と知らせてゲーム開始処理を行いたいので、new_game というカスタムシグナルを用意した。後々、この new_game シグナルに、Main.gd 内のメソッドを接続する予定。
スクリプトを書けたので、F6キーを押して実行してみる。
スタートボタンが押された時に _on_StartButton_pressed() が呼ばれるけれど、そこでは「MessageノードとStartButtonノードを非表示にせよ」と書いてあるので…。スタートボタンをクリックするとその2つのノードが画面内で非表示になった。ちゃんとスクリプトは動いてる。
次回は、このHudシーンをメインシーンに合体させる。
[ ツッコむ ]
以上です。






