类和模块和Lua,我的

时间:2016-06-02 17:46:59

标签: class module lua love2d

我正在Lua的一个游戏中工作,到目前为止,我在一个文档中处理了所有内容。然而,为了更好地组织所有事情,我决定将其扩展为模块,虽然我认为我可能会让它或多或少地起作用,但我认为现在可能是一个让事情变得更清晰的机会。优雅。

一个例子是敌人和敌人的运动。我有一个名为enemyTable的数组,这里是Update中移动每个敌人的代码:

    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.Move()在enemy.lua里面做这个确切的事情,然后返回更新的enemyTable。那么main.lua中的代码就像是:

enemyTable = enemy.Move(enemyTable)

我更喜欢的是:

enemyTable.Move()

...但我不确定在Lua有没有办法做到这一点?有没有人对如何做到这一点有任何建议?

2 个答案:

答案 0 :(得分:3)

听起来您只希望metatable的{​​{1}}成为enemyTable模块表。 Lua 5.1 reference manual entry for metatables

像这样。

enemy.lua

enemy

main.lua

local enemy = {}

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

return enemy

答案 1 :(得分:1)

当然你可以做到。对于我所看到的,您的Move函数处理您将其作为参数传递的表,并以函数编程方式返回另一个表,使第一个表不变。您只需设置Move函数,以便它知道它必须在enemy表上运行,而不是创建新表。所以在你的模块中写:

local enemy = {}

-- insert whatever enemy you want in the enemy table

function enemy.Move()
    for _, bat in ipairs(enemy) do
        --operate on each value of the enemy table
    end
    --note that this function doesn't have to return anything: not a new enemy table, at least
end

return enemy

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

enemyTable = require "enemymodule"

然后你只需要致电enemyTable.Move()