首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LUA:避免通过引用

LUA:避免通过引用
EN

Stack Overflow用户
提问于 2018-11-13 20:49:46
回答 3查看 187关注 0票数 1

我刚刚开始学习LUA,我有一个问题,我不知道如何“正确”解决。当我将一个Defold vmath.vector3传递给我的函数时,它似乎是通过引用传递的,因此是修改的。

如果我把它乘以任何东西,这个问题就解决了。

还有其他更正确的方法来解决这个问题吗?我不想修改作为参数传递的原始向量。

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-11-13 23:20:34

由于您将xy作为两个值返回,所以可以以相同的方式实现两个分支,而无需修改任何表:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2018-11-14 05:17:35

Defold提供了一些在游戏开发中非常有用的特殊数据结构:

  • vector3 - vmath.vector3(x,y,z),用于描述三维坐标系中的位置或方向
  • vector4 - vmath.vector4(x,y,z,w),用于颜色,色调等(红色,绿色,蓝色,α)
  • quat - vmath.quat()描述旋转的四元数
  • matrix4 - vmath.matrix4()值的4x4矩阵。除其他外,对视图和投影矩阵有用

所有这些都是Defold游戏引擎使用的,但是您也可以在其他游戏引擎中找到相同的数据结构。

上面的数据结构有一个共同点:它们是Lua类型的userdata

代码语言:javascript
复制
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'

票数 3
EN

Stack Overflow用户

发布于 2018-11-13 21:36:04

在您的else分支中已经有了一个解决方案:在对它们应用“修改”操作之前,您必须创建一个向量的副本。

在其他选项方面,可能会想出一种使用代理表的方法,但它将比创建副本复杂得多。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53289289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档