SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Godot Engine 2Dゲーム開発入門

【詳細解説】Godot Engineで始める2Dゲーム開発──公式サンプルを試してみよう

Godot Engine 2Dゲーム開発入門 第2回

10.ヘッドアップディスプレイのスクリプトの作成

スクリプトをアタッチ

 「HUD」のスクリプトを書いていきましょう。

 「シーン」ドックの「HUD」を右クリックして「スクリプトをアタッチ」を選択します。すでに何度も出てきた作業です。

 テンプレートのチェックを外して、そのままhud.gdの名前で保存します。ここでは_ready関数と_process関数を作る必要はないです。

 先頭行がextends CanvasLayerとなっています。

hud.gd
hud.gd

 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プロパティに設定します。得点の数値以外が引数に渡される可能性もありますが、ここでは得点が渡されるものとします。

hud.gd
hud.gd

StartButtonのシグナルの接続

 「StartButton」のシグナルを接続します。

 「シーン」ドックで「StartButton」を選択します。そして右側のサイドバーの「ノード」ドックを表示して、「シグナル」タブ>「BaseButton」>「pressed()」を右クリックして「接続」を選択します。

「pressed()」に接続
「pressed()」に接続

 「メソッドにシグナルを接続」ダイアログが開きます。「受信側メソッド」は「_on_start_button_pressed」のまま「接続」ボタンを押します。

「メソッドにシグナルを接続」ダイアログ
「メソッドにシグナルを接続」ダイアログ

 hud.gdに関数が追加されて接続の緑色アイコンが表示されます。

_on_start_button_pressed関数
_on_start_button_pressed関数

 作成された_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()」を右クリックして「接続」を選択します。

「timeout()」に接続
「timeout()」に接続

 「メソッドにシグナルを接続」ダイアログが開きます。「受信側メソッド」は「_on_message_timer_timeout」のまま「接続」ボタンを押します。

「メソッドにシグナルを接続」ダイアログ
「メソッドにシグナルを接続」ダイアログ

 hud.gdに関数が追加されて接続の緑色アイコンが表示されます。

_on_message_timer_timeout関数
_on_message_timer_timeout関数

 作成された_on_message_timer_timeout関数に処理を書きます。

func _on_message_timer_timeout() -> void:
	$Message.hide()		# メッセージを隠す

ここまでのスクリプト

 ここまでのスクリプトを掲載します。

hud.gd
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()		# メッセージを隠す

次のページ
HUDとメインの統合

この記事は参考になりましたか?

Godot Engine 2Dゲーム開発入門連載記事一覧

もっと読む

この記事の著者

柳井 政和(ヤナイ マサカズ)

クロノス・クラウン合同会社 代表社員http://crocro.com/オンラインソフトを多数公開。プログラムを書いたり、ゲームを作ったり、記事を執筆したり、マンガを描いたり、小説を書いたりしています。「めもりーくりーなー」でオンラインソフト大賞に入賞。最近は、小説家デビューして小説も書いています(『裏切りのプログラム』他)。面白いことなら何でもOKのさすらいの企画屋です。 

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/21370 2025/05/28 11:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー