APP下载

基于Lua动态脚本语言Cocos2d—x应用开发的技术研究

2015-05-30马超马佳琳

软件工程 2015年8期

马超 马佳琳

摘 要:Lua脚本语言技术给Coco2d-x开发,带来了新的天地。通过Lua脚本语言开发Cocos2d-x应用,摆脱了C/C++开发的繁琐代码,使得开发变得快速高效又能同时在多个平台运行,Lua脚本语言的可拓展性,可以使它很好的集成在应用程序中。同时Lua语言在开发成为控制器。控制应用程序的逻辑而Coco2d-x之提供显示功能和跨平台功能。这样开发不仅可以动态修改客户端BUG,而且还能动态更新应用内容避免了更新带来的客户流失。Lua语言免费、小巧、快速易移植降低了开发成本又保证了应用性能。

关键词:Coco2d-x;动态更新;Lua;跨平台开发

中图分类号:TP368.1 文献标识码:A

Abstract:The Lua scripting language technology has brought the new heaven and earth for the development of Coco2d-x.Through the Lua scripting language development Cocos2d-x application,get rid of the tedious code of C/C++ development,makes the development of fast and efficient and can run on multiple platforms at the same time,the Lua scripting language can expand sex,can make it a good integration in the application.At the same time the Lua language become controller in development.Control the application logic and Coco2d-providing display functions of x and cross-platform features.Such development can dynamically modify the client not only bugs,but also dynamic update application content to avoid the update of customer churn.Free,small,fast,easy to transplant the Lua language reduces the development cost and guarantee the application performance.

Keywords:Cocos2d-x;dynamic updating;Lua;cross-platform development

1 引言(Introduction)

Cocos2d-x是基于C++语言的移动端应用程序开发的开源框架。Cocos2d-iPhone项目的C++版本[1]。Cocos2d-x开发框架用C++语言重写了Cocos2d开发框架从而实现应用开发跨平台,在跨平台移动端应用开发中Cocos2d-x框架被大量使用[2]。其开发的手机应用,可以在C++或者Lua中编写。Cocos2d-x项目能够兼容iOS操作系统,Android操作系统,黑莓Blackberry操作系统等。在PC端Cocos2d-x开发框架支持的操作系统包括Linux操作系统、Mac操作系统和Windows操作系统等PC端操作系统,因此,Cocos2d-x能够在PC端操作系统中可以进行编辑和调试使得其在开发中变得高效快捷[3]。

2 基于Lua动态脚本语言Coco2d-x应用开发的关键技术(The key technology of Cocos2d-x application development based on the dynamic scripting language Lua)

(1)Lua技术

Lua是一个小巧的动态语言。Lua动态语言的设计初衷,为应用程序开发提供订制功能与灵活的拓展。作为脚本语言它具有轻量、可拓展、简洁等特点[4]。因为C++语言与Lua脚本语言具有良好交互能力。可以复杂繁琐的C++开发变为简单快捷的Lua语言开发。

(2)Lua与C++交互技术

Lua动态脚本语言与C++语言的通讯分为两部分,首先是Lua动态语言通过Lua Binding访问C++语言中的类库或者函数以及传递参数,其次分是C++语言回调Lua C API访问Lua的函数以及传递参数。

(3)Cocos2d-x开发手机应用技术

在实际开发中,使用Cocos2d-x框架进行移动端应用程序开发,依赖其可以和平台完美兼容,使其项目可以做到多个平台一套代码,多个平台一个版本避免了多平台版本不统一的尴尬。通过与之相配套的CocosStdioUI编辑快速生成plist文件可视化进行界面布局提高实际项目中的开发效率,让应用开发变得更加迅捷高效开发。

3 基于Lua动态脚本语言Coco2d-x应用开发的应用

与实现(The use and implementation of Cocos2d-x

application development based on the dynamic

scripting language Lua)

3.1 Lua与C++的交互技术实现

在C++中初始化Lua:

Lua_State * L=lua_open(); //初始化Lua环境

void CCinitLua() {

lua_openlibs(L); //载入Lua全部标准库

}

完成在C++来执行Lua文件。Lua被嵌入到C++程序中,起到一个黏合作用。而Cocos2d-x框架其强大的功能分别来自于不同的类库。Lua动态语言在程序开发中作为整个应用程序的逻辑控制器,在开发中Lua脚本语言充当大脑而开发框架充当肢体。以消息机制为例,通过调用C++语言的函数达到,回调Lua动态语言函数。以C++绘制函数为例,C++通过绘制函数传输一个消息给Lua语言,当绘制函数进行重绘时也就在Lua语言中执行相同的函数。这样就可以在书法简练没有类型的Lua中编写C++代码,省去了C++的复杂语法从而有拥有了C++的强大功能。通过这个方式就能够实现其他事件机制。

动态脚本语言Lua调用C++接口时,进行参数传递,回调结果的获取。需要把C++中函数位置通过指定的方式传达给Lua语言。在Lua调用C++,C++从栈中找到交互的栈,从而获取其中的参数,调用结束后将返回结果信息放入栈中。在当Lua语言中绘制函数被调用时,同时也调用了C++中做相应处理的函数,这样动态语言Lua与C++的交互就是实现的。

3.2 Lua与Cocos2d-x交互

Cocos2d-x具体来说更像是一个类库的合集其中把图形渲染和多媒体播放甚至物理引擎,分解集合成一个lib。通过C++调用这个lib中的具体方法而实现快速的手机应用开发的框架。通过Lua动态语言嵌入到Cocos2d-x开发框架中,并与其良好的结合。达到了在脚本中开发跨平台手机应用。

