cocos2dx3.x的所有事件总结

  次阅读 来源:互联网(转载协议) 2015-09-27 15:30 我要评论(0)

事件系统,是一个软件的核心组成部分。从小处讲它是应用程序内部各模块交互的设计模式,从大处讲,它是软件架构的组成模块。在现代软件开发中,操作系统通常通过一些预定义的事件,告知应用程序发生的一些事情如用户输入,内存不足等。

然而,通常我们并不直接使用系统事件,例如一个界面可能不同区域的元素对触摸事件的理解都不一样,在某些情况下需要优先处理某些逻辑,这就需要对系统事件再包装,以应对界面复杂的元素和逻辑。另一方面,我们需要一个事件系统用来在应用程序内部分发消息,例如当敌人进入攻击范围时通知英雄射击,当敌人血量低于0时播放死亡动画等等。这些都需要游戏引擎提供一个灵活的事件系统,它既能管理分发系统事件,还能借助其简单管理自定义事件。

Cocos2d-x 3.0将所有的事件统一集中到EventDispatcher中处理,它不光改进了触摸等系统事件的管理和使用方式,还使得我们可以借助其处理程序自定义的事件。本章将学习相关的内容。

5.1 事件类型

要处理一个事件,首先得定义一个事件类型。事件系统总是按类型而不是实例来处理事件的订阅和分发,这样使得同一个事件可以有多个订阅者。Event是所有事件的基类,它用一个字符串来表示该事件的类型。我们不应该直接使用Event,而应该从它继承实现自定义事件。事件类型通常不是一个变量,以保证相同类型的事件实例拥有相同的类型,但EventCustom除外,它可以在初始化的时候指定不同的类型,这是为了简化编写事件类型。以下是Event类的定义:

class Event

{

protected:

Event(const std::string& type);

public:

virtual ~Event();

inline const std::string& getType() const { return _type; };

inline void stopPropagation() { _isStopped = true; };

inline bool isStopped() const { return _isStopped; };

inline Node* getCurrentTarget() { return _currentTarget; };

protected:

inline void setCurrentTarget(Node* target) { _currentTarget = target; };std::string _type;

bool _isStopped;

Node* _currentTarget;

friend class EventDispatcher;

};

实际上Event的成员应该仅包含一个表示类型的字符串,然而在Cocos2d-x中有些事件的分发如触摸可能和Node的层级相关,所以它还包含一个获取关联元素的方法:getCurrentTarget();另外它还是EventDispatcher的友元,这是为了方便处理触摸等事件分发,这些都会在本章后面分析。

一个Event实例实际上是事件传递过程中的数据,它由事件触发者构造,并传递给事件分发器,事件分发器根据其类型分别通知所有订阅该类型事件的订阅者,并将其作为参数传递给订阅者。因为事件是一种异步通信机制,它通常没有回调,甚至一个类型的事件可能不包含任何订阅者,这就需要事件的触发者向接受者传递相关的上下文数据,接受者才能正确处理,例如EventTouch对象中会包含触摸点的信息,以便于订阅者处理逻辑。

Cocos2d-x引擎自带的事件类型包括:EventTouch,EventKeyboard,EventAcceleration,以及便于开发者自定义事件的EventCustom。

5.2 事件的订阅者

订阅者负责处理事件,它的成员包含一个订阅事件的类型(这个类型应该和对应的Event的类型一致),以及一个回调方法用来处理事件。这两个成员都应该只被事件分发器(EventDispatcher)使用,所以它们被定义为受保护的成员,同时EventListener被定义为EventDispatcher的友元:

class EventListener : public Object

{

protected:

EventListener();

bool init(const std::string& t, std::functioncallback);

public:

virtual ~EventListener();

virtual bool checkAvaiable() = 0;

virtual EventListener* clone() = 0;

protected:

std::function _onEvent;

本站部分文章来源于网络以及网友投稿,本站只负责对文章进行整理、排版、编辑,是出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。如果您有什么意见或建议,请联系QQ28-1688-302!

人工智能实验室
相关文章相关文章
  • Michael I. Jordan带你解读百万奖金ATEC蚂蚁人工智能大赛

    Michael I. Jordan带你解读百万奖金ATEC蚂蚁人工智能大赛

  • teamLab创始人猪子寿之: 抛去衣食住行,我还剩下什么?

    teamLab创始人猪子寿之: 抛去衣食住行,我还剩下什么?

  • Oculus公布原型机,大幅度提升可视角,能实现140°的视场水平

    Oculus公布原型机,大幅度提升可视角,能实现140°的视场水平

  • 2018深圳国际人工智能展览会 2018 shenzhen International Artif

    2018深圳国际人工智能展览会 2018 shenzhen International Artif

网友点评网友点评
阅读推荐阅读推荐

据外媒报道,STEER打造了首款完全自动驾驶停车技术,旨在使常规车辆转变为无人驾驶车辆。STEER的首款技术应用是4级自动驾驶及网络安全停车...

近日,美国软性机器抓手制造商 Soft Robotics 宣布,获得 2000 万美元的融资,本轮投资者包括 Scale Venture Partners,Calibrate Ventures...

据外媒报道,加州车管局发布了《2017自动驾驶脱离报告(California Autonomous Vehicle Disengagement Reports)》,其中谈及了脱离的具体...

用人机语音交互,来解决智能家居适老的问题;通过家庭门禁与安防套件、空气净化套件、可燃气体与有害气体监控套件等相互联动,在不同生活情...