es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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:

Imagen

¿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?

Tags:  , , ,

Answer

  1. Avatar for 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():

    # Highlighter.gd
    
    extends Area2D
    
    var highlighted_area
    
    func _on_Highlighter_body_entered(body):
        if body is Tile:
            highlighted_area = body
    
    func _on_Highlighter_body_exited(body):
        if body is Tile:
            highlighted_area = null
    

    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.

Comments are closed.