在Cocos2d-x 3.x中有使用cocosGUI的Widget取代cocos2d-x extension中的控件的趋势,并且开始采用C++ 11中的一些新特性,比如Lambda表达式。下面用cocos2d::ui::Button
的使用来展示一下cocosGUI中Widget的使用以及事件的添加。
在cocosGUI中的所有控件都继承自Widget
,文件名采用了iOS标准控件类似的命名方法,比如UIButton
、UITextField
等。这些控件的应该也借鉴了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上测试过。
本文档由长沙戴维营教育整理。