繁体   English   中英

类和模块和Lua,哦,我的

[英]Classes and modules and Lua, oh my

我正在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有没有办法做到这一点? 有没有人对如何做到这一点有任何建议?

听起来像是你只想metatableenemyTableenemy模块表。 Lua 5.1 metatables参考手册

像这样的东西。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM