generated at
Godot3 プレイヤーショットでタイルマップのコリジョンタイルを破壊


かなり苦戦
無理やり解決した気がする。もっといい方法があると思うのだが...
TimeMapを、 Ground Breakble にレイヤー分け
Breakble レイヤー側に、コリジョンを持つタイルを設置する
PlayerBullet のコリジョンを狭く調整
このコリジョン範囲が大きいと、衝突したタイルマップの位置がずれてうまくいかなかったので
PlayerBullet のbody_enteredシグナルで、 breakble_tile との接触をチェック
PlayerBullet.py
func _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) でタイルを無くしている
半壊状態のスプライトを用意したい場合は、もっと調整する必要あり。オートタイルを使う?