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资源载入到程序中了。以下是程序运行结果:


以上过程我参考的资料: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;
	}
 }





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值