Как я могу использовать queue_free () с Area2D - PullRequest
0 голосов
/ 07 мая 2019

Когда объект входит в Area2D, я ожидаю, что входящий объект будет удален, но ничего не происходит

Я пробовал queue_free (area) и Area2d.queue_free ()

func _on_Area2D_area_entered(area):
    queue_free()
    area.queue_free

Как сказано выше, ничего не происходит, когда объект входит в Area2d

1 Ответ

0 голосов
/ 11 мая 2019

Хорошо. Я сделал простой проект для проверки столкновения и процесса queue_free() в отношении взаимодействия между KinematicBody и Area2D. По сути, Area2D - это объект, который обнаруживает и сигнализирует о столкновении (KinematicBody может вызвать столкновение, но не может его обнаружить). Следовательно, до Area2D можно обнаружить, когда тело вступило (или в этом случае, когда оно входит в тело), ​​и затем оно может сигнализировать о столкновении, которое затем вызывает функцию _on_Area2D_body_entered в другом объекте, и затем выполняет queue_free() в соответствии с инструкциями.

Настройка моего узла выглядит следующим образом:

Node2D
|_Area2D - (SIGNAL ATTACHED - "_on_body_entered()" - CONNECTED TO KINEMATIC BODY)
|   |_Sprite
|   |_CollisionShape2D
|
|_KinematicBody2D
    |_Sprite
    |_CollisionShape2D

Для моего испытания объект Area2D расположен на той же горизонтальной оси и слева от KinematicBody

СЦЕНАРИЙ, ПРИЛОЖЕННЫЙ К ОБЛАСТИ:

extends Area2D

func _ready():
    pass 

func _process(delta):
    self.position.x += 1  #So it moves into and collides with other object.

СЦЕНАРИЙ, СВЯЗАННЫЙ С КИНЕМАТИЧЕСКИМ ТЕЛО:

extends KinematicBody2D

func _ready():
    pass 

func _on_Area2D_body_entered(body): # This is called when Area2D detects a collision
    queue_free()
    print("HIT!!!!!") #To doubly confirm the collision is recognized

К сожалению, так и должно быть. Поскольку Area2D является единственным объектом в этом сценарии, который способен обнаруживать и сигнализировать о столкновении, он не может быть приказан самому queue_free(), так как Годо выдает ошибку при попытке сделать это.

В качестве альтернативы, однако, если вы хотите, чтобы это было наоборот - для KinematicBody нужно двигаться к объекту Area2D и удалять себя при ударе. просто переместите весь дельта-процесс из сценария Area2D и поместите его в сценарий KinematicBody над _on_Area2D_body_entered(body) и измените self.position.x на -= 1. Оставьте сигнал на Area2D.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...