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。
监听器的暂停与否仅用于场景图优先级的监听器。自定义优先级的监听器的暂停标志一直为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。