Cocos2d-x和lua

什麼要使用Lua進行遊戲開發?轉載請註明出處http://www.cnblogs.com/zisou/p/cocos2dx-lua1.htmlhtml

上面一個問題我以爲在咱們使用Lua以前須要深刻思考的,Lua有何優勢?缺點又是什麼?先找準本身的項目定位android

在何時使用是很必要的;編程

通過本身一番摸索以後有以下結論:xcode

優勢:app

1,嵌入式腳本開發能夠跳過平臺市場進行獨立的遊戲資源更新;框架

2,在使用Lua開發能下降在使用C++中得指針引用報錯,nil類型問題;eclipse

3,可使用Lua表結構來完成面向對象;ide

還有一個項目定位的問題,那就是開發遊戲,用全Lua,仍是C++綁定Lua呢?工具

全Lua:post

若是使用全Lua,我建議徹底使用Cocos2d-x觸控官方收購了成都的Quick-Cocos2dx!用Quick開發優點就一個

字!快!官方提供的框架(quicklua包)目前是2.2版本(3.0之後也會同步),之後我會補上配置Quick開發的環境;

C++綁定Lua:

在項目定位中,只有一部分模塊(活動等)須要使用Lua開發,那就必須半路出家,從中途綁定上Lua,進行C++和

Lua的交叉開發,這種綁定開發是比較流行的,由於C++能利用Lua的優點實現自更新,Lua也能依賴C++藉助它的

底層開發能力完成相對複雜的開發;

上面對Lua的使用作了個概述,下面直接進行重要環節了,將會在xcode和eclipse上實現cocos2dx+lua!

本篇可能有點長,自帶小板凳,瓜子觀看;

———————————————————————————————————————————————————

使用版本Cocos2dx2.2版本,

Xcode中手動綁定 Cocos2dx+lua:

1,首先新建一個cocos2dx新工程,怎麼建均可以,最終能再Xcode運行起來都行;

2,新建好後在libs文件夾下面添加Lua的libs包;

這個是我用xcode新建出來的Lua項目,裏面自帶了一個包Lua文件夾;

也可使用cocos2dx自帶:

對比後發現用了4個目錄,cocos2dx_support,lua,luajit,tolua

3,添加完成以後點Run會報錯,是由於缺乏CocoStudio這個庫,若是你項目之後要使用CocoStudio那就再把庫導進來,若是不用

那就直接註釋掉CocoStudio相關的就能夠跑起來了!

4,OK跑起來以後,咱們就可使用Lua腳本了,咱們先簡單寫一個測試的(功能爲在C++加載一個CClayer,CClayer中有一個

背景精靈圖片)

(一)首先咱們須要先把lua腳本代碼寫出來

testlua.lua

複製代碼
-- for CCLuaEngine traceback
function __G__TRACKBACK__(msg) print("----------------------------------------") print("LUA ERROR: " .. tostring(msg) .. "\n") print(debug.traceback()) print("----------------------------------------") end

local function main() -- avoid memory leak
    collectgarbage("setpause", 100) collectgarbage("setstepmul", 5000) local cclog = function(...) print(string.format(...)) end
    
    local visibleSize = CCDirector:sharedDirector():getVisibleSize() local origin = CCDirector:sharedDirector():getVisibleOrigin() local function createLayerMap() local layerWroldMap = CCLayer:create() local bg = CCSprite:create("luaimg/bd.jpg") bg:setPosition(origin.x + visibleSize.width / 2 + 80, origin.y + visibleSize.height / 2) layerWroldMap:addChild(bg,1) return layerWroldMap end CCDirector:sharedDirector():getRunningScene():addChild(createLayerMap(),3,1) end

xpcall(main, __G__TRACKBACK__)
複製代碼

若是你有一些編程經驗,學習lua,js這種腳本語言是很輕鬆的,去網上下載Lua教程能夠先了解一下!

(二)在以前我已經寫了一個單例方法使用的PublicLuaTodo類,主要就是引用官方給咱們提供的CCLuaEngine(Lua支持引擎)

這是一個在cocos2dx中操做Lua的中間件工具類,我已經封裝好了,怎麼去使用Lua的方法;

下面我直接貼代碼:

PublicLuaTodo.h

複製代碼
#include "cocos2d.h"
#include "script_support/CCScriptSupport.h"
#include "../../../lua/cocos2dx_support/CCLuaEngine.h"
#include <string> using namespace std; USING_NS_CC; class PublicLuaTodo:public CCObject { public: PublicLuaTodo(void); ~PublicLuaTodo(void); static PublicLuaTodo* getInstance(); //執行lua文件 static void toDoLuaFile(string luapath); //執行lua語句 static void toDoLuaString(string luastring); //執行一個lua全局的方法 static void toDoLuaGlobalFunction(string founctionname); private: static PublicLuaTodo* m_instance; };
複製代碼

