事件机制是引擎非常重要的一部分,关于事件,引擎需要解决以下几个问题:是否发生了事件?发生了什么事件?事件是否需要处理?事件给谁处理?
个人理解的事件:当出现来自鼠标,键盘,触屏,摇杆等输入源的输入时,这个事实称之为事件
无论需不需要处理事件,引擎无时无刻都在感受事件,一旦有事件发生,就会调用EventDispatcher::dispatchEvent(Event* event),来判断事件是否需要处理,给谁处理的后续问题。当在屏幕上任意位置单击鼠标后,即进入dispatchEvent,此时event的类型为TOUCH
查看调用堆栈可知,在循环中每一帧会调用pollEvents来检测外部事件.
class CC_DLL Event : public Ref
{
public:
/** Type Event type.*/
enum class Type
{
TOUCH,
KEYBOARD,
ACCELERATION,
MOUSE,
FOCUS,
GAME_CONTROLLER,
CUSTOM
};
//省略非重要部分
Type _type; ///< Event type
bool _isStopped; ///< whether the event has been stopped.
Node* _currentTarget; ///< Current target
}
Event主要包含了三个重要的变量,type定义事件类型;isStopped定义该event是否已经停止,当一个event发生停止时,与其相关的Listener都要停止callback的调用;currentTarget保存与该Event相关的node
对于事件类型,由于实际项目通常只有来自触摸的输入源,所以最常用到的是TOUCH类型
TOUCH和MOUSE的区别是鼠标移动,滚动,右击等来自鼠标的操作都是MOUSE事件,触摸的方式输入的事件是TOUCH类型.