Изменение переменной Player в зависимости от текущего столкновения

Я пытаюсь изменить скорость передвижения игрока в зависимости от того, в кустах он или нет. Это суть того, что я пытаюсь достичь:

const Grass = preload("res://World/Grass/Grass.tscn")
onready var grass = Grass.instance()

func move():
    grass = Grass.instance()
    if grass.player_in_grass():
        velocity = move_and_slide(velocity / BUSH_FRICTION_MULTIPLIER)
    else:
        velocity = move_and_slide(velocity)

Проблема, с которой я столкнулся, заключается в том, что я не могу понять, каким должен быть код для проверки. Я попытался создать зону обнаружения игрока для травы, переключая ее значение внутри нее:

var player = null

func player_is_visible():
    return player != null

func _on_PlayerDetectionZone_body_entered(body):
    player = body

func _on_PlayerDetectionZone_body_exited(body):
    player = null

А мой Grass.gd выглядит так:

onready var playerDetectionZone = $PlayerDetectionZone

func player_in_grass():
    if playerDetectionZone.player != null:
        return true
    else:
        return false

После всего этого у меня появляется ошибка:

Invalid get index 'player' (on base: 'Nil').

Ошибка перенаправляет меня на «if playerDetectionZone.player! = Null:».

Что я делаю неправильно? Следует ли мне проверять это / делать это другим, более простым способом, о котором вы знаете? Все отзывы приветствуются. Спасибо.


person StolaDev    schedule 19.06.2020    source источник
comment
Не хватает информации. По крайней мере, нам нужно место, где возникает эта ошибка. Но было бы лучше использовать полный стек вызовов.   -  person Strick    schedule 19.06.2020
comment
Какая у вас зона PlayerDetectionZone? Я предполагаю, что это Area2D, но я не совсем уверен.   -  person Putnam    schedule 19.06.2020
comment
@Putnam - это действительно Area2D.   -  person StolaDev    schedule 20.06.2020
comment
@Strick - Это происходит, когда я пытаюсь запустить игру. Затем он направляет меня: if playerDetectionZone.player! = Null: Сообщать мне об этой ошибке выше.   -  person StolaDev    schedule 20.06.2020
comment
Строка if playerDetectionZone.player! = Null не отображается в опубликованном вами коде, что затрудняет предложение. Я все равно попробую ответить.   -  person Strick    schedule 20.06.2020
comment
@Strick Извинения, я обновил оригинал. Спасибо!   -  person StolaDev    schedule 20.06.2020


Ответы (1)


Подвести итог:

Ошибка

Недопустимый индекс получения "игрок" (на основе "ноль").

И строка кода, в которой возникает эта ошибка:

if playerDetectionZone.player != null:

(который, к сожалению, не является частью опубликованного кода).

Эта ошибка означает, что переменная playerDetectionZone имеет значение null. Предполагая, что остальная часть кода соответствует опубликованной, проблема должна быть расположена здесь:

onready var playerDetectionZone = $PlayerDetectionZone

Что-то не так с путем к узлу ($ PlayerDetectionZone). Орфография, заглавные буквы, возможно, неправильное положение в дереве. Может быть несколько вещей.

Изменить: на основе вашего комментария, вероятно, неправильное положение в дереве. Строка выше работает только в том случае, если узел PlayerDecetionZone является дочерним узлом узла grass (к которому прикреплен grass.gd).

person Strick    schedule 19.06.2020
comment
Это то, о чем я думал. Я пытаюсь повторно использовать тот же экземпляр PlayerDetectionZone из другого места, возможно, в этом проблема. Я выложу с обновлением. - person StolaDev; 20.06.2020