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!

人工智能实验室
相关文章相关文章
  • 未来两年人工智能要怎么走?看这篇就够了

    未来两年人工智能要怎么走?看这篇就够了

  • 韩春雨称已能重复实验结果 近期将有消息公布

    韩春雨称已能重复实验结果 近期将有消息公布

  • 无人驾驶汽车如何改变城市生活?听听他们怎么说

    无人驾驶汽车如何改变城市生活?听听他们怎么说

  • 英国研发“杀生”机器人 通过生命体获取能量

    英国研发“杀生”机器人 通过生命体获取能量

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

据国外媒体报道,在过去两年内,聊天机器人(chatbot)、人工智能以及机器学习的研发和采用取得了巨大进展。许多初创公司正利用人工智能和...

霍金 视觉中国 图 英国著名物理学家霍金(Stephen Hawking)再次就人工智能(AI)发声,他认为:对于人类来说,强大AI的出现可能是最美妙的...

文|郑娟娟 今年,人工智能(AI) 60岁了。在AI60岁的时候,笔者想要介绍一下AI100,一个刚刚2岁的研究项目,但它的预设寿命是100年,甚至更长...

AlphaGo与李世石的人机大战,为大众迅速普及了人工智能的概念。 但对谷歌而言,除了下围棋,现在的人工智能进展到哪一步了?未来,人工智能...