Godot Engineの学習メモ「タイル衝突の検出」

Godot Engineにお熱のSaitosです。
惚れるでコレェ!って機能や発見をメモしていこうと思います。
タイル検出
実はタイル(の編集)機能はそこまで目立ってすごい!ってことはないんですが、それよりも「あぁ、いい…」とため息を漏らした部分は、 タイルの検出機能です。
まずはコードを見てみます。
# Confirm the colliding body is a TileMap
if collision.collider is TileMap:
# Find the character's position in tile coordinates
var tile_pos = collision.collider.world_to_map(position)
# Find the colliding tile position
tile_pos -= collision.normal
# Get the tile id
var tile_id = collision.collider.get_cellv(tile_pos)
via: KidsCanCode
かなりシンプルですね。
コードの内容をざっくり紐解きます。
まず、このコードはKinematicBody2D
のキャラクターに書かれたコードです。
少し省かれていますが、get_slide_collision()
関数で、今衝突しているKinematicCollision2D
をcollision
として取得しているものを処理するコードになっています。
collision.collider is TileMap
はTileMapとしてのコリジョンかどうかの判定です。
もしそうなら、現在キャラクターの居る座標のタイル座標をcollision.collider.world_to_map(position)
で取得しています。
上記のコードでは型が書いてないのでわかりにくいですがVec2
です。TileMap
クラスの中に含まれる関数で、タイル座標を返します。
tile_pos -= collision.normal
で、衝突時の衝突した方向の法線(collision.normal
)をマイナスする事で、衝突しているタイルの座標を取得しています。
var tile_id = collision.collider.get_cellv(tile_pos)
で、そのタイル座標に存在するタイルIDを取得して完了です。
「これで何ができるのよ?」と思ったかもしれませんが、例えばtile_id
が特定のIDだった場合はダメージを受ける とかいう処理が簡単にできるわけです。
var tile_name = collision.collider.tile_set.tile_get_name(tile_id)
上記のように追記すると、タイルの名前を取得できますので、名前で「ダメージの有無」を判定したりすることもできますね。
KidsCanCodeによる参考動画
まとめ
とりあえず私のプロジェクトでは2Dではないのですが、GridMap
で似たようなことができないか試してみたいですね。
調べれば調べるほど楽しくて、ずっとGodot Engineを触っていたい…。
Related Posts
