您的位置:首页 > 移动开发 > Cocos引擎

Lua(9) ——Cocos之_从C++过渡到Lua

2018-01-14 23:39 232 查看

http://blog.51cto.com/shahdza/1569003
【唠叨】

    现在开始学习Lua了,开始用 Cocos Code IDE 开发cocos2dx的游戏了。

    可是呢,因为 cocos2dx v3.x 刚刚才出来不久,所以网上的教程大部分都是基于C++版本的,

    而针对Lua版本的大部分都是老版本 v2.x 的教程,对于用 v3.x 的我来说,很多都不适用了。

    无奈之下只好自己摸索,经过几天的学习,积累了一些 Lua 与 C++ 开发cocos2dx游戏之间的差异。

    现在就在此总结一下。

【番外】

    Cocos2d-X官方就在2014年10月28日,发布了 Cocos引擎v1.0 Preview版

    将Cocos StudioCocos Code IDECocos2d-X 三件套进行了集成,一键部署安装。

    看着实在是太酷炫了,这也说明使用脚本语言 Lua 开发cocos2dx游戏必将越发流行。

【从C++过渡到Lua】

1、Lua中如何使用cocos2dx引擎中的类?

    在C++中是这样调用的:

    而在Lua中是这样调用的:

    是不是很简单?差别其实不是很大嘛!

    Lua中使用引擎中的类,只要在前面多加个 cc. 即可。

    而调用类的函数,不是双冒号:: ,而是一个冒号:

2、Lua 与 C++ 使用上有何差异?

    请耐心看完以下这个类,你或许会有基本上的了解。

    PS:我比较懒,所以用代码来代替文字描述了。

3、Lua中的字符串格式转换?

    C++中是这样使用的:

    而在Lua中则是使用
string.format() 函数。


4、Lua中的枚举类型

    我们都知道C++中的枚举都改成了强枚举类型,形如 Control::State::NORMAL

    而在Lua中将其变成形如:cc.CONTROL_STATE_NORMAL

    估计你已经明白了吧?把所有字母都变成大写,然后把双冒号:: 变成下划线 _ 即可。

    下面列出一些我自己整理的常见枚举类型在Lua中是如何使用的。

5、Lua中的事件回调

    cocos2dx中常用的事件回调有如下:

        > 动作回调         : CallFunc

        > 定时器刷新       : schedule

        > 菜单项事件回调   : menuItem

        > 按钮控件事件回调 : ControlButton

    在cocos2dx v3.2中,由于支持了C++ 11,使用 std::bind 集成了 CC_CALLBACK_*

    在Lua中可不能这样方便的使用。

  5.1、动作回调 CallFunc

    在C++中,动作回调参见:http://shahdza.blog.51cto.com/2410787/1553051

    在Lua中只剩下一个 CallFunc ,其定义如下:

    至于回调函数中有什么参数,参见下面的例子。

    使用举例:

  5.2、定时器刷新 schedule

    在C++中,定时器参见:http://shahdza.blog.51cto.com/2410787/1542014

    在Lua中,有两种方式:

    (1)self:scheduleUpdateWithPriorityLua(update, priority)

        > 参数一:刷新函数

        > 参数二:刷新优先级

        其中 self 为 Node类 的子类。

        该方法默认为每帧都刷新一次,无法自定义刷新时间间隔。

    (2)scheduler:scheduleScriptFunc(update, inteval, false)

        > 参数一:刷新函数

        > 参数二:每次刷新的时间间隔

        > 参数三:是否只执行一次。false为无限次。

        其中 scheduler 为定时器管理:cc.Director:getInstance():getScheduler()

    而我更推荐使用第二种方式,因为比较通用。

    使用举例:

  5.3、菜单项事件回调 menuItem

    在C++中,菜单项回调参见:http://shahdza.blog.51cto.com/2410787/1553051

    在Lua中,使用:registerScriptTapHandler(hander)

    其中 hander
即为需要绑定的回调函数,至于回调函数中有什么参数,参见下面的例子。


    使用举例:

  5.4、按钮控件事件回调 ControlButton

    在C++中,按钮控件事件回调参见:http://shahdza.blog.51cto.com/2410787/1543349

    在Lua中,使用:registerControlEventHandler(hander, type)

    其中 hander 为我们需要绑定的回调函数,而type
则是按钮事件的类型。

    至于回调函数中有什么参数,参见下面的例子。

    对于type
,有以下几种类型:


    使用举例:

6、Lua中的事件分发机制

    在C++中,事件分发机制参见:http://shahdza.blog.51cto.com/2410787/1560222

    事件分发机制包含:

        > 触摸事件     EventListenerTouchOneByOneEventListenerTouchAllAtOnce
        > 鼠标响应事件 EventListenerMouse
        > 键盘响应事件 EventListenerKeyboard
        > 加速计事件   EventListenerAcceleration
        > 自定义事件   EventListenerCustom
        > 物理碰撞事件 EventListenerPhysicsContact
        > 游戏手柄事件 EventListenerController
    而在cocos2dx v3.2版本中,Lua的使用方式与C++有点类似。

    PS:在Lua中对于 鼠标事件、自定义事件 的支持有BUG,建议大家暂时不要去使用。

    另外由于博主还未接触过物理碰撞事件、游戏手柄事件,所以也无法讲解着两个事件机制的使用方法,不过可以确定的一点是:以上几个事件处理都是通过监听器来完成的,所以用法应该都是差不多的。

    在这里我重点讲一下:触摸事件、键盘事件、加速计事件。

    事件处理的原理可以参考C++的使用方法,这里讲一下 Lua 中如何使用。

    

  6.1、使用步骤

    还是继续用代码来讲解吧,一般性都分为以下四个步骤

  6.2、单点触摸事件EventListenerTouchOneByOne

    使用方法如下:

        > 响应函数的两个参数 touch ,event 分别表示:

            > touch :
