Cocos2dx 用户事件 事件监听器 事件分发器

来源:互联网 发布:excel数据透视表 编辑:程序博客网 时间:2024/05/20 11:36

从游戏诞生至今,提供给玩家控制游戏的输入设备数不胜数,从街机的控制面板、家用机的游戏手柄、电脑的鼠标键盘、到现在智能设备触屏、重力感应和体感等等都给予了玩家不同程度的乐趣。本文章将围绕着Cocos2dx里最简单的控制事件回调进行介绍。


对编程有基本了解的都知道关于硬件的事件回调过程(括号以触屏事件回调作例子):

1用户对硬件作出操作(用户对硬件屏幕作出单点操作)。

2硬件发出事件信息(硬件对游戏发出了单点操作信息)。 //这些信息储存在Touch实例和Event实例里发送

3事件分发器获取事件并分配信息给相应的监听器(事件分发器类获取信息,并把单点操作信息分发给单点事件监听器)。 //EventDispatcher将接受Event信息并分发给对应的Listener。

4软件的监听器获取信息(单点事件监听器)。 //EventListenerTouchOneByOne实例获取了信息

5监听器调用相关的函数。 //EventListenerTouchOneByOne实例调用了已经设定好的onTouchBegan函数。

以上就是以单点触控为例子的事件回调过程,在开发过程中可以按照过程分析出对应的语句(括号以触屏事件回调作例子):

1创建监听器实例(auto listenerTouch = EventListenerTouchOneByOne::create();)

2设置相关回调函数(listenerTouch->onTouchMoved = CC_CALLBACK_2(回调函数,this))//单点事件总共有4个需要设置的回调函数,这里省略剩下的3个。

3事件分发器注册监听器(_eventDispatcher->addEventListenerWithSceneGraphPriority(listenerTouch,需要注册监听器的节点类)) //这里就完成并可以使用了。


在了解监听器之前我们了解下触屏中用于储存触控点信息的信息类

储存触点信息 - Touch类

Point getLocation() 返回触控点在OpenGL坐标系的当前坐标

Point getPreviousLocation() 返回触控点在OpenGL坐标系中的上一次坐标

Point getStartLocation() 返回触控点在OpenGL坐标系中的开始坐标

Point getDelta() 返回触控点在屏幕坐标系中的增量

Point getLocationInView() 返回触控点在屏幕坐标系中的当前坐标

Point getPreviousLocationInView() 返回触控点在屏幕坐标系中的上一次坐标

Point getStartLocationInView() 返回触控点在屏幕坐标系中的开始坐标

储存了重力传感器信息 - Acceleration类

属性x 传感器横向系数

属性y 传感器纵向系数

储存键盘事件信息 - EventKeyboard::KeyCode类

本身储存了按下按键的字符信息

储存触控事件信息 - Event类

Type getType()  获取事件类型

void stopPropagation() 停止传播当前事件

bool isStopped ()检查事件是否停止

Node* getCurrentTarget() 获取事件的目标节点



所有事件监听器创建实例的方法默认为Create函数:

1、单点和多点触控

自智能设备普及开来后,触控成为了一种十分普遍的控制方式。Cocos2dx中支持的模式分为单点触控和多点触控。

※单点触控是指同一时刻只是别一个点的触控和单击,此模式下若同时有两个点发出信息,机器就难以做出正确的判定。

※多点触控则能同时相应单个或多个点的触控和单记,此模式下若同时有多个点发出信息,机器会分别做出正确的判断,但需要注意的是可识别点的数目取决于机器本身。


①单点触控

在游戏开发中,若希望自己的程序支持单点触控,主要任务是编写4个与单点触控相关事件的回调方法,这些方法名称可以由开发人员自行拟定,但入口参数需要符合一定的规则,

单点事件监听器 - EventListenerTouchOneByOne

void setSwallowTouches(bool isSwallow) //设置是否吞噬事件,true时若一个单点触发多个监听器,则优先级高的截获,低的不响应。

触控开始事件回调方法 - bool onMyTouchBegan(Touch* touch,Event* unused_event)

当屏幕被触控时调用,开始事件的返回值是bool类型,当返回true的时候会继续调用以下3个方法,返回false则不调用。

触控点移动事件回调方法 - void onMyTouchMoved(Touch* touch,Event*unused_event)

当触控开始方法返回ture时且触控点移动时调用,会调用多次。

触控结束事件回调方法 - void onMyTouchEnded(Touch* touch,Event*unused_event)

当触控开始方法返回ture且手指离开屏幕时调用。

触控中断事件回调方法 - void onMyTouchCancelled(Touch* touch,Event*unused_event)

当触控开始方法返回ture且触控被取消(如电话信息中断了游戏等)时调用。


②多点触控

多点事件监听器 - EventListenerTouchAllAtOnce

void setSwallowTouches(bool isSwallow) //设置是否吞噬事件,true时若一个单点触发多个监听器,则优先级高的截获,低的不响应。

触控开始事件回调方法 - bool onMyTouchesBegan(const std::vector<Touch*>& pTouches,Event* pEvent)

当屏幕被触控时调用,开始事件的返回值是bool类型,当返回true的时候会继续调用以下3个方法,返回false则不调用。

触控点移动事件回调方法 - void onMyTouchesMoved(const std::vector<Touch*>& pTouches,Event* pEvent)

当触控开始方法返回ture时且触控点移动时调用,会调用多次。

触控结束事件回调方法 - void onMyTouchesEnded(const std::vector<Touch*>& pTouches,Event* pEvent)

当触控开始方法返回ture且手指离开屏幕时调用。

触控中断事件回调方法 - void onMyTouchesCancelled(const std::vector<Touch*>& pTouches,Event* pEvent)

当触控开始方法返回ture且触控被取消(如电话信息中断了游戏等)时调用。


③重力传感

重力传感器监听器 - EventListenerAcceleration

Device::setAccelerometerEnabled(ture)  //在使用此监听器前必须开启硬件的重力传感器

传感器变化事件回调方法 void onMyAcceleration(Acceleration* acc,Event* unused_event)


④键盘事件

键盘事件监听器 - EventListenerKeyboard

按键按下事件回调方法 - void onMyKeyPressed(EventKeyboard::KeyCode keyCode,Event* event)

按键松开时事件回调方法 - void onMyKeyReleased(EventKeyboard::KeyCode keyCode,Event* event)

可以注意到键盘监听器并没有监听按键持续按下的事件,为了达到监听按键按下的效果可以采用以下两种方法。

*设置全局变量,按键按下时KeyPress=1,反则设0,这个较为简单,但泛用性很低。

*在按下事件回调方法里创建一个定时器来运营按下时的函数语句,在松开按键事件里注销相对应事件。


设置好需要的监听器后就要在事件分发器注册来实现其功能


事件分发器 - EventDispatcher

事件分发器采用单例模式,通过导演类Director的getEventDispatcher()来获取对象。

此类中注册事件监听器到分发器的方法有两个:
1,制定固定事件优先级注册监听器 - void addEventListenerWithPriority(EventListener * listener,int fixedPriority) //优先级的值越小优先级越高
2,把精灵显示优先级作为事件优先级注册监听器 - void addEventListenerWithSceneGraphPriority(EventListener * listener,Node * node) //显示在最前面的优先级越高
注销监听器的方法有三个:
1,注销制定事件监听器 void removeEventListener(EventListener * listener) 注销制定事件监听器
2,void removeCustomEventListener(const std::string& customEventName) 注销自定义事件监听器
3,void removeAllEventListeners() 注销所有事件监听器,包括菜单已经注册的。


0 0
原创粉丝点击