Questo codice può essere applicato per PhysicsBody2D ereditati da KinematicBody2D e RigidBody2D (quest'ultimo con l'accortezza di rendere true
il parametro collision_monitor
e determinare il numero di collisioni che si vogliono rilevare)
E' comunque possibile rilevare le collisioni sia con le funzioni che i Body2D implementano, sia con i segnali che questi emettono (come ad esempio body_entered
)
KinematicBody2D
Se il corpo si muove attraverso la funzione move_and_slide
è possibile ottenere una o più collisioni attraverso il metodo get_slide_collision
in questa maniera:
for i in get_slide_count():
var collision = get_slide_collision(i)
print("Collided with: ", collision.collider)
dove il collision
è un generico KinematicCollision2D e collider
è il risultato della collisione, in forma generica Object
, che nel caso di una tilemap sarà esattamente TileMap
.
Nel caso di movimento con move_and_collide
la funzione restituirà sempre un KinematicCollision2D.
In entrambi i casi, possiamo conservare il nostro collision in una variabile generica
var collision_entity : KinematicCollision2D = collision
Possiamo poi passare attraverso una funzione o emettendo un segnale il nostro collision: get_colliding_tile(collision_entity)
Nel caso di collision non nullo
func get_colliding_tile(collision : KinematicCollision2D) -> int:
var collider_entity
if collision.get_collider() is TileMap:
# ottengo il collider
collider_entity : TileMap = collision.get_collider()
# dal momento che è una TileMap posso chiamare i suoi metodi
var world_tile_position : Vector2 = collider_entity.world_to_map(Player.get_position())
# la posizione reale del tile è quella che si trova sotto il nostro corpo
var colliding_tile_position : Vector2 = world_tile_position - collision.get_normal()
# ritorno l'indice del tile, che è un int
return collider_entity.get_cellv(colliding_tile_position)
RigidBody2D
Con le accortezze elencate precedentemente, lo stesso metodo può essere usato chiamando la funzione get_colliding_bodies()
, che restituisce un Array la cui dimensione è pari al numero di collisioni massimo che abbiamo impostato sul corpo, e che contiene i corpi di collisione.