Skip to content

Instantly share code, notes, and snippets.

@fenix-hub
Last active August 19, 2022 15:02
Show Gist options
  • Save fenix-hub/ef11705ce6ba290751ed45664e899fdd to your computer and use it in GitHub Desktop.
Save fenix-hub/ef11705ce6ba290751ed45664e899fdd to your computer and use it in GitHub Desktop.

TileMap Collision Detection Script

Collision detection .gd script for 2D bodies and tilemaps

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment