Таблицы Lua проверяют, соответствует ли какая-либо переменная какому-либо значению

В Lua (Codea на iPad) я сделал программу, в которой есть четыре пары координат XY, и они помещены в таблицы под одним и тем же идентификатором (count = count + 1). Когда я впервые протестировал код, используя только одну пару, чтобы определить, когда координаты XY касаются одной из координат в таблице (где координаты уже были). Я сделал это, используя этот фрагмент кода:

if (math.abs(xposplayer - posx) < 10) and (math.abs(yposplayer - posy) < 10) and id < (count - 10) then

Этот фрагмент кода воспроизводится в этом цикле:

for id,posx in pairs(tableposx) do
posy = tableposy[id]

Это сработало так, как я хочу!

Но теперь у меня есть 8 таблиц (tableposx1 tableposy1, ...). И я хотел бы проверить, касаются ли какие-либо текущие координаты каких-либо координат в любой из таблиц (когда-либо), поэтому я попытался:

for id,posx1 in pairs(tableposx1) do
posy1 = tableposy1[id]
posy2 = tableposy2[id]
posx2 = tableposx2[id]
posy3 = tableposy3[id]
posx3 = tableposx3[id]
posy4 = tableposy4[id]
posx4 = tableposx4[id]

И этот бит четыре раза (для четырех текущих координат)

if ((math.abs(xposplayer1 - posx1) < 10) and (math.abs(yposplayer1 - posy1) < 10))
or ((math.abs(xposplayer1 - posx2) < 10) and (math.abs(yposplayer1 - posy2) < 10))
or ((math.abs(xposplayer1 - posx3) < 10) and (math.abs(yposplayer1 - posy3) < 10))
or ((math.abs(xposplayer1 - posx4) < 10) and (math.abs(yposplayer1 - posy4) < 10))
and (id < (count - 10))

Но это всегда (почти) сбывается. И поскольку иногда значения в таблице равны NIL, это выдает мне ошибку, говорящую, что не может сравнить что-то с нулевым значением.

Заранее спасибо, Лоран


person Laurent    schedule 10.01.2013    source источник


Ответы (2)


Вероятно, вам следует организовать эти значения с помощью таблиц. Используйте таблицу для позиций, которая содержит ряд таблиц «координат». таким образом, вы можете перебирать все координаты с помощью цикла for и быть уверенным, что каждый элемент в таблице представляет пары координат, для которых вы можете написать несколько общих функций для проверки достоверности.

function GetNewCoords(x_, y_)
    x_ = x_ or 0
    y_ = y_ or 0
    return { x = x_, y = y_}
end

function CoordsAreValid(coords)
    if (coords == nil) return false
    return coords.x ~= 0 or coords.y ~= 0
end

local positions = {}
table.insert(positions, GetNewCoords(5, 10))
table.insert(positions, GetNewCoords(-1, 26))
table.insert(positions, GetNewCoords())
table.insert(positions, GetNewCoords(19, -10))

for _, coords in pairs(positions) do
    if (CoordsAreValid(coords)) then
        print(coords.x, coords.y)
    end
end
person Mike Corcoran    schedule 10.01.2013

Начните с удаления кода копирования и вставки. Используйте что-то вроде posy[n] вместо posy1, posy2... И то же самое для другого: tableposy[n][id] вместо tableposy1[id]..

После этого вы можете использовать циклы для сравнения в одной строке. И вы можете преобразовать сравнение в функцию, в которой вы выполняете nil проверку перед сравнением.

person vertti    schedule 10.01.2013
comment
Можете ли вы привести пример такого цикла и так называемой «нулевой проверки»? - person Laurent; 10.01.2013