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()関数で、今衝突しているKinematicCollision2Dcollisionとして取得しているものを処理するコードになっています。

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

Gamemaker Studio2からGodot Engineにエンジン移行しました
あれだけ好きだったGamemaker Studio2ですが、今回思い切ってGodot Engineに乗り換えました。 いろんな理由があるのですが、...