我正在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有没有办法做到这一点?有没有人对如何做到这一点有任何建议?
答案 0 :(得分:3)
听起来您只希望metatable
的{{1}}成为enemyTable
模块表。 Lua 5.1 reference manual entry for metatables
像这样。
enemy
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()