[英]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有没有办法做到这一点? 有没有人对如何做到这一点有任何建议?
听起来像是你只想metatable
的enemyTable
是enemy
模块表。 Lua 5.1 metatables参考手册
像这样的东西。
local enemy = {}
function enemy:move()
for _, bat in ipairs(self) do
....
end
end
return enemy
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.