首页 > 代码库 > cocos2d-x 3.0 事件分发机制

cocos2d-x 3.0 事件分发机制

在cocos2d-x 3.0中一共有五个事件监听器:

  • 触摸事件(EventListenerTouch)
  • 键盘响应事件 (EventListenerKeyboard)
  • 加速器记录事件(EventListenerAcceleration)
  • 鼠标响应事件(EventListenerMouse)
  • 自定义事件(EventListenerCustom)

顾名思义,就是分别监听touch,key、加速器、mouse和自定义的事情。

对于加速器记录事件,现在基本上没有接触到这方面,就先略过吧。。。

触摸事件:

给一个精灵加一个触摸事件:

    auto sprite1 = Sprite::create("Images/1.png");    sprite2->setPosition(origin+Vec2(size.width/2, size.height/2));    addChild(sprite2, 20);    //创建一个单点触摸事件    auto listener1 = EventListenerTouchOneByOne::create();    listener1->setSwallowTouches(true);        //实现touchBegin方法    listener1->onTouchBegan = [](Touch* touch, Event* event){        return true;    };        listener1->onTouchMoved = [](Touch* touch, Event* event){          };        listener1->onTouchEnded = [](Touch* touch, Event* event){           };        //添加事件    _eventDispatcher->addEventListenerWithSceneGraphPriority(listener1, sprite1);    

这里touch方法的写法用到了lambda,不熟悉的可以自己去看一下。。。

添加事件的方法有两个,一个是addEventListenerWithSceneGraphPriority(此时时间分派的优先级根据精灵在界面上的显示优先级来的,即在界面上前面的精灵先响应,后面的精灵后响应),一个addEventListenerWithFixedPriority(此时是传入优先级参数给函数,优先级数字越小优先级越大)。

当我们需要再次使用listener的时候,需要使用clone()方法创建一个新的克隆,因为在使用因为在使用 addEventListenerWithSceneGraphPriority  或者  addEventListenerWithFixedPriority  方法时,会对当前使用的事件监听器添加一个已注册的标记,这使得它不能够被添加多次。另外,有一点非常重要,FixedPriority listener添加完之后需要手动remove,而SceneGraphPriority listener是跟node绑定的,在node的析构函数中会被移除。

 

键盘响应事件

对于键盘响应事件,先上代码:

    auto listener = EventListenerKeyboard::create();    listener->onKeyPressed = [](EventKeyboard::KeyCode keyCode, Event* event){        char buf[100] = {0};        sprintf(buf, "Key %d was pressed!", (int)keyCode);        auto label = static_cast<Label*>(event->getCurrentTarget());        label->setString(buf);    };        listener->onKeyReleased = [](EventKeyboard::KeyCode keyCode, Event* event){        char buf[100] = {0};        sprintf(buf, "Key %d was released!", (int)keyCode);        auto label = static_cast<Label*>(event->getCurrentTarget());        label->setString(buf);    };        _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, statusLabel);

这里主要有两个方法,一个响应键盘按下,一个响应键盘松开,以后安卓机器写双击退出游戏,直接用这个就好了。。。

 

自定义事件

这个是最重要的了,所谓自定义事件就是人为定义的一些事件,不是由系统来触发的,代码如下:

   _listener = EventListenerCustom::create("game_custom_event1", [=](EventCustom* event){        std::string str("Custom event 1 received, ");        char* buf = static_cast<char*>(event->getUserData());        str += buf;        str += " times";        statusLabel->setString(str.c_str());    });        _eventDispatcher->addEventListenerWithFixedPriority(_listener, 1);

很简单,写个事件名称和事件响应函数就好了,那么自定义事件是怎么触发的呢?

_eventDispatcher->dispatchEvent(&event);

直接在需要触发的地方dispatch一下就好了。。。

挺简单的,但是很多地方都可以用到的。

 

我这里只是简单地记了一下,test里的NewEventDispatcherTest例子里面写得很清楚,最好自己去看一下。。。