一、cocos2d-lua继承的代码
打开src->framework->function.lua
**注意:** Lua 继承类覆盖的方法并不能从 C++ 调用到。也就是说通过 C++ 代码调用这个 cc.Node 对象的 setPosition() 方法时,并不会执行我们在 Lua 中定义的 Toolbar:setPosition() 方法。@param string classname 类名@param [mixed super] 父类或者创建对象实例的函数@return table]] function class(classname, super) local superType = type(super) local cls--superType获取父类类型,可以使nil、function以及table.--如果superType 是nil,说明类是独立的,没有父类。 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 从父类copy 字段 for k,v in pairs(super) do cls[k] = v end cls.__create = super.__create cls.super = super else --父类是函数 --把当前类的创建函数,改为父类的函数 cls.__create = super cls.ctor = function() end end --赋值类名 cls.__cname = classname cls.__ctype = 1 --创建new方法 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 --创建对象时,可以通过className.new这种方式来创建 --如 local MySpriteClass = class("MySpriteClass",cc.Sprite) -- return MySpriteClass --mySpriteClass 实例创建 -- local mySprite = MySpriteClass.new(xxx.png) else --父类是lua对象时,cls.__ctype 不为1 superType不是函数 -- inherited from Lua Object if super then cls = {} --设置cls 元表是父类表 setmetatable(cls, {__index = super}) --保存父类表 cls.super = super else --nil的情况 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 clsend
二、分析两种继承
举个例子
print(type(cc.Node))print(type(cc.Node.create()))
cc.Node是table,但它创建出来的实例对象时userdata,userdata描述C创建的新类型。
由于userdata和table不同,所以需要两种继承。
UserData(用户自定义类型)
意义:使用C语言编写的用于扩展Lua的新类型,方便使用脚本编写或者提高效率
userdata:提供了一块原始的内存区域,用于存储任何东西,在Lua中userdata没有任何预定义操作 生成:void *lua_newuserdata(L,size) 根据指定大小分配一块内存,并将userdata压入栈中,最后返回这个内存块的地址来自书上的图。
classname.new()生成的instance包含一个class属性。class指向了类原型,并具有super,ctor,__cname和__ctype 4个属性
继承C++的类,new方法使用__create函数来创建实例
继承lua类,new方法使用{ }来创建实例。
继承Lua的类,new方法使用{ }来创建实例。
不是特别理解,书上写的这些东西。
日后有更完善的例子,我就加到这下面。 ~~~~~~~~~~