馬超 馬佳琳

摘 要:Lua腳本語言技術給Coco2d-x開發,帶來了新的天地。通過Lua腳本語言開發Cocos2d-x應用,擺脫了C/C++開發的繁瑣代碼,使得開發變得快速高效又能同時在多個平臺運行,Lua腳本語言的可拓展性,可以使它很好的集成在應用程序中。同時Lua語言在開發成為控制器??刂茟贸绦虻倪壿嫸鳦oco2d-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-),女,碩士,教授.研究領域:計算機科學與技術.