Как мне избежать создания нулевой ссылки в Lua при удалении элемента из таблицы? - PullRequest
0 голосов
/ 27 мая 2020

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

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

1 Ответ

1 голос
/ 27 мая 2020

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

table.remove (list [, pos])

Удаляет из списка элемент в позиции 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.

...