cc.Touch 。触点信息

            > event :
cc.Event 。事件信息

        > 注册响应函数 registerScriptHandler中的第二个参数,表示事件类型。

            > cc.Handler.EVENT_TOUCH_BEGAN : 触摸开始

            > cc.Handler.EVENT_TOUCH_MOVED : 触摸移动

            > cc.Handler.EVENT_TOUCH_ENDED : 触摸结束

  6.3、多点触摸事件EventListenerTouchAllAtOnce

    使用方法如下:

        > 响应函数的两个参数 touches ,
event 分别表示:

            > touches:
cc.Touch的table数组 。多个触点信息
            > event  :
cc.Event            。事件信息

        > 注册响应函数 registerScriptHandler中的第二个参数,表示事件类型。
            > cc.Handler.EVENT_TOUCHES_BEGAN : 多点触摸开始
            > cc.Handler.EVENT_TOUCHES_MOVED : 多点触摸移动
            > cc.Handler.EVENT_TOUCHES_ENDED : 多点触摸结束

  6.4、键盘事件EventListenerKeyboard

    EventListenerKeyboard,主要用于监听键盘某个键的按下松开的事件。

    使用方法如下:

        > 响应函数的两个参数 keyCode ,
event 分别表示:

            > keyCode:
number   。键盘按键枚举值

            > event  :
cc.Event 。事件信息

        > 注册响应函数 registerScriptHandler中的第二个参数,表示事件类型。
            > cc.Handler.EVENT_KEYBOARD_PRESSED  : 按下键盘的某个键
            > cc.Handler.EVENT_KEYBOARD_RELEASED : 松开键盘的某个键
        > 键盘按键枚举值如下:(仅举例说明)

            > cc.KeyCode.KEY_A    
: A键

            > cc.KeyCode.KEY_1    
: 1键

            > cc.KeyCode.KEY_F1    :F1键

            > cc.KeyCode.KEY_SPACE
: 空格键

            > cc.KeyCode.KEY_ALT  
: ALT键

            > cc.KeyCode.KEY_SHIFT
: SHIFT键

  6.5、加速计事件EventListenerAcceleration

    EventListenerAcceleration,主要用于监听移动设备的所受重力方向感应事件

    重力感应来自移动设备的加速计,通常支持 (X, Y, Z) 三个方向的加速度感应,所以又称为三向加速计。在实际应用中,可以根据3个方向的力度大小来计算手机倾斜的角度或方向。

    EventListenerAcceleration用法和上述几个有点不同。

    使用方法如下:

        > 响应函数有五个参数 event , x , y , z , timestamp 分别表示:
            > event    :
cc.Event 。事件信息

            > (x, y, z):
number   。设备在三个方向上的重力加速度感应
            > timestamp:
number   。响应事件的时间戳

        > 创建加速计监听器时,直接传入响应函数作为参数,而不用registerScriptHandler
        > 使用加速计事件时,还需要开启设备的加速计感应:

            > self:setAccelerometerEnabled(true)

        > 在电脑上看不到效果,需要在设备上才能看到效果。

    在手机上的运行效果:



7、Lua中的数学类

    在C++中,数学类参见:http://shahdza.blog.51cto.com/2410787/1550972

    数学类主要有Vec2(坐标向量)、Size(尺寸)、Rect(矩形)。

  7.1、创建

    在Lua中创建的 Vec2、Size、Rect 都是一个table类型

    其中只有相应的成员变量,没有相关的函数运算。

  7.2、坐标向量运算

    Lua中常用的向量运算如下:

    (1)返回值为bool

    (2)返回值为float

    (3)返回值为point_table

  7.3、矩形运算

    Lua中常用的矩形运算如下:

8、Lua中的颜色类

    在C++的颜色类主要有三个:Color3BColor4BColor4F。并且有很多颜色的宏定义。

    在Lua中,无法使用颜色的宏定义,而需要自己设置。

    颜色类的使用方法如下:

9、还有什么?

    在最后,我还想讲讲一些使用Lua开发cocos2dx的注意事项。

  9.1、关于getPosition()

    先来看看几个 getXXX() 函数的返回值吧。

    可以发现:getPosition() 返回的不是point_table,而是两个值。

    PS:真是一个大坑!

    所以接收 getPosition() 时需要处理一下。

  9.2、关于 . 和 :

    在Lua中,一定要区分这两个:点. 和冒号: 的区别,很容易搞混掉。

        > 定义的时候,冒号: 默认接收self参数

        > 调用的时候,冒号: 默认传递调用者自己为参数

        > 而点号. 要显示传递或接收self参数

    例如:点号定义,需要显示传递或接收。

    这样使用函数就要传递自身self,用起来很麻烦。

    所以Lua给出了一个方便的方法:将函数定义改成冒号: ,这样就可以省略self参数了。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  cocos2d-x lua