cocos-lua学习笔记(五)cocos2d-Lua类的实现

一、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方法使用{ }来创建实例。

不是特别理解,书上写的这些东西。

日后有更完善的例子,我就加到这下面。 ~~~~~~~~~~


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程小鱼酱

用心写好每一篇博客

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值