您的位置:首页 > 移动开发 > Cocos引擎

Cocos2d-x 3.1.1 学习笔记(一)关联程序逻辑与CocosStudio导出文件

2014-07-09 20:27 751 查看
项目开始启动,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资源载入到程序中了。以下是程序运行结果:



以上过程我参考的资料:cocos2dx 3.0使用CocosStudio项目

2. 实现对Button控件的使用
(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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息