Как мне избежать создания нулевой ссылки в Lua при удалении элемента из таблицы?

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

Проблема, с которой я столкнулся, заключается в отслеживании объектов пиццы, с которыми взаимодействует игрок. Я создал таблицу для хранения пиццы, где элемент с первым индексом - это текущая пицца - та, к которой игрок может добавлять начинку. Чтобы сэкономить память, я подумал об удалении пиццы по первому индексу (table.remove (pizzas, 1)), когда она покидает экран. Однако это приводит к ошибке «попытка проиндексировать нулевое значение», что, как я предполагаю, связано с тем, что у меня есть несколько ссылок на элемент по первому индексу (например, для отслеживания позиции, пиццы [1] .x или чтобы следить за сыром, у меня есть пицца [1] .cheeseCount). Как мне этого избежать? Огромное спасибо!


person viviah    schedule 26.05.2020    source источник
comment
как перейти к следующей пицце?   -  person Nifim    schedule 27.05.2020
comment
@Nifim Я установил pizzas [1] = pizzas [2], затем удалил первый элемент с помощью table.remove (pizzas, 1).   -  person viviah    schedule 27.05.2020
comment
когда вы вызываете table.remove, он переупорядочивает ваш массив за вас. не нужно устанавливать pizzas[1] = pizzas[2] lua.org/pil/19.2.html   -  person Nifim    schedule 27.05.2020


Ответы (1)


https://www.lua.org/manual/5.3/manual.html#pdf-table.remove

table.remove (список [, позиция])

Удаляет из списка элемент в позиции pos, возвращая значение удаленного элемента. Когда pos является целым числом от 1 до #list, он сдвигает вниз список элементов [pos + 1], list [pos + 2], ···, list [#list] и стирает список элементов [#list]; Индекс pos также может быть 0, если #list равен 0, или #list + 1; в этих случаях функция стирает список элементов [pos].

Значение pos по умолчанию - #list, так что вызов table.remove (l) удаляет последний элемент списка l.

Таким образом, ваша проблема, скорее всего, не в том, что вы индексируете первую (удаленную) пиццу, а в том, что вы индексируете пиццу, которая была сдвинута вниз и, следовательно, больше не существует в своем исходном индексе.

local pizzas = {"A", "B", "C"}
table.remove(pizzas, 1)

теперь ваша таблица выглядит так: {"B", "C"}

и pizzas[3] будет nil.

person Piglet    schedule 27.05.2020