在lua中要实现对类的定义一般都是通过Metatable来做到的。。例如:

Fjs = {}

function Fjs:new(name)
	local out = {}
	setMetatable(out,self)
	self.__index = self
	out.name = name
	return out
end


function Fjs:sayHello()
	print("my name is " .. self.name)
	print("hello")
end

local fjs = Fjs:new("fjs")
fjs:sayHello()


首先定义了一个table,然后在它上面定义相应的方法,在创建对象的时候,通过将对象的Metatable指定为刚刚定义的table,这样也就实现了方法的绑定。。也就实现了类的定义和对象的创建。


上述实现中,自己需要定义一些约定的代码,在cocos2d-x中,为了实现的方便,扩展了一个class方法用于实现定义类型,对于上述类型的定义可以简化为如下:

Fjs = class("Fjs")

function Fjs:ctor(name)
	self.name = name
end

function Fjs:sayHello()
	print("I am " .. self.name)
	print("hello")
end

fjs = Fjs.new("fjs")
fjs:sayHello()

这个样子看起来简洁多了。。。这里定义了一个ctor方法,这个是构造函数


为了理解class究竟是怎么定义的。。来看看该方法的代码:

function class(classname,super)
    local superType = type(super)
    local cls

    --如果提供的super既不是函数,也不是table,那么就直接将super当做不存在
    if superType ~= "function" and superType ~= "table" then
        superType = nil
        super = nil
    end

    --如果有提供super
    if superType == "function" or (super and super.__ctype == 1) then
        -- 定义一个table,它将作为类的定义
        cls = {}

        --如果super是table,那么将super中定义的字段先全部拷贝到cls中
        --然后将__create方法指定为super的__create方法
        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 
        --这里提供的super时函数,那么也就是用这个方法来构造对象,那么直接将__create方法指向super
            cls.__create = super
        end

        --提供一个空的ctor构造函数
        cls.ctor    = function() end
        cls.__cname = classname
        cls.__ctype = 1

        --定义.new(...)方法,他用户构建对象,首先是调用__create方法来构建一个table对象,然后将cls里面定义的字段全部拷贝到创建的对象中
        --接下来在调用ctor构造方法
        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
        --从lua的类型中继承
        if super then
            cls = clone(super)
            cls.super = super
        else
       	--直接就没有super,那么定义cls为一个带有空ctor的table
            cls = {ctor = function() end}
        end

        cls.__cname = classname
        cls.__ctype = 2 -- lua
        cls.__index = cls

        --这里的new方法,首先是创建了空的table,然后将其Metatable指向为cls
        --然后在调用ctor构造方法
        function cls.new(...)
            local instance = setMetatable({},cls)
            instance.class = cls
            instance:ctor(...)
            return instance
        end
    end
    --返回类型的定义
    return cls
end


注释已经说的很明白了吧,我们接下来来分析一段常用的使用方式:

GameScene = class("GameScene",function()
	return cc.Scene:create()
end)

function GameScene:ctor()

end

function GameScene:create()
	return GameScene.new()
end


这是比较常用的自定义Scene的方法,提供了create方法来具体的构建GameScene对象。。

通过上述class的代码,我们可以知道如下的执行步骤:

(1)首先用class中定义的super函数来构建了一个对象,也就是Scene:create()之后得到的scene对象

(2)在该对象上调用定义的ctor方法


至于别的类型的定义,通过class代码的分析也能很容易的知道执行步骤

cocos2d-x lua中class的定义的更多相关文章

  1. Swift使用CoreData报错:CoreData: warning: Unable to load class named 'xxx' for entity 'xxx'.

  2. Swift语言中class、struct、enum的联系与区别

    相同点三者都可以拥有属性和方法都可以拥有函数class和struct可以拥有自己的构造器不同点类可以继承类可以内省和转型struct、enum为值类型,class为引用类型类方法用class关键词声明,enum、struct用static关键词用mutaing关键词声明要修改struct、enum内容的方法结构体适合基本数据类型

  3. 早期Swift中Cocos2D初始化代码的重构

    但是遗憾的是Swift2.2中还是不支持Type的class属性关键字,只能用static,我们期待Swift3的改进吧!

  4. 如何在swift中覆盖layerClass

    在Objective-C中,我们使用这样做显然这不会工作:因为类是Swift中的关键字。你如何在Swift中做它?改编自Apple的ListerKit示例代码:

  5. 手把手教你swift项目添加cocos2dx-lua

    去倒杯水吧,这个过程会很久。。。至此,工程已经全部配置完毕,你已经解决一个大Boss了;今天就到这里吧,之后我们再续如何用swift调用lua手把手教你swift项目添加cocos2dx-lua

  6. 手把手教你swift项目集成cocos2dx-js模块

    前几天在swift项目中集成了Lua模块,使得在swift工程中用Lua写游戏逻辑成为了可能,具体工程及配置见手把手教你swift项目添加cocos2dx-lua,由于公司最近要把js做的小游戏集成到iOS原生应用中,于是我们将解锁另外一个场景,好了,下面开始;同样的,首先你得有一个swift项目我们从头开始,建立一个swift项目;我们默认你已经可以自己创建一个全新的swift项目了,这很简单,不是么?

  7. android – 尝试在Cocos2d-X C中设置一个带整数的CCLabelTTF作为它的字符串的一部分

    所以在使用Cocos2d的Objective-C中,我使用带有格式的NSMutableString将变量(得分)放入字符串中.我拿这个字符串并使用cclabel将它放在屏幕上.使用Cocos2D-x,我很难找到获得此结果的方法.一个简单的例子就是很棒.谢谢!

  8. Java 中 Class Path 和 Package的使用详解

    这篇文章主要介绍了Java 中 Class Path和Package的使用详解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下

  9. jQuery针对input的class属性写了多个值情况下的选择方法

    这篇文章主要介绍了jQuery针对input的class属性写了多个值情况下的选择方法,结合实例形式对比分析了jQuery选择器针对class属性中有多个值情况下的选中方法,需要的朋友可以参考下

  10. 详解Vue.js Class与Style绑定

    这篇文章主要为大家介绍了Vue.js Class与Style绑定的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

随机推荐

  1. 【cocos2d-x 3.x 学习笔记】对象内存管理

    Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[

  2. 利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文

    由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。

  3. 利用cocos2dx 3.2开发消灭星星七关于星星的算法

    在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。

  4. cocos2dx3.x 新手打包APK注意事项!

    这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久

  5. 利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

    如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

  6. 利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效

    needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了

  7. 02 Cocos2D-x引擎win7环境搭建及创建项目

    官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。

  8. 利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享

    一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接

  9. 03 Helloworld

    程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return

  10. MenuItemImage*图标菜单创建注意事项

    学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。

返回
顶部