我在使用metatable为游戏创建新怪物时遇到问题,我可以创建一个精确的副本,但我不能生成一个新的鼠或蜥蜴,例如使用新的id。
local monsters = {
rat = {
name = "a rat",
id = 1,
health = 5,
}
lizard = {
name = "a lizard",
id = 1,
health = 8,
}
}
local metamonsters = {__index = monsters}
setmetatable(monsters, metamonsters)
function monsters:new(o)
setmetatable(o, metamonsters)
return o
end
local testrat = monsters:new({rat})
print(testrat.name, testrat.id)
这会在变量testrat下创建一个新鼠,控制台会打印“a rat”和“1”。我无法弄清楚如何为鼠标创建时指定新的ID号。任何帮助将不胜感激,metatables让我感到困惑!
答案 0 :(得分:1)
您需要从Lua中的类如何工作的基础知识开始:
实例object
有一个元表meta
,其中包含所有元方法,特别是__index
。
当__index
中的查找无法找到查找键时,始终会调用object
元方法。
实际上,它不一定是一个函数,另一个表也是可以接受的,我们有一个理想的候选者:meta
。
这个查看元表中__index
是否有密钥条目的游戏可以重复:
因此,通用monster
可以是rat
的元表,它可以是所有大鼠的元表。
如果需要,可以进行更多更深入的继承。
protos = {}
monsters = {}
protos.monster = {
name = 'generic monster',
bp = 'monster',
health = 1,
__call = function(self, new, proto)
if proto then
proto = protos
protos[new.bp] = new
protos[new.name] = new
else
proto = monsters
end
table.insert(proto, new)
new.id = #protos
return setmetatable(new, self)
end
}
protos.monster.__call(nil, protos.monster, true)
protos.monster({
name = "a rat",
short = 'rat',
health = 5,
}, true)
protos.rat({
name = "a black rat",
short = 'blackrat',
health = 7,
}, true)
使用
创建一个新怪物protos[type] { --[[ some stats here ]] }
使用
创建一个新原型protos[type]({ --[[ some stats here ]] }, true)
Lua手册:http://www.lua.org/manual/5.2/
Lua-users wiki(示例代码):http://lua-users.org/wiki/SampleCode