在lua中,能够通过元表来实现类、对象、继承等。与元表相关的方法有setmetatable()、__index、getmetatable()、__newindex。
详细什么是元表在这里就不细说了,网上非常多介绍,这里主要讲与cocos2dx相关联的部分。
在lua-binding库中extern.lua里,有例如以下方法:
--Create an class.
function class(classname, super)
local superType = type(super)
local cls if superType ~= "function" and superType ~= "table" then
superType = nil
super = nil
end if superType == "function" or (super and super.__ctype == 1) then
-- inherited from native C++ Object
cls = {} if superType == "table" then
-- copy fields from super
for k,v in pairs(super) do cls[k] = v end
cls.__create = super.__create
cls.super = super
else
cls.__create = super
end cls.ctor = function() end
cls.__cname = classname
cls.__ctype = 1 function cls.new(...)
local instance = cls.__create(...)
-- copy fields from class to native object
for k,v in pairs(cls) do instance[k] = v end
instance.class = cls
instance:ctor(...)
return instance
end else
-- inherited from Lua Object
if super then
cls = clone(super)
cls.super = super
else
cls = {ctor = function() end}
end cls.__cname = classname
cls.__ctype = 2 -- lua
cls.__index = cls function cls.new(...)
local instance = setmetatable({}, cls)
instance.class = cls
instance:ctor(...)
return instance
end
end return cls
end
通过该方法,我们能够非常方便的定义一个class、继承一个class。
定义一个类:
MyClass = class("MyClass")
function MyClass:ctor()
print("MyClass:ctor()")
end local myclass = MyClass:new()
继承一个类:
GameLayer = class("GameLayer", function()
local layer = cc.Layer:create()
return layer
end)
local gamelayer = GameLayer:new()
addChild(gamelayer)