object.hide () не скрывает полное кинетическое тело в Godot

Я пытаюсь написать игру в Godot 3, в которой мой персонаж может собирать определенные предметы. В тот момент, когда персонаж их собирает, т. Е. Сталкивается с ними, объект исчезает и добавляется в массив.

При этом мне удалось заставить объект исчезнуть, но каким-то образом область, вокруг которой существовал объект, все еще недоступна для ходьбы - в том смысле, что объект столкновения объекта кинематического тела каким-то образом все еще функционирует, и я не хочу чтобы он все еще был там.

Этот GIF объясняет проблему:

Проблемный GIF

Код столкновения -

for body in $hitbox.get_overlapping_bodies():
    if(body.get("type")!= "prota"):
        if body.get("type")=="ingredient":
            inventory.add_to_inventory(body, body.get("type"), "collect")

Функция Inventory.add_to_inventory -

func add_to_inventory(the_item, item_type, cause):
    if item_type=="ingredient":
        if cause=="collect":
            inventory_ingredients.append(the_item)
            the_item.hide()

Приведенный выше фрагмент добавляет элемент в мой массив по мере необходимости. Он также скрывает объект, но объект столкновения все еще существует.

Структура объекта столкновения (Ананас):

введите здесь описание изображения

Размещение предметов на моем LevelL

введите здесь описание изображения

Текстура Sprite загружается с помощью кода и не добавляется вручную.

get_node("Pineapple").get_node("Display").set_texture(pineapple)

Любая помощь по этому поводу будет оценена по достоинству. При необходимости я готов предоставить более подробную информацию. У меня очень мало опыта в программировании, и, возможно, я тоже делал ошибки новичка!


person Mana    schedule 17.12.2019    source источник


Ответы (1)


hide только делает Node и его дочерние элементы невидимыми, это никоим образом не меняет поведение физики. Если вы хотите полностью избавиться от объекта, вызовите _ 3_. Если вы хотите, чтобы Node сохранялась, но не вызывала коллизий, вы можете установить _ 5_ на CollisionShape.

person rcorre    schedule 18.12.2019
comment
Большое спасибо! Это было очень ясно, и я узнал кое-что новое. - person Mana; 18.12.2019
comment
Заметьте, я ошибочно сказал free, но имел в виду queue_free (сейчас редактируется). Вы почти всегда хотите использовать queue_free вместо бесплатного, см. Связанные документы для получения дополнительной информации. - person rcorre; 18.12.2019
comment
Использование отключенной функции сработало для меня. Я проверил как queue_free, так и free, но каким-то образом они удаляют существование объекта даже в массиве, в который я их добавил. Как предотвратить это при использовании queue_free? - person Mana; 20.12.2019
comment
Вы этого не сделаете. Используйте queue_free только в том случае, если вы хотите полностью избавиться от объекта. В некоторых случаях это то, что вам нужно. - person rcorre; 20.12.2019