cocos-lua学习笔记(五)cocos2d-Lua类的实现
【摘要】
一、cocos2d-lua继承的代码
打开src->framework->function.lua
**注意:** Lua 继承类覆盖的方法并不能从 C++ 调用到。也就是说通过 C++ 代码调用这个 cc.Node 对象的 setPosition() 方法时,并不会执行我们在 Lua 中定义的 Toolbar:...
一、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 cls
end
二、分析两种继承
举个例子
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方法使用{ }来创建实例。
不是特别理解,书上写的这些东西。
日后有更完善的例子,我就加到这下面。 ~~~~~~~~~~
文章来源: yujiang.blog.csdn.net,作者:鱼酱2333,版权归原作者所有,如需转载,请联系作者。
原文链接:yujiang.blog.csdn.net/article/details/78498895
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)