馬超 馬佳琳
摘 要:Lua腳本語言技術(shù)給Coco2d-x開發(fā),帶來了新的天地。通過Lua腳本語言開發(fā)Cocos2d-x應(yīng)用,擺脫了C/C++開發(fā)的繁瑣代碼,使得開發(fā)變得快速高效又能同時(shí)在多個(gè)平臺(tái)運(yùn)行,Lua腳本語言的可拓展性,可以使它很好的集成在應(yīng)用程序中。同時(shí)Lua語言在開發(fā)成為控制器。控制應(yīng)用程序的邏輯而Coco2d-x之提供顯示功能和跨平臺(tái)功能。這樣開發(fā)不僅可以動(dòng)態(tài)修改客戶端BUG,而且還能動(dòng)態(tài)更新應(yīng)用內(nèi)容避免了更新帶來的客戶流失。Lua語言免費(fèi)、小巧、快速易移植降低了開發(fā)成本又保證了應(yīng)用性能。
關(guān)鍵詞:Coco2d-x;動(dòng)態(tài)更新;Lua;跨平臺(tái)開發(fā)
中圖分類號(hào):TP368.1 文獻(xiàn)標(biāo)識(shí)碼: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++語言的移動(dòng)端應(yīng)用程序開發(fā)的開源框架。Cocos2d-iPhone項(xiàng)目的C++版本[1]。Cocos2d-x開發(fā)框架用C++語言重寫了Cocos2d開發(fā)框架從而實(shí)現(xiàn)應(yīng)用開發(fā)跨平臺(tái),在跨平臺(tái)移動(dòng)端應(yīng)用開發(fā)中Cocos2d-x框架被大量使用[2]。其開發(fā)的手機(jī)應(yīng)用,可以在C++或者Lua中編寫。Cocos2d-x項(xiàng)目能夠兼容iOS操作系統(tǒng),Android操作系統(tǒng),黑莓Blackberry操作系統(tǒng)等。在PC端Cocos2d-x開發(fā)框架支持的操作系統(tǒng)包括Linux操作系統(tǒng)、Mac操作系統(tǒng)和Windows操作系統(tǒng)等PC端操作系統(tǒng),因此,Cocos2d-x能夠在PC端操作系統(tǒng)中可以進(jìn)行編輯和調(diào)試使得其在開發(fā)中變得高效快捷[3]。
2 基于Lua動(dòng)態(tài)腳本語言Coco2d-x應(yīng)用開發(fā)的關(guān)鍵技術(shù)(The key technology of Cocos2d-x application development based on the dynamic scripting language Lua)
(1)Lua技術(shù)
Lua是一個(gè)小巧的動(dòng)態(tài)語言。Lua動(dòng)態(tài)語言的設(shè)計(jì)初衷,為應(yīng)用程序開發(fā)提供訂制功能與靈活的拓展。作為腳本語言它具有輕量、可拓展、簡潔等特點(diǎn)[4]。因?yàn)镃++語言與Lua腳本語言具有良好交互能力??梢詮?fù)雜繁瑣的C++開發(fā)變?yōu)楹唵慰旖莸腖ua語言開發(fā)。
(2)Lua與C++交互技術(shù)
Lua動(dòng)態(tài)腳本語言與C++語言的通訊分為兩部分,首先是Lua動(dòng)態(tài)語言通過Lua Binding訪問C++語言中的類庫或者函數(shù)以及傳遞參數(shù),其次分是C++語言回調(diào)Lua C API訪問Lua的函數(shù)以及傳遞參數(shù)。
(3)Cocos2d-x開發(fā)手機(jī)應(yīng)用技術(shù)
在實(shí)際開發(fā)中,使用Cocos2d-x框架進(jìn)行移動(dòng)端應(yīng)用程序開發(fā),依賴其可以和平臺(tái)完美兼容,使其項(xiàng)目可以做到多個(gè)平臺(tái)一套代碼,多個(gè)平臺(tái)一個(gè)版本避免了多平臺(tái)版本不統(tǒng)一的尷尬。通過與之相配套的CocosStdioUI編輯快速生成plist文件可視化進(jìn)行界面布局提高實(shí)際項(xiàng)目中的開發(fā)效率,讓應(yīng)用開發(fā)變得更加迅捷高效開發(fā)。
3 基于Lua動(dòng)態(tài)腳本語言Coco2d-x應(yīng)用開發(fā)的應(yīng)用
與實(shí)現(xiàn)(The use and implementation of Cocos2d-x
application development based on the dynamic
scripting language Lua)
3.1 Lua與C++的交互技術(shù)實(shí)現(xiàn)
在C++中初始化Lua:
Lua_State * L=lua_open(); //初始化Lua環(huán)境
void CCinitLua() {
lua_openlibs(L); //載入Lua全部標(biāo)準(zhǔn)庫
}
完成在C++來執(zhí)行Lua文件。Lua被嵌入到C++程序中,起到一個(gè)黏合作用。而Cocos2d-x框架其強(qiáng)大的功能分別來自于不同的類庫。Lua動(dòng)態(tài)語言在程序開發(fā)中作為整個(gè)應(yīng)用程序的邏輯控制器,在開發(fā)中Lua腳本語言充當(dāng)大腦而開發(fā)框架充當(dāng)肢體。以消息機(jī)制為例,通過調(diào)用C++語言的函數(shù)達(dá)到,回調(diào)Lua動(dòng)態(tài)語言函數(shù)。以C++繪制函數(shù)為例,C++通過繪制函數(shù)傳輸一個(gè)消息給Lua語言,當(dāng)繪制函數(shù)進(jìn)行重繪時(shí)也就在Lua語言中執(zhí)行相同的函數(shù)。這樣就可以在書法簡練沒有類型的Lua中編寫C++代碼,省去了C++的復(fù)雜語法從而有擁有了C++的強(qiáng)大功能。通過這個(gè)方式就能夠?qū)崿F(xiàn)其他事件機(jī)制。
動(dòng)態(tài)腳本語言Lua調(diào)用C++接口時(shí),進(jìn)行參數(shù)傳遞,回調(diào)結(jié)果的獲取。需要把C++中函數(shù)位置通過指定的方式傳達(dá)給Lua語言。在Lua調(diào)用C++,C++從棧中找到交互的棧,從而獲取其中的參數(shù),調(diào)用結(jié)束后將返回結(jié)果信息放入棧中。在當(dāng)Lua語言中繪制函數(shù)被調(diào)用時(shí),同時(shí)也調(diào)用了C++中做相應(yīng)處理的函數(shù),這樣動(dòng)態(tài)語言Lua與C++的交互就是實(shí)現(xiàn)的。
3.2 Lua與Cocos2d-x交互
Cocos2d-x具體來說更像是一個(gè)類庫的合集其中把圖形渲染和多媒體播放甚至物理引擎,分解集合成一個(gè)lib。通過C++調(diào)用這個(gè)lib中的具體方法而實(shí)現(xiàn)快速的手機(jī)應(yīng)用開發(fā)的框架。通過Lua動(dòng)態(tài)語言嵌入到Cocos2d-x開發(fā)框架中,并與其良好的結(jié)合。達(dá)到了在腳本中開發(fā)跨平臺(tái)手機(jī)應(yīng)用。
3.3 利用Cocos2d-x開發(fā)應(yīng)用
目前移動(dòng)端操作系統(tǒng)主要有iOS操作系統(tǒng),Android操作系統(tǒng)。移動(dòng)應(yīng)用程序開發(fā)需要使用Cocos2d-x進(jìn)行開發(fā)可以避免一款程序多套代碼的尷尬。
(1)利用Lua+Coco2d-x開發(fā)Android應(yīng)用
通過Native Development Toolkit(NDK)我們可以在eclipse里面集成外部庫(比如Cocos2d-x),使用C/C++來編寫Android程序。這些庫被編譯成動(dòng)態(tài)庫通過JNI(Java Native Interface)與Java Android體系程序進(jìn)行交互。下面有兩種使用方法:
①獨(dú)立模式:直接在makefile中使用arm-linux-androideabi-g++。
②集成模式:使用$NDKROOT/ndk-build shell工具,它是一種高度可定制的makefile,專門為NDK庫所設(shè)計(jì)的。
首先修改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開發(fā)iOS應(yīng)用
在Mac操作系統(tǒng)終端中填入:
cd $COCOS2DX_HOME
sud./install-templates-xcode.sh-u
在Cocos2d-x框架安裝成功以后在Xcode中會(huì)出現(xiàn)新的Cocos2d-x模板選擇即可創(chuàng)建新的工程。由于lua語言不能直接與Objective-C交互,所以我們使用Lua Bingding和C/C++交互。同時(shí)C++和Objective-C可以混編,使用C++可以直接調(diào)用Objective-C,讓C++作為Lua和Objective-C交互的橋梁(圖1)。
(3)Lua開發(fā)應(yīng)用
我們通過用Lua動(dòng)態(tài)語言創(chuàng)建場景、層、精靈來實(shí)現(xiàn)應(yīng)用中的一個(gè)通過用戶觸摸圖片跟隨用戶手指移動(dòng)的功能。
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("腳本運(yùn)行結(jié)束")
4 結(jié)論(Conclusion)
本文使用Lua動(dòng)態(tài)語言進(jìn)行移動(dòng)應(yīng)用程序的設(shè)計(jì)與開發(fā),把靈活高效的腳本語言應(yīng)用到移動(dòng)端應(yīng)用程序開發(fā),通過其良好的嵌入能力與Android平臺(tái)和iOS平臺(tái)結(jié)合,利用Cocos2d-x進(jìn)行應(yīng)用開發(fā)。Lua動(dòng)態(tài)語言能使應(yīng)用程序的邏輯和與前端視圖完全剝離開,不僅大大減少的應(yīng)用程序的開發(fā)周期還使其具有客戶端動(dòng)態(tài)更新的功能,又通過Cocos2d-x開發(fā)框架與多平臺(tái)相兼容,降低了開發(fā)成本。同時(shí)也降低了應(yīng)用程序的復(fù)雜程度,增加了代碼的可復(fù)用性。
參考文獻(xiàn)(References)
[1] Jayant Varma.Lua實(shí)戰(zhàn):IOS游戲開發(fā)[M].北京:人民郵電出版社,2014:77-78.
[2] 劉劍卓.Cocos2D-X游戲開發(fā)技術(shù)精解[M].北京:人民郵電出版社,2013:53-54.
[3] 滿碩泉.Cocos2D-X權(quán)威指南[M].北京:機(jī)械工業(yè)出版社,2010:26-27.
[4] Ierusalimschy R.Progarmming in Lua[M].北京:電子工業(yè)出版社,2006:141-143.
作者簡介:
馬 超(1991-),男,本科生.研究領(lǐng)域:計(jì)算機(jī)科學(xué)與技術(shù).
馬佳琳(1972-),女,碩士,教授.研究領(lǐng)域:計(jì)算機(jī)科學(xué)與技術(shù).