类和模块以及Lua,天哪



我正在用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 的模块中。 我最初的计划是创建一个功能敌人。Move() 在 enemy.lua 这将做这个确切的事情,然后返回更新的 enemyTable。 然后 main.lua 中的代码将是这样的:

enemyTable = enemy.Move(enemyTable)

我更喜欢的是这样的:

enemyTable.Move()

。但我不确定在 Lua 中是否有任何方法可以做到这一点? 有人对如何实现这一目标有任何建议吗?

听起来你只是希望enemyTablemetatableenemy模块表。Lua 5.1 元表的参考手册条目

像这样的东西。

敌人.lua

local enemy = {}
function enemy:move()
    for _, bat in ipairs(self) do
        ....
    end
end
return enemy

主.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()

当然可以做到。对于我所看到的,您的 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()

最新更新