我正在用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 中是否有任何方法可以做到这一点? 有人对如何实现这一目标有任何建议吗?
听起来你只是希望enemyTable
的metatable
是enemy
模块表。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()