3.3 利用Cocos2d-x开发应用

目前移动端操作系统主要有iOS操作系统,Android操作系统。移动应用程序开发需要使用Cocos2d-x进行开发可以避免一款程序多套代码的尴尬。

(1)利用Lua+Coco2d-x开发Android应用

通过Native Development Toolkit(NDK)我们可以在eclipse里面集成外部库(比如Cocos2d-x),使用C/C++来编写Android程序。这些库被编译成动态库通过JNI(Java Native Interface)与Java Android体系程序进行交互。下面有两种使用方法:

①独立模式:直接在makefile中使用arm-linux-androideabi-g++。

②集成模式:使用$NDKROOT/ndk-build shell工具,它是一种高度可定制的makefile,专门为NDK库所设计的。

首先修改Anroid/jni/Android.mk中文件如下:

LOCAL_PATH:=$(callmy-dir)include$(CLEAR_VARS)subdirs:=$(addprefix $(LOCAL_PATH)/http://www.machaoblog.com/../,$(addsuffix /Android.mk, \

cocos2dx\CocosDenshion/android\lua/proj.android/jni\))subdirs+= $(LOCAL_PATH)/pyramid/Android.mk

include $(subdirs)

修改jni\Application.mk文件:

APP_MODULES:=cocos2d cocosdenshion lua game

在android\src\org\cocos2dx\xx\x\.java中修改:

static {

System.loadLibray("cocos2d");

System.loadLibrary("cocosdenshion");

System.loadLibrary("lua");

System.loadLibrary("game");

}

(2)利用Lua+Coco2d-x开发iOS应用

在Mac操作系统终端中填入:

cd $COCOS2DX_HOME

sud./install-templates-xcode.sh-u

在Cocos2d-x框架安装成功以后在Xcode中会出现新的Cocos2d-x模板选择即可创建新的工程。由于lua语言不能直接与Objective-C交互,所以我们使用Lua Bingding和C/C++交互。同时C++和Objective-C可以混编,使用C++可以直接调用Objective-C,让C++作为Lua和Objective-C交互的桥梁(图1)。

(3)Lua开发应用

我们通过用Lua动态语言创建场景、层、精灵来实现应用中的一个通过用户触摸图片跟随用户手指移动的功能。

Mc_Scene=cocos2d.CCScene.node()

Mc_Layer=cocos2d.CCLayer.node()

Mc_Scene:addChild(Mc_Layer)

Mc_Sprite=cocos2d.CCSprite:SpriteWithFile

("machao.png")

Mc_Layer:addChild(Mc_Sprite)

SceneSize=cocos2d.CCDirector:shareDirector:getWinSize()

Mc_Sprite:setPosition(cocos2d.CCPoint(SceneSize.width*0.5,SceneSize.height*0.5))

Mc_Layer.__CCTouchDelegate__:registerScriptTouchHandler(cocos2d.CCTOUCHBEGAN,"btnTouchBegin")

Mc_Layer.__CCTouchDelegate__:registerScriptTouchHandler(cocos2d.CCTOUCHMOVED,"btnTouchMove")

Mc_Layer.__CCTouchDelegate__:registerScriptTouchHandler(cocos2d.CCTOUCHEND,"btnTouchEnd")

Pointbegin=nil

Function btnTouchBegin(e)

Local v=e[1]

Local pointMove=v:locationInView(v:view())

pointMove= cocos2d:CCDirector:sharedDirector():covertoGL(pointMove)

Mc_sprite:setPosition(cocos2d.CCPoint(pointMove.x,pointMove.y))

End

Function btnTouchMove(e)

Local v=e[1]

Local pointMove=v:locationInView(v:view())

pointMove= cocos2d:CCDirector:sharedDirector():covertoGL(pointMove)

Mc_sprite:setPosition(cocos2d.CCPoint(pointMove.x,pointMove.y

End

Function btnTochMove(e)

Cocos2d.CCLuaLog("T_end")

end

CocoDenshion.SimpleAudioEngine:shareEngine():playBackgroundmusic("background3.mp3",true)

CocoDenshion.SimpleAudioEngine:shareEngine():preloadEffect("effect1.wav")

Cocos2d.CCDirector:shareDirector():runwithScnen

(Mc_Scene)

Cocos2d.CCLuaLog("脚本运行结束")

4 结论(Conclusion)

本文使用Lua动态语言进行移动应用程序的设计与开发,把灵活高效的脚本语言应用到移动端应用程序开发,通过其良好的嵌入能力与Android平台和iOS平台结合,利用Cocos2d-x进行应用开发。Lua动态语言能使应用程序的逻辑和与前端视图完全剥离开,不仅大大减少的应用程序的开发周期还使其具有客户端动态更新的功能,又通过Cocos2d-x开发框架与多平台相兼容,降低了开发成本。同时也降低了应用程序的复杂程度,增加了代码的可复用性。

参考文献(References)

[1] Jayant Varma.Lua实战:IOS游戏开发[M].北京:人民邮电出版社,2014:77-78.

[2] 刘剑卓.Cocos2D-X游戏开发技术精解[M].北京:人民邮电出版社,2013:53-54.

[3] 满硕泉.Cocos2D-X权威指南[M].北京:机械工业出版社,2010:26-27.

[4] Ierusalimschy R.Progarmming in Lua[M].北京:电子工业出版社,2006:141-143.

作者简介:

马 超(1991-),男,本科生.研究领域:计算机科学与技术.

马佳琳(1972-),女,硕士,教授.研究领域:计算机科学与技术.