Lua元表帮助(在游戏内生成怪物)

我在使用元表为一个游戏创建新的怪物时遇到了问题,我可以复制一个完全相同的怪物,但我无法生成一个新的老鼠或蜥蜴,例如具有新的 ID。

local monsters = {
  rat = {
   name = "一只老鼠",
   id = 1,
   health = 5,
   },
  lizard = {
   name = "一只蜥蜴",
   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 号码用于创建老鼠。任何帮助将不胜感激,元表真让我头疼!

点赞
用户3204551
用户3204551

你需要从 Lua 类如何工作的基础开始:

一个实例 object 拥有一个元表 meta,其中包含了所有的元方法,尤其是 __index

当在 object 中查找失败时,__index 元方法总是被调用。

实际上,它不必是一个函数,另一个表也可以,而我们有一个理想的候选:meta

在元表中查找 __index 是否有一个条目来查找键的过程可以被重复执行:

因此,一个通用的 monster 可以是 rat 的元表,而 rat 可以是所有 rats 的元表。

如果需要,可以进行更多和更深层次的继承。

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 (Sample Code): http://lua-users.org/wiki/SampleCode

2014-10-02 19:17:36