@H_403_2@class函数是在"cocos2d-x-3.2/cocos/scripting/lua-bindings/script/extern.lua"中定义的。
@H_403_2@-- Create an class. @H_403_2@function@H_403_2@class(classname,super) @H_403_2@localsuperType =@H_403_2@type(super) @H_403_2@localcls @H_403_2@ifsuperType ~= "function"@H_403_2@andsuperType ~= "table"@H_403_2@then superType =@H_403_2@nil super =@H_403_2@nil @H_403_2@end @H_403_2@ifsuperType == "function"@H_403_2@or(super@H_403_2@andsuper.__ctype == 1)@H_403_2@then @H_403_2@-- inherited from native C++ Object cls = {} @H_403_2@ifsuperType == "table"@H_403_2@then @H_403_2@-- copy fields from super @H_403_2@fork,v@H_403_2@in@H_403_2@pairs(super)@H_403_2@docls[k] = v@H_403_2@end cls.__create = super.__create cls.super = super @H_403_2@else cls.__create = super @H_403_2@end cls.@H_403_2@ctor =@H_403_2@function()@H_403_2@end cls.__cname = classname cls.__ctype = 1 @H_403_2@functioncls.@H_403_2@new(...) @H_403_2@localinstance = cls.__create(@H_403_2@...) @H_403_2@-- copy fields from class to native object @H_403_2@in pairs(cls)@H_403_2@doinstance[k] = v@H_403_2@end instance.class = cls instance:@H_403_2@ctor(...) @H_403_2@returninstance @H_403_2@else @H_403_2@-- inherited from Lua Object cls =@H_403_2@clone(super) cls.super = super @H_403_2@else cls = {ctor =@H_403_2@end} @H_403_2@end cls.__cname = classname cls.__ctype = 2@H_403_2@-- lua cls.__index = cls @H_403_2@localinstance =@H_403_2@setMetatable({},cls) instance.class = cls instance:@H_403_2@end @H_403_2@returncls @H_403_2@end |
在Lua中类的概念就是table表,而上面的函数代码主要做的就是对父类super的表进行拷贝,然后再定义了两个函数@H_403_2@cls.new(...)和@H_403_2@cls:ctor(...)。如果我们不了解上面的代码,也是没有关系的,只要我们会使用它就够了。
@H_403_2@>@H_403_2@定义一个类:@H_403_2@cls =class("类名","父类")
@H_403_2@> 创建实例 :obj = cls.new()
@H_403_2@>初始化函数:cls:ctor()在创建实例的时候,会自动调用
@H_403_2@只要掌握这三步骤,对于我们cocos2d-x的开发已经够用了!
1、创建基类
首先创建一个@H_403_2@Hero类,然后重写Hero类的初始化函数@H_403_2@Hero:ctor()。
再创建一个Hero类的实例对象@H_403_2@Hero.new(),会自动调用初始化函数Hero:ctor() 。
测试输出。
@H_403_2@注意:其中ctor()中出现的self为实例对象本身,就相当于C++类中的this。
@H_403_2@
2、继承父类
在cocos2d-x开发中,经常需要继承引擎中的类,如Layer、Sprite等。
这里举例,将上面的Hero类修改一下,继承自@H_403_2@Sprite。
3、再举个例子:继承Layer类
我一般习惯在@H_403_2@ctor()中只声明一些类的成员变量。
然后再自定义一个函数@H_403_2@create(),将@H_403_2@new()进行封装,然后在 create() 中调用@H_403_2@init()函数进行实例对象的初始化工作。
@H_403_2@这样的好处就是:在使用上就和我在C++中的使用的方式一样了。
@H_403_2@3.1、定义一个继承于Layer的类
3.2、使用方法
@H_403_2@> 创建包含GameLayer层的Scene场景:GameLayer:createScene()
@H_403_2@@H_403_2@> 创建一个GameLayer层-----------:@H_403_2@GameLayer:create()
@H_403_2@> 而在创建GameLayer时,也会调用自定义的初始化函数init()