类、模块和 Lua,哦我的天

我正在用 Lua 开发一款游戏,到目前为止,我已经将所有东西都放到一个文档中并使其能够正常工作。然而,为了更好地组织一切,我决定将其扩展为模块。虽然我想我可以让它更或多或少地工作,但我认为现在可能是一个使事情更清晰、更优雅的机会。

一个例子是敌人和敌人移动。我有一个叫做 enemyTable 的数组,在更新时,下面的代码移动每个敌人:

    for i, bat in ipairs(enemyTable) do
        if bat.velocity < 1.1 * player.maxSpeed * pxPerMeter then
            bat.velocity = bat.velocity + 1.1 * player.maxSpeed * pxPerMeter * globalDelta / 10
        end

        tempX,tempY = math.normalize(player.x - bat.x,player.y - bat.y)

        bat.vectorX = (1 - .2) * bat.vectorX + (.2) * tempX
        bat.vectorY = (1 - .2) * bat.vectorY + (.2) * tempY

        bat.x = bat.x + (bat.velocity*bat.vectorX - player.velocity.x) * globalDelta
        bat.y = bat.y + bat.velocity * bat.vectorY * globalDelta

        if bat.x < 0 then
            table.remove(enemyTable,i)
        elseif bat.x > windowWidth then
            table.remove(enemyTable,i)
        end
    end

这段代码做到了我想要的一切,但现在我想将其移动到一个名为 enemy.lua 的模块中。我的原始计划是在 enemy.lua 中创建一个名为 enemy.Move() 的函数,该函数将执行此功能,然后返回更新后的 enemyTable。然后,main.lua 中的代码将是这样的:

enemyTable = enemy.Move(enemyTable)

我更喜欢的是这样的:

enemyTable.Move()

...但我不确定在 Lua 中是否有任何方法可以实现这一点?有人有什么建议吗?

点赞
用户6245072
用户6245072

当然可以做到。据我所见,您的Move函数会处理您传递给它的表格并返回另一个表格,采用函数式编程方式,让第一个表格不可变。您只需要设置Move函数,使其知晓它必须在您的enemy表格上进行操作,而不是创建一个新表格。因此在模块中编写:

local enemy = {}

-- 在敌人表格中插入任何你想要的敌人

function enemy.Move()
    for _, bat in ipairs(enemy) do
        -- 在每个敌人表格的值上进行操作
    end
    -- 注意这个函数不必返回任何东西:至少不是新的敌人表格
end

return enemy

在您的love.load函数中,您可以调用

enemyTable = require "enemymodule"

然后您只需调用enemyTable.Move()

2016-06-02 18:17:32
用户258523
用户258523

听起来你想让 enemyTable 的元表成为 enemy 模块的表。Lua 5.1 参考手册中的元表条目

像这样。

enemy.lua

local enemy = {}

function enemy:move()
    for _, bat in ipairs(self) do
        ....
    end
end

return enemy

main.lua

local enemy = require("enemy")

enemyTable = setmetatable({}, {__index = enemy})

table.insert(enemyTable, enemy.new())
table.insert(enemyTable, enemy.new())
table.insert(enemyTable, enemy.new())

enemyTable:move()
2016-06-02 21:39:02