PublicLuaTodo.cpp

複製代碼
#include "PublicLuaTodo.h" CCLuaEngine* pEngine; PublicLuaTodo* PublicLuaTodo::m_instance = NULL; PublicLuaTodo* PublicLuaTodo::getInstance() { if(!m_instance) { m_instance = new PublicLuaTodo(); } return m_instance; } PublicLuaTodo::PublicLuaTodo() { pEngine = CCLuaEngine::defaultEngine(); CCScriptEngineManager::sharedManager()->setScriptEngine(pEngine); } void PublicLuaTodo::toDoLuaFile(string luapath) { std::string path = CCFileUtils::sharedFileUtils()->fullPathForFilename(luapath.c_str()); pEngine->executeScriptFile(path.c_str()); } void PublicLuaTodo::toDoLuaString(string luastring) { pEngine->executeString(luastring.c_str()); } void PublicLuaTodo::toDoLuaGlobalFunction(string founctionname) { pEngine->executeGlobalFunction(founctionname.c_str()); } PublicLuaTodo::~PublicLuaTodo(void) { if(!pEngine) { pEngine=NULL; } }
複製代碼

上圖是我工程所有準備好的結構;

(三)執行咱們已經運寫好的Lua文件:

    string luafile = "test/test.lua"; PublicLuaTodo::getInstance()->toDoLuaFile(luafile);

我把上段代碼寫到了helloapp裏面的關閉方法中, 很方便就能運行起來Lua新加的層!

5,使用toLua++ 工具類實如今Lua中調用C++方法

(一)在工程中我還引入了一個作適配的類VisbleRect.h是C++寫的,主要做用是獲取屏幕各個方向上的座標,

方便使用適配後的座標點。要使用這個類cocos2dx提供了工具tolua方法,原理就是通這tolua++IPA調用經過

本身建立的XX.pkg文件,生成出對應供lua調用的類LuaCocos2d.cpp接口,lua能對應尋找對應方法在Lua中

使用。

(二)編寫須要調用的XX.pkg文件:

定位到:/Users/youmacname/cocos2dx.2.2/cocos2d-x-2.2/tools/tolua++ 中,並在該目錄下編寫VisbleRect.pkg文件

編寫規則參見README翻譯以下:  
  1) enum keeps the same
    2) remove CC_DLL for the class defines, pay attention to multi inherites
    3) remove inline keyword for declaration and implementation
    4) remove public protect and private
    5) remove the decalration of class member variable
    6) keep static keyword
    7) remove memeber functions that declared as private or protected

VisbleRect.pkg

  View Code


(三)修改/cocos2dx.2.2/cocos2d-x-2.2/tools/tolua++ 中的Cocos2d.pkg,添加$pfile "VisibleRect.pkg"這一行

(四)繼續修改以下路徑:

定位到:/cocos2dx.2.2/cocos2d-x-2.2/tools/tolua++/下

Makefile文件

 

Cocos2d.pkg文件

修改爲你本身想生成的路徑

(五)打開終端運行./build.sh ,編譯生成新的帶接口的LuaCocos2d.cpp

(六)將新生成的LuaCocos2d.cpp複製到咱們工程目錄下

對應工程目錄

/Users/youmacname/myluatest/myluatest/libs/lua/cocos2dx_support/

替換掉原有的LuaCocos2d.cpp

(七)這時直接xcodex運行run會報錯,須要在工程裏面LuaCocos2d.cpp中添加VisbleRect.h頭文件的路徑。

#include "/Users/youmacname/myluatest/myluatest/Classes/VisibleRect.h"

再點Run就不會報錯了,到這一步應該也瞭解了整個Cococs2dx運行Lua的原理和機制!

恭喜你可使用VisibleRect裏面所提供的靜態方法了!意味着Lua也能夠調用C++了!!

咱們來實際在Lua中操做一下

修改test.lua

  View Code

OK,改完以後Run一下

到如今爲止咱們已經完成了在xcode上面綁lua並使用tolua++調用C++的方法!

———————————————————————————————————————————————————

Android 上面綁Lua

若是你沒有配置過mac上的android環境,那麼請看這篇【cocos2d-x 環境配置-Mac配置篇】

1,一樣也是先建立一個新工程;

 ./create_project.py -project XXX-package com.xxx.XXX -language cpp

2,將剛纔咱們在xcode上寫的東西新加的類都移植(複製對應目錄就行),並編寫對應的.mk文件

3,工程可能會報錯,先導入libPluginPrptocol Cocos2dx提供的擴展包

/Users/youmacname/cocos2dx.2.2/cocos2d-x-2.2/plugin/protocols

右鍵myluatest 工程->Android->library ->add libPluginPrptocol進來

4,這步是重要環節,也是理解android工程中綁lua是如何工做的!

相關文章
相關標籤/搜索