‎Cocos2d-x 学习笔记(14.1) Event EventCustom EventListener

1. Event EventCustom

所有事件类继承了Event。

Event中的枚举,定义了事件的类型:

    enum class Type
    {
        TOUCH, //触摸
        KEYBOARD, //键盘
        ACCELERATION, //加速器
        MOUSE, //鼠标
        FOCUS, //
        GAME_CONTROLLER, // 游戏手柄
        CUSTOM //用户自定义
    };

Event成员变量:

    Type _type; //事件类型   
    bool _isStopped; //事件暂停     
    Node* _currentTarget; //作用的node

Event构造方法:

Event::Event(Type type)
: _type(type)
, _isStopped(false)
, _currentTarget(nullptr)
{}  

EventCustom是自定义事件。比Event多出的成员变量:

    void* _userData;       ///< User data
    std::string _eventName; //自定义事件名

EventCustom构造方法事件类型Type设为CUSTOM。设置_eventName。

EventCustom::EventCustom(const std::string& eventName)
: Event(Type::CUSTOM)
, _userData(nullptr)
, _eventName(eventName)
{
}

3. EventListener

监听器有自己的类型ID,是对该类型ID事件的监听。事件只会被分发到同ID的监听器进行处理。

除了自定义监听器、触摸监听器,其他的监听器ID和事件类型一一对应。自定义监听器ID是自定义事件的事件名。触摸类型是一种,对应两种监听器。

监听器类有枚举,定义监听的事件类型,和Event相比将触摸拆分为单点触摸和多点触摸:

    enum class Type
    {
        UNKNOWN,
        TOUCH_ONE_BY_ONE, //单点触摸
        TOUCH_ALL_AT_ONCE, //多点触摸
        KEYBOARD,
        MOUSE,
        ACCELERATION,
        FOCUS,
        GAME_CONTROLLER,
        CUSTOM
    };

监听器成员变量: 

    std::function<void(Event*)> _onEvent;   /// 处理传入事件的回调函数 Event callback function

    Type _type;                             /// 事件类型 Event listener type
    ListenerID _listenerID;                 /// 监听器ID Event listener ID
    bool _isRegistered;                     /// 注册 Whether the listener has been added to dispatcher.

    int   _fixedPriority;   // 监听器优先级,数值越大优先级越高
    Node* _node;            // 监听器关联的node scene graph based priority
    bool _paused;           // 暂停监听器 Whether the listener is paused
    bool _isEnabled;        // 是否启用 Whether the listener is enabled

监听器的init方法对成员变量进行初始化。

场景图监听器优先级固定为0,在add方法中自动设置。自定义优先级的监听器优先级不得为0。

监听器3个参数

监听器的暂停与否仅用于场景图优先级的监听器。自定义优先级的监听器的暂停标志一直为false。当自定义优先级监听器需要“暂停”,不接收事件时,调用setEnabled(false)即可。

4. EventListenerCustom

自定义事件的监听器有成员:

    std::function<void(EventCustom*)> _onCustomEvent;

用create方法创建时,要监听的事件名作为监听器ID。回调函数作为_onCustomEvent。在init时,_onEvent被设为匿名函数:

auto listener = [this](Event* event){
        if (_onCustomEvent != nullptr)
        {
            _onCustomEvent(static_cast<EventCustom*>(event));
        }
    };

该匿名回调函数是对我们设置的回调函数_onCustomEvent的包装,将事件类型转换成EventCustom。

原文地址:https://www.cnblogs.com/deepcho/p/cocos2dx-event-eventcustom-eventlistener.html