quick-cocos2dx lua里对class的定义
2014-12-12 13:56
357 查看
转载:http://www.swfdiy.com/?p=1663
在quick-cocos2dx里, 通过class() 函数进行类的定义
下面贴出quick-cocos2d-x-2.2.1-rc 里 class()的源码
我们先考虑最简单的情况, 在没有继承的情况下定义一个类ClassA
这种情况下, ClassA 跟InstanceA的关系如下图
![](http://www.swfdiy.com/wp-content/uploads/2013/12/c1.jpg)
InstanceA的metatable为ClassA, 而且ClassA.__index = ClassA, 因此,对于InstanceA找不到的属性, 将在ClassA里进行查找。 需要注意的是,ClassA里的属性比如field1, 是相当于类变量的概念,所有实例都公用该属性,并非各自维护该字段的拷贝。
下面如果要再定义ClassB, 从ClassA 进行继承
这种情况下, ClassB 跟InstanceB, ClassA的关系如下图
![](http://www.swfdiy.com/wp-content/uploads/2013/12/c3.jpg)
同理,InstanceB里没有定义的属性, 将首先在ClassB里进行搜索, 如果ClassB里搜不到, 将向上追寻到ClassA里。
上面考虑的都只是针对纯Lua类, 在实际情况中, 我们需要对C++里生成的对象(userdata)进行扩展, 可以如下定义
ClassC跟InstanceC的关系如下图
![](http://www.swfdiy.com/wp-content/uploads/2013/12/c4.jpg)
在调用InstanceC(实际上是一个userdata)上的某个方法时, 首先会先去这个userdata绑定的peer这个table里寻找这个方法,如果找不到才会去c++那层调用。
所以我们可以通过给peer添加几个方法从而实现给InstanceC(userdata)扩展方法, 实际情况上也确实如此,在quick里,有几个专门的类,CCNodeExtend,CCLayerExtend,CCSceneExtend,CCSpriteExtend, 使用比如 CCNodeExtend.extend(someCCNodeInstance), 可以生成一个特殊的peer, 这个peer的metatable为CCNodeExtend, 这样我们就可以在someCCNodeInstance上调用CCNodeExtend定义了而原本CCNode没有的方法,
从而实现扩展。
下面再考虑ClassD从ClassC继承的情况
关系图:
在quick-cocos2dx里, 通过class() 函数进行类的定义
下面贴出quick-cocos2d-x-2.2.1-rc 里 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 cls.ctor = function() end 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 = {} setmetatable(cls, {__index = 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
我们先考虑最简单的情况, 在没有继承的情况下定义一个类ClassA
--ClassA.lua local ClassA = class("ClassA") ClassA.field1 = "this is field1" return ClassA
--main.lua local ClassA = require("ClassA") local InstanceA = ClassA.new()
这种情况下, ClassA 跟InstanceA的关系如下图
![](http://www.swfdiy.com/wp-content/uploads/2013/12/c1.jpg)
InstanceA的metatable为ClassA, 而且ClassA.__index = ClassA, 因此,对于InstanceA找不到的属性, 将在ClassA里进行查找。 需要注意的是,ClassA里的属性比如field1, 是相当于类变量的概念,所有实例都公用该属性,并非各自维护该字段的拷贝。
下面如果要再定义ClassB, 从ClassA 进行继承
--ClassB.lua local ClassB = class("ClassB", require("ClassA")) return ClassB
这种情况下, ClassB 跟InstanceB, ClassA的关系如下图
![](http://www.swfdiy.com/wp-content/uploads/2013/12/c3.jpg)
同理,InstanceB里没有定义的属性, 将首先在ClassB里进行搜索, 如果ClassB里搜不到, 将向上追寻到ClassA里。
上面考虑的都只是针对纯Lua类, 在实际情况中, 我们需要对C++里生成的对象(userdata)进行扩展, 可以如下定义
--ClassC.lua local ClassC = class("ClassC", function() --调用C++接口创建一个原生对象(userdata), 并且给该对象绑定一个peer(table), 这里我们以创建一个CCNode为例 local node = CCNode:create() --原生对象(userdata) local peer = {} tolua.setpeer(node , peer ) return node end) return ClassC
ClassC跟InstanceC的关系如下图
![](http://www.swfdiy.com/wp-content/uploads/2013/12/c4.jpg)
在调用InstanceC(实际上是一个userdata)上的某个方法时, 首先会先去这个userdata绑定的peer这个table里寻找这个方法,如果找不到才会去c++那层调用。
所以我们可以通过给peer添加几个方法从而实现给InstanceC(userdata)扩展方法, 实际情况上也确实如此,在quick里,有几个专门的类,CCNodeExtend,CCLayerExtend,CCSceneExtend,CCSpriteExtend, 使用比如 CCNodeExtend.extend(someCCNodeInstance), 可以生成一个特殊的peer, 这个peer的metatable为CCNodeExtend, 这样我们就可以在someCCNodeInstance上调用CCNodeExtend定义了而原本CCNode没有的方法,
从而实现扩展。
下面再考虑ClassD从ClassC继承的情况
--ClassD.lua local ClassD = class("ClassD", require("ClassC")) return ClassD
关系图:
![](http://www.swfdiy.com/wp-content/uploads/2013/12/c5.jpg)
相关文章推荐
- quick-cocos2dx lua里对class的定义
- cocos2dx lua学习笔记 <一> quick 3.5定义本身C++类是必然lua
- 【COCOS2DX-LUA 脚本开发之六】利用Lua强转函数解决使用CCNode报错或无法正常使用以及简单介绍 quick-cocos2d-x 与 OpenQuick 两款Lua免费开源框架
- quick-cocos2dx 3.3 c++绑定到Lua
- cocos2dx 3.0 quick lua schedler
- quick-Cocos2d/framework/functions.lua(提供了我们在Lua中创建一个自定义类的快捷方法class、克隆等功能)
- 【cocos2dx】使用VS插件在VS2012/2013上编辑和调试Quick-Cocos2d-x的Lua代码
- [cocos2dx_Lua]quick中的节点帧事件
- 【COCOS2DX-LUA 脚本开发之八】不用CCHttpClient而转用quick-cocos2d-x或cocos2dx-LuaProxy的Lua框架实现Lua-Http网络交互!
- 记录一下Quick-Cocos2dx-Community lua绑定C++自定义类遇到的问题
- 【COCOS2DX-LUA 脚本开发之八】不用CCHttpClient而转用quick-cocos2d-x或cocos2dx-LuaProxy的Lua框架实现Lua-Http网络交互!
- Quick-cocos2dx-lua 游戏IOS端编译
- cocos2dx lua学习笔记 <一> quick 3.5把自定义C++类绑定到lua
- cocos2dx-lua or quick 2dx 中的图片资源加密
- dojo里如何定义和继承Class --dojo Quick Start/dojo入门手册5
- 【Quick-COCOS2D-X 3.3 怎样绑定自己定义类至Lua之四】使用绑定C++至Lua的自己定义类
- quick-cocos2d-x (cocos2dx binding lua)
- dojo Quick Start/dojo入门手册--面向对象,定义Class
- class() 高级用法 --cocos2dx- lua
- cocos2dx 3.7中 AppDelegate.h的class TestController;这种写法的具体意思不太明白,只能猜是类似于外部定义的东西。