博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cocos-lua学习笔记(五)cocos2d-Lua类的实现
阅读量:5357 次
发布时间:2019-06-15

本文共 2843 字,大约阅读时间需要 9 分钟。

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

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

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

转载于:https://www.cnblogs.com/hiwoshixiaoyu/p/10034972.html

你可能感兴趣的文章
【iOS开发-68】APP下载案例:利用tableView自带的cell布局+缓存池cell复用时注意button状态的检查...
查看>>
《Genesis-3D开源游戏引擎-FQA常见问题解答》2014年01月10号版本
查看>>
Java 编程下实现随机无重复数字功能
查看>>
Android 编程下的代码混淆
查看>>
animation属性
查看>>
页内的模块和组件抽象规划经验
查看>>
安全-分析深圳电信的新型HTTP劫持方式
查看>>
将Centos的yum源更换为国内的阿里云源
查看>>
git diff 的用法
查看>>
一段sql的优化
查看>>
十进制与十六进制的相互转换
查看>>
在Flex中用Validator检测数字、字符串、Email.
查看>>
[leetcode]4Sum
查看>>
POJ1062 昂贵的聘礼
查看>>
【零基础学习iOS开发】【02-C语言】08-基本运算
查看>>
Java 将指定字符串连接到此字符串的结尾 concat()
查看>>
Hibernate Criterion
查看>>
Python知识
查看>>
我们为什么要搞长沙.NET技术社区(三)
查看>>
杭电acm Cake
查看>>