Как работать с таблицами в Corona SDK - PullRequest
1 голос
/ 02 февраля 2012

У меня есть своего рода общий вопрос, но я думаю, что, если бы я попытался быть слишком конкретным, это только запутало бы меня. В общем, я хочу знать следующее:

Когда вы создаете таблицу в Corona / Lua, вы можете поместить в нее неограниченное количество вещей, верно?

Итак, я создаю таблицу с именем

   rectangles = {};

и затем я положил в него несколько экземпляров прямоугольников. Если бы я хотел изменить свойство ВСЕХ прямоугольников сразу, как я мог это сделать?

Я понимаю, как это будет работать с заданным количеством элементов в таблице, например:

    for i = 1, 10 do 
        rectangles[i] = display.newImage("rectangle.png");

затем, чтобы изменить все изображения x, например, вы просто скажете

     rectangles[i].x = 20;

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

Ответы [ 2 ]

4 голосов
/ 02 февраля 2012

Для массивов, которые имеют только один вид элементов, вы можете использовать #rectangles для количества элементов.

for i = 1, #rectangles do 
        rectangles[i] = display.newImage("rectangle.png");
end

Относительно примера youtube ,

если вы добавите элемент в rectangles следующим образом:

rectangles[b]=b;

что он на самом деле делает

rectangles["083DF6B0"]=b"

вы видите, когда экранный объект b используется в качестве ключа, он преобразуется в шестнадцатеричную строку.

Кроме того, вам нужно будет использовать pairs, чтобы просмотреть каждый элемент, поскольку они
ключи (например, array.length, array.width, array.weight ..), а не индекс (например, array [2], array [3] ..)

for key,value in pairs(rectangles) do
    print(key); --prints 083DF6B0
    print(value); --prints 20
    rectangles[key]=30;
end
2 голосов
/ 02 февраля 2012

Это зависит от того, как вы храните предметы в таблице.Если вы храните по индексу (как в вашем примере), вы можете использовать ipairs для перебора индексов и значений:

for index,value in ipairs(rectangles) do
    value.x = 20
    --or
    rectangles[index].x = 20
end

Если вы сохраняете по ключу (как ввидео YouTube, которое вы упоминаете в комментарии), итерируйте, используя пар :

for key,value in pairs(rectangles) do
    value.x = 20
    --or
    rectangles[key].x = 20
end

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

...