Cocos2d 3.x中button的使用

戴维营教育原创文章,转载请注明出处。我们的梦想是做最好的iOS开发培训!

在Cocos2d-x 3.x中有使用cocosGUI的Widget取代cocos2d-x extension中的控件的趋势,并且开始采用C++ 11中的一些新特性,比如Lambda表达式。下面用cocos2d::ui::Button的使用来展示一下cocosGUI中Widget的使用以及事件的添加。

在cocosGUI中的所有控件都继承自Widget,文件名采用了iOS标准控件类似的命名方法,比如UIButtonUITextField等。这些控件的应该也借鉴了iOS的做法,因此对熟悉iOS应用开发的人来说应该是一件好事。

UIButton是一个用于提供用户点击事件的控件,它能够显示图片和文字标题,并且能够在不同状态(NORMAL和SELECTED)显示不同的图片。用户点击(touch或click)按钮后,会触发一个事件。我们通过给按钮添加事件监听器(EventListener)就可以捕获这个动作。下面先创建一个按钮。

#include <CocosGUI.h>
using namespace ui;

//创建Button对象
Button *btn = Button::create("normal_menu.png", "press_menu.png");
//设置标题,标题属性(字体大小、字体、颜色等)
btn->setTitleText("Go 戴维营教育");
btn->setTitleFontSize(28);
//设置按钮位置
btn->setPosition(Vec2(200, 200));
//设置Tag值,标识按钮,从Widget继承的属性,作用与iOS中UIView的tag值类似。
btn->setTag(1002);
//显示按钮
this->addChild(btn);

按钮在移动平台和PC端监听的事件不同,移动端一般监听Touch事件,而PC端一般监听鼠标的Click事件。

void addTouchEventListener(const ccWidgetTouchCallback& callback);
void addClickEventListener(const ccWidgetClickCallback& callback);

这里的ccWidgetTouchCallback是一个std::function<void(Ref*,Widget::TouchEventType)>类型。我们可以给它设置Lambda表达式或者回调函数。

//1. 设置触摸回调函数
btn->addTouchEventListener(CC_CALLBACK_2(MenuScene::menuCallback, this));

//2. 使用lambda表达式设置回调[]()->{}
//    btn->addTouchEventListener([=](Ref* pSender,Widget::TouchEventType type){
//        log("%p->%d", pSender, type);
//    });

其中回调函数的格式为:

void MenuScene::menuCallback(Ref* pSender, Widget::TouchEventType type)
{
    Button *sender = (Button*)pSender;
    log("%d", sender->getTag());
}

在cocos2d-x 3.3 rc0上测试过。

本文档由长沙戴维营教育整理。

戴维营学院(高级开发视频): http://v.diveinedu.com

潜心俱乐部(iOS面试必备): http://divein.club