我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Lua(3) ——Cocos之_语法糖c

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Lua(3) ——Cocos之_语法糖c

【唠叨】

    在使用Lua的时候,cocos2d-x为我们提供了一个 class(classname, super) 这个函数。

    它可以让我们很方便的定义一个类,或者继承cocos2d-x的某个类。

    PS:class()是cocos2d-x为我们封装的函数,本身Lua没有这个函数。

    基于Lua 5.1。


【Demo下载】

    https://github.com/shahdza/Cocos_LearningTest/tree/master/Lua%E4%B9%8Bclass%E7%B1%BB 




【class】


    class函数是在"cocos2d-x-3.2/cocos/scripting/lua-bindings/script/extern.lua"中定义的。


-- Create an 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

        end


        cls.ctor    = function() 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 = clone(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


    在Lua中类的概念就是table表,而上面的函数代码主要做的就是对父类super的表进行拷贝,然后再定义了两个函数 cls.new(...)cls:ctor(...) 。如果我们不了解上面的代码,也是没有关系的,只要我们会使用它就够了。


0、使用方法

    定义一个类:cls = class("类名","父类")

    > 创建实例  :obj = cls.new()

    初始化函数:cls:ctor()    在创建实例的时候,会自动调用

    

    只要掌握这三步骤,对于我们cocos2d-x的开发已经够用了!


1、创建基类

    首先创建一个Hero类,然后重写Hero类的初始化函数Hero:ctor()

    再创建一个Hero类的实例对象Hero.new() ,会自动调用初始化函数Hero:ctor() 。

    测试输出。

    注意:其中ctor()中出现的 self 为实例对象本身,就相当于C++类中的 this 。


    wKiom1RGn37wHdw6AAFXC7srOWg614.jpg



2、继承父类

    在cocos2d-x开发中,经常需要继承引擎中的类,如Layer、Sprite等。

    这里举例,将上面的Hero类修改一下,继承自Sprite

    wKioL1RGoOWAXNLMAAIfl3ox2uQ600.jpg



3、再举个例子:继承Layer类

    我一般习惯在 ctor() 中只声明一些类的成员变量。

    然后再自定义一个函数 create() ,将 new() 进行封装,然后在 create() 中调用 init() 函数进行实例对象的初始化工作。

    这样的好处就是:在使用上就和我在C++中的使用的方式一样了。


 3.1、定义一个继承于Layer的类

wKioL1RGpdHSkzvoAAS4LwqyVUM952.jpg


 3.2、使用方法

    > 创建包含GameLayer层的Scene场景:GameLayer:createScene()

    > 创建一个GameLayer层-----------GameLayer:create()

    > 而在创建GameLayer时,也会调用自定义的初始化函数 init()

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



免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Lua(3) ——Cocos之_语法糖c

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Lua(3) ——Cocos之_语法糖c

【唠叨】    在使用Lua的时候,cocos2d-x为我们提供了一个 class(classname, super) 这个函数。    它可以让我们很方便的定义一个类,或者继承cocos2d-x的某个类。    PS:class()是co
2023-01-31

C#中检查null的语法糖有哪些

这篇文章主要介绍了C#中检查null的语法糖有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#中检查null的语法糖有哪些文章都会有所收获,下面我们一起来看看吧。函数参数null检查传统写法写一个函数的时
2023-06-30

c语言学习之数组3

#include int main(){  char cArr[] = {'I', 'L', 'O', 'V', 'E', 'C'};  char sArr[] = "ilovec";  int i = sizeof(cA
2023-01-31

详解Objective-C中的语法糖@{}究竟是什么

最近在技术群里有一个群友提出了一个问题,就是为什么下面代码打印的结果不一样?NSMutableDictionary *mDic1 = [NSMutableDictionary dictionaryWithDictionary:@{@"a":
2022-05-23

JS异步编程之generator与async/await语法糖详解

这篇文章主要为大家详细介绍了JS异步编程中generator与async/await语法糖的使用,文中的示例代码讲解详细,感兴趣的小伙伴可以学习一下
2022-11-13

javascript之generator生成器函数与asnyc/await语法糖怎么使用

这篇文章主要讲解了“javascript之generator生成器函数与asnyc/await语法糖怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“javascript之generat
2023-07-05

vue3 setup语法糖之组件传参(defineProps、defineEmits、defineExpose)示例详解

defineProps 和 defineEmits 都是只能在 <script setup> 中使用的编译器宏,他们不需要导入,且会随着 <script setup> 的处理过程一同被编译掉,这篇文章主要介绍了vue3 setup语法糖之组件传参(defineProps、defineEmits、defineExpose)示例详解,需要的朋友可以参考下
2023-01-28

Python 3版本较之前版本语法的一些

市面上的Python教程基本都是以3.0以下版本来讲解的,python 从3.0之后一些语法都做了写更改,有时候可能会浪费比较多的时间,记录下使用过程中遇到的情况以备后查。1、Print (1)需要加括号 (2)打印文件重定向(1)prin
2023-01-31

C++11语法之右值引用的方法

这篇文章主要讲解了“C++11语法之右值引用的方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++11语法之右值引用的方法”吧!一、{}的扩展在原先c++的基础上,C++11扩展了很多初
2023-06-29

算法15. 三数之和_(c语言版)

1. 题目描述给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。注意:答案中不可以包含重复的三元组。示例:给定数组 nums
2023-06-03

c语言输入3个数输出最大值的方法

小编给大家分享一下c语言输入3个数输出最大值的方法,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!方法:首先使用scanf()接收从键盘输入的三个数;然后使用“if else”语句比较三个数的大小,获得最大值;最后使用pri
2023-06-14

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录