ぬーぶのメモ帳

フリーゲームエンジン「Godot」でプログラム経験のない素人の備忘録 最近は色々な動作を考えて試すのが好き。

【Godot】練習に簡易2Dドライブゲーム作ってみた

look_at()を利用してガイドを作成したその後 


https://noob-og3.hatenadiary.com/entry/2022/04/26/191601
上の記事でガイドの元になる部分を作ったので、ランダムに出現するチェックポイントへ向かう簡易的なドライブゲームを作ってみました。

ノード構成はこれだけ

必要な機能は

チェックポイントのランダム発生
#main
	if Checker.check == 0:
		var p = t_point.instance()
		add_child(p)
#rand_rangeで最小値から最大値のランダムをpositionに乗せる
		p.position.x = rand_range(-100,1648)
		p.position.y = rand_range(-100,1456)

注意したいのはGodotではrandomize()と使わないとランダムの変数が固定されてしまうらしい。

ここで問題が発生

障害物にめり込む…現状自分で対処できる方法を考えた結果

#checkpoint
	if body is TileMap:
		queue_free()

出現するチェックポイントがタイルマップに触れたら消滅するように、不格好だけどタイルマップ外にチェックポイントが出現するようになった。

ランダム出現するノードのpositionを取得

次に何度も出現するチェックポイントの座標を取得する方法が上手くいかず悩んでいた。
思いついた方法はグローバル関数にVector2を設定して、それにチェックポイントx,yを取得させる。

#singleton
	var point = Vector2()
#checkpoint
#singletonの変数にcheckpointノードのglobal_positionを取得させる
	func _process(delta: float) -> void:
		Singleton.point = self.global_position

これでリアルタイムに座標を共通の変数に取得できた。
「Singleton.point」は他コードでも使用できるので、これを矢印ガイドのコードに入れてあげる。

#arrow
	var pos = Singleton.point
	look_at(pos)

「checkpoint」→「 singleton」→「 arrow」の形で共通のデータとして利用できた。
【Godot】グローバル変数の設定方法 - ぬーぶのメモ帳
instance()で生成したノードから直接座標を取れるような方法はあるのだろうか…

チェックポイントのカウントについては簡単だった、以下動作GIF


常に矢印が出ているなら制限時間を設けても良かったかもしれない。


今回座標の取得はなかなか上手く行ったとは思うけど、敵が大量に出て来るようなゲームの場合は他の方法を考えないといけない気がする。
まだまだ学ぶことが多いなあと感じた。