【cocos2dx開發技巧10】cocosStudio的整合以及c++11的新特性,cocos2dx官網
轉寄,請保持地址:http://blog.csdn.net/stalendp/article/details/38880997
很長時間沒有碰cocos2dx了,最近又用起來了,花了好幾個小時重新熟悉了一下,發現很多新的特性值得用來寫文章。好吧,先從最常用的開始。最近用windows,使用cocosStudio,就從這個開始吧,順帶介紹一下工程的建立,以及c++11的特性。以前開發使用cocosBuilder開發介面(相關整合見這篇文章)。
準備工作
1)準備NDK、andrdoid-SDK,VisualStudio等工具。並設定環境變數NDK_ROOT,ANDROID_SDK_ROOT,Path等
2)安裝Python 2.7.x (不是3.x.x);
3)下載cocos2d-x-3.2壓縮包
建立遊戲項目
開啟命令列工具,切換到cocos2d-x-3.2目錄下,執行命令:
1) setup.py, 用來設定環境變數
2)cocos new circleTheLine -p com.evilgame.circleTheLine -l cpp -d x:\your\project\path , 用來建立項目
在2)命令執行完後, x:\your\project\path目錄下,會出現如下內容;點擊proj.win32下的visualStudio工程,就可以開啟項目。
使用CocosStudio建立介面
我這裡只是做一個頁面,所以只選擇UI Editor來製作。
製作的介面如下:
然後把該項目匯出,得到NewUi_1.json,test.png, test.plist檔案。把這三個檔案拷貝到遊戲根目錄下的Resources目錄下。
整合cocos2dx
現在的目標是,當使用者點擊“測試按鈕”後,改變介面上的文字。
1)加入相應的lib工程。
因為cocosStudio的使用,需要依賴於libCocosStudio, libGUI, libExtensions三個庫,具體路徑如下(D:\Program Files\cocos2d-x-3.2\為根目錄)
| libCocosStudio |
D:\Program Files\cocos2d-x-3.2\cocos\editor-support\cocostudio |
| libGUI |
D:\Program Files\cocos2d-x-3.2\cocos\ui\proj.win32 |
| libExtensions |
D:\Program Files\cocos2d-x-3.2\extensions\proj.win32 |
需要修改visualStudio,對它們進行引用,具體如下:
1a) 把上面的三個工程加入“解決方案”中。
右擊項目,在彈出的菜單中選擇 添加/現有項,如下:
1b) 添加引用依賴:(解決連結的問題)
右擊項目,在彈出的菜單中選擇 屬性,在彈出的對話方塊中做如下操作:
1c)添加標頭檔:(解決編譯的問題)
#include "cocostudio/CocoStudio.h"#include "ui/CocosGUI.h"USING_NS_CC;using namespace cocostudio;using namespace ui;
注意,命名空間ui,其實是cocos2d的子命名空間;所以需要寫在USING_NS_CC下面,或者寫成:
using namespace cocos2d::ui;
如果上面路徑無法找到,請按照下面的方法,查看是否包含了相應的路徑。
右擊項目,在彈出的菜單中選擇 屬性,在彈出的對話方塊中做如下操作:
其中@{EngineRoot}是宏變數,用來指定cocos2dx的根目錄(我這裡是D:\Program Files\cocos2d-x-3.2\);標頭檔就是相對於這裡的“附加元件封裝含目錄”的設定的。所以做相應的調整,確保路徑正確。2)顯示該介面:
node = GUIReader::shareReader()->widgetFromJsonFile("NewUi_1.json"); // 這裡的node是類變數if (node == nullptr){return true;}this->addChild(node);// 當然讀取情境檔案,可以用以下的語句// CCNode *pNode = SceneReader::sharedSceneReader()->createNodeWithSceneFile("SceneEditorTest/SceneEditorTest.json"); 3)綁定按鈕事件:
Button* button = static_cast<Button*>(node->getChildByName("btnTest"));button->addTouchEventListener([&](Ref* sender, Widget::TouchEventType type) {if (type == Widget::TouchEventType::ENDED) {// 注意node的生命週期的問題TextBMFont* nn = static_cast<TextBMFont*>(node->getChildByName("displayMsg")); nn->setString("msg changed!!");}});上面的代碼使用了C++11的lambda運算式特性,下面將做介紹。
C++11特性--lambda運算式c++終於可以使用lambda運算式了!這將為編碼帶來極大的方便,上面的例子代碼,很好地體現了。1) 三種方法的對比:寫法1(未用lambda運算式):
auto closeItem = MenuItemImage::create( "CloseNormal.png", "CloseSelected.png", CC_CALLBACK_1(HelloWorld::menuCloseCallback,this)); void HelloWorld::menuCloseCallback(Object* sender) { Director::getInstance()->end(); } 寫法2(lambda函數指標):
auto callEnd = [](Object* sender) { Director::getInstance()->end();//直接在這裡添加按鈕要調用的代碼 }; auto closeItem = MenuItemImage::create( "CloseNormal.png", "CloseSelected.png", allEnd); 寫法3(lambda運算式):
auto closeItem = MenuItemImage::create( "CloseNormal.png", "CloseSelected.png", [](Object* sender) { Director::getInstance()->end();//直接在這裡添加按鈕要調用的代碼 }); 如果要設定運算式能夠訪問外部變數,可以在 [] 內寫入 & 或者 = 加上變數名,其中 & 表示按引用訪問,= 表示按值訪問,變數之間用逗號分隔,比如 [=factor, &total] 表示按值訪問變數 factor,而按引用訪問 total。如果是引用的話,
需要注意該對象的生命週期,回呼函數的生命週期和控制項相同。另外更多技術分享和討論,請加群:385121586
參考:cocosStudio官方教程:http://upyun.cocimg.com/CocoStudio/helpdoc/v1.0.0.0/zh/index.htmlC++11特性:http://blog.csdn.net/star530/article/details/19913611
官方例子中的ExtensionTest/CocoStudioSceneTest/SceneEditorTest.cpp
問java轉cocos2dx遊戲開發的難度、學習曲線?
風險肯定是有的~轉過來又倆問題,一個是沒做過遊戲~整個遊戲邏輯可能有問題~另一個是c++不熟悉,工程項目稍微大一點的話怕記憶體泄露~cocos2d-x肯定是用來做手機遊戲的~萬一有泄露可能整個程式直接崩了~主要怕這個
cocos2dx的android開發遇到的問題
不懂你具體什麼情況,我的都是可以正常匯入的。