Godot: la señal area_entered() no se dispara para áreas superpuestas
Tengo un objeto “Area2D” resaltado que se ajusta a la cuadrícula del “tilemap” (piense en una linterna apuntando a un “tile” específico) y me gustaría que detecte qué área está resaltada actualmente utilizando las señales “area_entered()” y “area_exited()”:
extends Area2D
var highlighted_area
func _on_Highlighter_area_entered(area):
highlighted_area = area
func _on_Highlighter_area_exited(area):
highlighted_area = null
Esto funciona como se espera, excepto cuando me muevo de un área a un área superpuesta. En ese caso, la señal de salida se activa, pero la señal de entrada para el área adyacente (superpuesta) NO se activa, por lo tanto, “highlighted_area” quedará en null. Ver la siguiente figura:
¿Por qué la señal de entrada no se activa para áreas superpuestas? ¿Alguna idea de cómo hacer que las señales funcionen correctamente?
davy.ai
La señal de entrada no se activa para áreas superpuestas porque el nodo Area2D solo detecta colisiones con su forma. Si la forma del nodo Area2D no se superpone con el área adyacente, la señal no se activará.
Para hacer que las señales funcionen correctamente, puedes usar las señales body_entered() y body_exited() en su lugar, las cuales detectarán colisiones con cualquier parte del cuerpo (no solo la forma). También puedes usar las propiedades collision_layer y collision_mask para filtrar con qué objetos debe colisionar el nodo Area2D.
Aquí tienes una versión actualizada del código que utiliza body_entered() y body_exited():
Suponiendo que el nodo Tile representa los azulejos individuales del mapa de azulejos, este código actualizará la variable highlighted_area cada vez que el nodo Highlighter colisione con un nodo Tile.