Godot3 プレイヤーショットでタイルマップのコリジョンタイルを破壊
かなり苦戦
無理やり解決した気がする。もっといい方法があると思うのだが...
TimeMapを、 Ground
と Breakble
にレイヤー分け
Breakble
レイヤー側に、コリジョンを持つタイルを設置する
PlayerBullet
のコリジョンを狭く調整
このコリジョン範囲が大きいと、衝突したタイルマップの位置がずれてうまくいかなかったので
PlayerBullet
のbody_enteredシグナルで、 breakble_tile
との接触をチェック
PlayerBullet.pyfunc _on_PlayerBullet_body_entered(body):
if body.is_in_group("breakble_tile"):
# position は弾の位置
# Vector2(8,0)は、弾SpriteのOffset
# TimeMapがスクロールしているので、body.global_positionでその差分を吸収
var map_pos = body.world_to_map(position + Vector2(8,0) - body.global_position)
if body.get_cellv(map_pos) == -1:
print("タイルマップを取得できなかった")
return
body.set_cellv(map_pos, -1)
queue_free()
今回の実装では、縦スクロールでタイルマップの座標を動かしているので、動的に座標を取得する処理が複雑になった
スクロールを無くしたら簡単に解決するのだが、スクロールは必須条件のためなくせない。
これでGIF画像のようにプレイヤーショットでタイルマップが壊れるようになった
body.set_cellv(map_pos, -1)
でタイルを無くしている
半壊状態のスプライトを用意したい場合は、もっと調整する必要あり。オートタイルを使う?