Godot4 ビッグカツブロック崩し18 プレイ中のみ時間計測&ノードの取得

※この連載の全ての記事は、タグ「ビッグカツ」の検索一覧から探すことができます。
※この連載で作ったゲームは「BigBreakOut(ゲームの作り方の記事付き) | フリーゲーム投稿サイト GodotPlayer」でプレイできます。

昔から人気の駄菓子「ビッグカツ」フリー素材画像が公開されたので、無料・軽快な 2D / 3D 用のゲームエンジン Godot Engine 4 を使って、ビッグカツ画像を使ったブロック崩しを作成します。

「ビッグカツブロック崩し」作成の第18回では、ブロック崩しのプレイ時間は、実際にプレイしている時間のみ計測するようにプレイ中かどうかの判定を追加します。
そのために、時間経過を表示するノードよりも上位のルートノードの進行状況を管理する変数にアクセスするための実装例も紹介します。
他の相対ノードパスなどによるノードの取得例も紹介します。

※ GodotEngine 4.3 を使用しています。.NET 版ではありません。
※スクリプトは自己責任でご使用ください。

前回の記事

前回は、ブロックを全て消してクリアすると次の面が表示される実装例を紹介しました。

時間経過のスクリプトにプレイ中かどうかの判定を追加

経過時間はプレイ中しか進まないようにする(上位のノードを取得する方法も)elapsed_time.gd

extends Label
class_name EllpsedTime
## 経過時間を計測・表示するクラスです。

## フレーム単位の経過時間を足していく変数です。
var time: float = 0
## Stage ルートノードを保持します。
var stage: Stage = null
# Called when the node enters the scene tree for the first time.
func _ready():
	time = 0
	stage = get_node("/root/Stage")
	return

# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
	# Stage ルートノードが持つゲームの進行状況を見て Playing の場合は時間を計測します。
	if stage.current_phase == Stage.Phase.Playing:
		# 前の本関数の呼び出しからの経過時間を加算します。
		time += delta
	# 経過時間の表示を更新します。小数1桁まで表示します。
	self.text = str("%.1f" % time)

8 行目で定義した stage 変数に Stage ルートノードを保持します。

初回に呼び出される _ready イベント関数で、ステージのシーンのルートノードである Stage の名前を指定して「 /root/Stage 」というノードパスを指定して、Stage ルートノードget_node 関数で stage 変数に設定します。

毎フレーム呼ばれる _process イベント関数の 18 行目では、Stage ルートノードを設定した stage 変数を介して Stage ルートノードの変数 current_phase にアクセスして、現在プレイ中かどうかを判定します。

get_node で指定するノードパスの形式

先ほどは get_node 関数のノードパスの引数に “/root/stage” のように最上位のルートからの絶対パスのような形式でノードを取得しましたが、後述のサンプルのように様々な形式のノードパスを指定することもできます。

Node get_node(path: NodePath) const 

Fetches a node. The NodePath can either be a relative path (from this node), or an absolute path (from the SceneTree.root) to a node. If path does not point to a valid node, generates an error and returns null. Attempts to access methods on the return value will result in an “Attempt to call <method> on a null instance.” error.

Note: Fetching by absolute path only works when the node is inside the scene tree (see is_inside_tree).

ノードを取得します。 NodePath は、ノードへの相対パス (このノードから) または絶対パス (SceneTree.root から) のいずれかになります。パスが有効なノードを指していない場合は、エラーが生成され、null が返されます。戻り値でメソッドにアクセスしようとすると、「null インスタンスで <method> を呼び出そうとしました」というメッセージが表示されます。 エラー。

注: 絶対パスによる取得は、ノードがシーン ツリー内にある場合にのみ機能します (is_inside_tree を参照)。
Node — Godot Engine (stable) documentation in English と Google 翻訳

以下は、公式サイト「Node — Godot Engine (stable) documentation in English #get-node」で説明されているノードパスの例です。
上側がサンプルのシーンで、そこからノードを取得するためのノードパスが下側に書かれています。

  • get_node(“Sword”) とそのシーンで一意の名前のノードであれば、ノード名だけでノードを取得できます。
  • “Backpack/Dagger” のようにノードパスの一部を指定することもできます。
  • “../Swamp/Alligator” のように .. によってひとつ上の階層に移動するノードパスも指定できます。
Godot4 Node get_node 関数で指定するノードパスの例(公式サイトより)

テスト

F6 キーで、開いているステージのシーンを実行します。
ボールが動いているプレイ中のみプレイ時間が増えることが確認できます。

プレイ開始前は、ゲームの進行状況が Phase.Playing ではないので、時間はカウントアップしません
スペースキーやクリックによりボールが動き出しPhase.Playing の状態になると時間がカウントアップします。
また、クリアすると時間のカウントアップが停止し、2面のプレイが始まると再びカウントアップします。

まとめ

「ビッグカツブロック崩し」作成の第17回では、ブロック崩しのプレイ時間は、実際にプレイしている時間のみ計測するようにプレイ中かどうかの判定を追加しました。
そのために、時間経過を表示するノードよりも上位のルートノードの進行状況を管理する変数にアクセスするための実装例も紹介しました。
他の相対ノードパスなどによるノードの取得例も紹介しました。

参照サイト Thank You!

記事一覧 → Compota-Soft-Press

コメント

Ads Blocker Image Powered by Code Help Pro

お願い - Ads Blocker Detected

このサイトは広告を掲載して運営しています。

ポップアップを閉じて閲覧できますが、よろしければ

このサイト内の広告を非表示にする拡張機能をオフにしていただけませんか?

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.

タイトルとURLをコピーしました