cocos2dx-lua中实现面向对象的封装继承

前端之家收集整理的这篇文章主要介绍了cocos2dx-lua中实现面向对象的封装继承前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

@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

@H_403_2@ifsuper@H_403_2@then

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@0、使用方法

@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()

@H_403_2@> 类的成员变量,均在ctor()中进行声明即可。

猜你在找的Cocos2d-x相关文章