LUA: избегать прохождения по ссылке - PullRequest
0 голосов
/ 13 ноября 2018

Я только начинаю изучать LUA, и у меня есть проблема, которую я не уверен, какой способ «правильно» решить.Когда я передаю Defold vmath.vector3 своей функции, он, кажется, передается по ссылке и, следовательно, изменяется.
Если я умножу его на что-либо, это будет решено, однако.
Есть ли другой более правильный способ решить эту проблему?Я не хочу изменять исходный вектор, который передаю в качестве аргумента.

function M.get_nearest_tile(x, y)
    if y then -- if we've got 2 inputs, use x & y
        x = math.floor(x / M.TILE_SIZE)
        y = math.floor(y / M.TILE_SIZE)
        return x, y
    else -- if we've only got 1 input, use as vector
        local vec = x * 1 -- multiplying by 1 to avoid modifying the real vector
        vec.x = math.floor(vec.x / M.TILE_SIZE) 
        vec.y = math.floor(vec.y / M.TILE_SIZE) 
        return vec.x, vec.y
    end
end

Ответы [ 3 ]

0 голосов
/ 14 ноября 2018

Поскольку вы возвращаете x и y как два значения, вы можете реализовать обе ветви одинаково без изменения каких-либо таблиц:

function M.get_nearest_tile(x, y)
    local newX, newY
    if y then -- if we've got 2 inputs, use x & y
        newX = math.floor(x / M.TILE_SIZE)
        newY = math.floor(y / M.TILE_SIZE)
    else -- if we've only got 1 input, use as vector
        newX = math.floor(x.x / M.TILE_SIZE)
        newY = math.floor(x.y / M.TILE_SIZE)
    end
    return newX, newY
end
0 голосов
/ 14 ноября 2018

Defold предоставляет ряд специальных структур данных, которые очень полезны при разработке игр:

  • vector3 - vmath.vector3 (x, y, z), полезный для описания позиций или направления в трехмерной системе координат
  • vector4 - vmath.vector4 (x, y, z, w), используется для цвета, оттенка и т. Д. (Красный, зеленый, синий, альфа) * ​​1006 *
  • quat - vmath.quat () кватернион, описывающий вращение
  • matrix4 - vmath.matrix4 () матрица значений 4x4. Полезно для просмотра и проекции матриц между прочим

Все вышеперечисленное используется игровым движком Defold, но вы также найдете такие же структуры данных в других игровых движках.

Приведенные выше структуры данных имеют одну общую черту: они относятся к типу Lua userdata

print(type(vmath.vector3())) -- "userdata"

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

local copy = vmath.vector3(original) -- copy the vector3 'original' local copy = vmath.vector4(original) -- copy the vector4 'original' local copy = vmath.quat(original) -- copy the quaternion 'original' local copy = vmath.matrix4(original) -- copy the matrix4 'original'

0 голосов
/ 14 ноября 2018

У вас уже есть решение в вашей ветви else: вам придется создать копию ваших векторов, прежде чем применять к ним «модифицирующие» операции.

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

...