码迷,mamicode.com
首页 > 其他好文 > 详细

cocos2d-x 3.0 事件分发机制

时间:2014-08-21 18:45:14      阅读:216      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   使用   os   io   strong   ar   

在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例子里面写得很清楚,最好自己去看一下。。。

 

cocos2d-x 3.0 事件分发机制,布布扣,bubuko.com

cocos2d-x 3.0 事件分发机制

标签:style   blog   color   使用   os   io   strong   ar   

原文地址:http://www.cnblogs.com/hyd5648/p/3927571.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!