【问题标题】:How do I iterate code over objects in a table in lua?如何在 lua 表中的对象上迭代代码?
【发布时间】:2016-11-20 10:18:04
【问题描述】:

我正在尝试编写一个执行视差滚动的代码。 “pieces”表中的所有精灵都需要射向空中,然后将它们的位置重置为 y=200 和 x=randomnumber。稍后,我将根据它们移动的速度使它们变小或变大以获得真正的 3D 效果。

这是一个天真的尝试:

local speed = math.random(250,1000)
pieces = { "sprite", "sprite1", "sprite2", "sprite3", "sprite4",
"sprite5", "sprite6", "sprite7", "sprite8", "sprite9", "sprite10",
"sprite11", "sprite12", "sprite13", "sprite14", "sprite15" } 

function update(self, dt)
    for i, v in ipairs(pieces) do
        p = go.get_position(v)
        p.y = p.y + speed * dt
        print(v)
            if p.y > 800  then
            p.y = -200
            p.x = math.random(1,25) * math.random(10,35)*2
            local speed = math.random(250,1000)
        end
        go.set_position(v)
    end
end

如果我在 ipairs 中打印“v”,我会得到所需的输出(sprite、sprite1、sprite 等),所以我认为我上面的内容会起作用。它没有。有什么帮助吗?

【问题讨论】:

  • 嗯,你想循环它 - 它循环正常,打印 v 显示它。你必须解释你想要什么以及你得到什么。 “它不起作用”不是解释。如果它不改变'速度' - 那是因为你在'if p.y> 800'分支内声明局部变量'速度',所以如果该分支外部不使用新的随机值。如果以其他方式不起作用,您将不得不解释。
  • 你是对的。我忘了说具体问题是 p = go.get_position(v) 给出了错误消息。我相信我没有正确引用该对象。
  • 那是什么?我假设它是 game_objects 的集合,由您在“pieces”数组中的名称索引。但它在您的样本中的什么位置?它有函数 get_position()/set_position() 吗?这些是如何定义的?
  • go 代表游戏对象(在 Defold 中)。 go.get_position(a) 获取名为“a”的对象的位置。如果我放 go.get_position(".") 代码可以正常工作(但它会移动脚本附加到的对象,因为 "." = self)。问题肯定出在 go.get_position(v) 引用 v 的方式上。我认为它得到了“sprite”这个词而不是实例“sprite”(或类似的东西),但我不知道如何引用该对象而不是这个词。感谢您迄今为止的帮助。
  • Defold 手册说你可以在调用 get_position 时将字符串作为对象的 id 传递,所以至少在这里它是正确的。您是否已经创建了所有这些对象?你是在 Defold 中运行脚本,还是在它之外进行测试?确切的错误信息是什么?

标签: lua lua-table defold


【解决方案1】:

这是我发现的正确代码。如果有人看到这个并需要解释,请告诉我。

local speed = math.random(250,1000)
--pieces = { "sprite1", "sprite2", "sprite3", "sprite4", "sprite5", "sprite6", "sprite7", "sprite8", "sprite9", "sprite10", "sprite11", "sprite12", "sprite13", "sprite14", "sprite15" } 
pieces = { "go1", "go2", "go3" } 

function update(self, dt)
    for i, v in ipairs(pieces) do
        p = go.get_position(v)
        p.y = p.y + speed * dt
        if p.y > 800  then
            p.y = math.random(200,800)/-1
            p.x = math.random(1,25) * math.random(10,35) * 2
            local speed = math.random(250,1000)
            go.set_position(p, v)
            else
            go.set_position(p, v)
        end 
    end
    end

【讨论】:

  • 提示:您可以存储对象的 id:s:pieces = { go.get_id("go1"), go.get_id("go2"), go.get_id("go3") },而不是在pieces 表中存储字符串。对于您进行大量迭代的情况,这可以节省从字符串到 id(哈希)的查找,否则引擎每次都必须这样做。
猜你喜欢
  • 2011-12-14
  • 1970-01-01
  • 2012-10-29
  • 2012-09-15
  • 2019-09-17
  • 1970-01-01
  • 1970-01-01
  • 2017-05-11
  • 1970-01-01
相关资源
最近更新 更多