lua metatable帮助(在游戏中产生怪物)

时间:2014-10-02 17:26:16

标签: lua metatable

我在使用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让我感到困惑!

1 个答案:

答案 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