Cocos2d-x 3.1.1 學習筆記(一)關聯程式邏輯與CocosStudio匯出檔案
專案開始啟動,Team leaer要求我先做簡單的事情,熟悉一下背景音樂和音效的函式。
由於Cocos2d-x的版本更新,網路上我找到的教程不太適合我配置的Cocos2d-x的版本,所以我把我實現的過程寫一下。我使用的是cocos2d-x-3.1.1
個人認為,Cocos Studio是一個挺強大的工具集,工具集中的每一個編輯器都是面向特定的人員而定製的。通過在工具層面的分工,可以使每一個工作崗位的工作相互獨立,減少相互之間的耦合性,使每一個工作人員能夠專心於自己的業務。那如何使用CocosStudio建立UI並載入到程式中,不妨參照一下該教程
我覺得這個系列的教程都寫得很好,只是版本不太適合3.1.1而已。而且UI載入到程式中的程式碼有點問題。
1. UI載入到程式中
(1) 先新增需要的庫
由於cocos2d-x3.0工作目錄是放在其它地方,所以要引用 libCocoStuido、libGUI、libExtension這三個庫。
新增庫方法:在“解決方案資源管理器”中找到整個解決方案,右擊,選擇“新增”->“現有專案”
選擇“%你的Cocos2d-x路徑%\cocos\editor-support\cocostudio\proj.win32\libCocosStudio”
選擇“%你的Cocos2d-x路徑%\cocos\ui\proj.win32\libGUI”
選擇“%你的Cocos2d-x路徑%\extensions\proj.win32\libExtensions”
(2)新增引用
找到目標專案(我的是“HelloStudio”), 右擊,選擇"引用",在彈出的屬性頁中點選下面的“新增新引用”。在彈出的子級對話方塊中選擇我們需要的庫,點選確定,即可新增專案對庫的引用。
(3)新增包含目錄
右擊專案->屬性->配置屬性->c/c++->常規->加入包含目錄。編輯,新增“$(EngineRoot)cocos\editor-support”和“$(EngineRoot)cocos”。
(4)引入標頭檔案 #include "cocostudio\CocoStudio.h"
(5)更改HelloWorld類中的init()方法
<span style="font-size:14px;">bool HelloWorld::init()
{
//////////////////////////////
// 1. super init first
if ( !Layer::init() )
{
return false;
}
Size visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();
auto uiLayer = cocostudio::GUIReader::getInstance()->widgetFromJsonFile("NewUi/NewUi_1.ExportJson");
this->addChild(uiLayer);
return true;
}</span>
現在已經將UI資源載入到程式中了。以下是程式執行結果:
(1)找到資源中的Button。
我在CocosStudio中將三個按鈕分別命名為"Play","Pause","Effect",可以根據它們的名字找到它們。繼續在HelloWorld類中的init()方法中新增以下程式碼
//找到資源中的按鈕///////
Button* playbutton = static_cast<Button*>(Helper::seekWidgetByName(uiLayer,"Play"));
Button* pausebutton = static_cast<Button*>(Helper::seekWidgetByName(uiLayer,"Pause"));
Button* effectbutton = static_cast<Button*>(Helper::seekWidgetByName(uiLayer,"Effect"));
其實除了通過名字找到它們,還可通過它們的tag找到它們
這裡Helper是用來尋找資源裡對應的控制元件,它的尋找方式有三種:
static Widget* seekWidgetByTag(Widget* root, int tag);//通過tag找到該控制元件
static Widget* seekWidgetByName(Widget* root, const char* name);//通過名稱找到該控制元件
static Widget* seekActionWidgetByActionTag(Widget* root, int tag);//通過tag找到該動作
除此之外,這裡用到的Button不是Cocos2d的類,需要新增別的標頭檔案。同時,為了使用省事一點,我也檔案中聲明瞭作用域。
#include "ui\CocosGUI.h"
using namespace cocos2d::ui;
(2)然後繫結事件監聽,貌似有人說這個過程是就是掛載,不太清楚~
playbutton->addTouchEventListener(this, toucheventselector(HelloWorld::touchButton));
pausebutton->addTouchEventListener(this, toucheventselector(HelloWorld::touchButton));
effectbutton->addTouchEventListener(this, toucheventselector(HelloWorld::touchButton));
(3)接著實現對Button事件的響應。
先在HolloWorld類中定義void touchButton(Object *pSender, TouchEventType type)函式,實現如下:
void HelloWorld::touchButton(Object *pSender, TouchEventType type)
{
auto button = static_cast<Button*>(pSender);
string name = button->getName();
switch (type)
{
case TOUCH_EVENT_ENDED:
if( name == "Play")
CCLOG("touch play");
else if( name == "Pause")
CCLOG("touch pause");
else if( name == "Effect")
CCLOG("touch effect");
break;
default:
break;
}
}
執行後,可以在 除錯輸出那裡看到結果。
那TouchEventType是神馬東東呢,其實就是一些觸控回撥,可以檢視一下標頭檔案:typedef enum
{
TOUCH_EVENT_BEGAN,
TOUCH_EVENT_MOVED,
TOUCH_EVENT_ENDED,
TOUCH_EVENT_CANCELED
}TouchEventType;
對於Button的使用的實現基本如上。 我參看的資料有:關聯程式邏輯與CocosStudio匯出檔案 和Button和CheckBox控制元件的使用流程3.使用背景音樂和音效
最後是為了完成Leader的要求,還是要加一下對背景音樂和音效的函式使用。具體的背景音樂和音效的函式可以參考背景音樂和音效,非常詳細!絕對是業界良心~~O(>_<)O
①使用CocosDenshion
#include "SimpleAudioEngine.h"
using namespace CocosDenshion;
②在init()方法中先預載入背景音樂和音效。
SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic("music/bgm.mp3");
SimpleAudioEngine::sharedEngine()->preloadEffect("music/sound2.wav");
③利用touchButton()響應接觸的方法來實現void HelloWorld::touchButton(Object *pSender, TouchEventType type)
{
auto button = static_cast<Button*>(pSender);
string name = button->getName();
switch (type)
{
case TOUCH_EVENT_ENDED:
if( name == "Play")
{
SimpleAudioEngine::sharedEngine()->playBackgroundMusic("music/bgm.mp3", true);
}
else if( name == "Pause")
{
SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic();
}
else if( name == "Effect")
{
SimpleAudioEngine::sharedEngine()->playEffect("music/sound2.wav",false);
}
break;
default:
break;
}
}