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
出現するチェックポイントに矢印を何度も指し示すのがやっと上手く行ったー!
— おめがぬーぶ (@omega_noob_og3) 2022年5月1日
#GodotEngine pic.twitter.com/6hx11X9ajy
常に矢印が出ているなら制限時間を設けても良かったかもしれない。
今回座標の取得はなかなか上手く行ったとは思うけど、敵が大量に出て来るようなゲームの場合は他の方法を考えないといけない気がする。
まだまだ学ぶことが多いなあと感じた。