本文仅供个人记录和复习,不用于其他用途
3.x版本的改变
上一章我们学习了2.x的触摸事件,但是呢,事件的创建和移除都显得很繁琐。3.x版本对此作出了改变,我们不需要再重写那几种函数,仅仅只需要创建一个事件监听器用来实现各种触发后的逻辑,然后添加到事件分发器_eventDispatcher
,所有事件监听器有这个分发器统一管理,即可完成事件响应。
事件监听器有以下几种:
- 触摸事件
EventListenerTouch
- 键盘响应事件
EventListenerKeyboard
- 鼠标响应事件
EventListenerMouse
- 自定义事件
EventListenerCustom
- 加速记录事件
EventListenerAcceleration
_eventDispatcher
的工作由三部分组成:
- 事件分发器
EventDispatcher
- 事件类型
EventTouch
、EventKeyboard
等 - 事件监听器
EventListenerTouch
、EventListenerKeyboard
等
监听器实现了各种触发后的逻辑,在适当时候由事件分发器分发事件类型,然后调用相应类型的监听器。以上是我在官方文档搬运过来的,有什么疑问可以接着往下看。
事件分发器
_eventDispatcher
是Node
的属性,通过Director::getInstance()->getEventDispatcher()
获得。事件监听器的添加用到的是如下方法:
|
|
注意,当再次使用listener1
时,需要使用clone()
方法复制一份,因为一个事件监听器只能添加一次。当然,这里我们还可以使用addEventListenerWithFixedPriority()
方法添加监听器。这两种方法的区别在于,FixedPriority
中的监听器需要我们手动移除,而SceneGraphPriority
中的则会自动被移除。
另外,如果想要移除被添加的监听器,可以使用下面的方法:
|
|
建议使用第一个方法,第二种方法会移除掉所有监听器,也就是说连菜单按钮中的触摸事件都被移除了,使得用户无法退出。
|
|
上面是EventDispatcher
类的部分源码注释,具体的已经说得很清楚了,这里就不再赘述。
触摸优先权
SceneGraphPriority
使用这个函数添加事件监听器的时候,它的优先级是根据精灵的显示顺序来确定的,如果精灵的位置靠前,将首先接受到触摸。而FixedPriority
是根据你传递进去的值来确定的,值越小,优先级越高。注意,SceneGraphPriority
的优先权默认从0开始。
触摸事件
在2.x版本中,我们需要先注册,然后再重载多个方法才能完成触摸事件的编码。在3.x版本中,既可以重写三个方法onTouchBegan
,onTouchMoved
和onTouchEnded
,也可以直接通过Lambda表达式完成响应逻辑。这里Lambda表达式由于还没有总结,暂时不讲,具体的可以查看C++学习笔记。
单点触摸器
|
|
多点触摸监听器
|
|
鼠标响应事件
鼠标事件监听器相关:
|
|
键盘事件
键盘事件监听器相关:
|
|
加速计事件
所谓的加速计,也就是计算重力加速度的。简单点来说,手机上的赛车游戏,一般都是通过左右摇晃手机来控制赛车方向。那么这里呢,重力感应来自移动设备的加速计,通常支持(X, Y, Z)三个方向的加速度感应,所以又称为三向加速计。在实际应用中,可以根据3个方向的力度大小来计算手机倾斜的角度或方向。
|
|
加速计监听器相关:
|
|
具体代码展示
|
|
上面的代码只是实现了在你点击之后,在控制台输出相应的信息。那么,我们来实现一点更复杂的:
|
|
上述的代码可以实现精灵的拖动,我们再来看看优先级有关的用法:
|
|
回调函数没有发生改变。我们创建了三个精灵,sprite
、sprite2
、sprite3
,前俩个精灵在将触摸监听器添加到事件分发器中的时候传入了自己,作为第二个参数,所以在回调函数的处理中,获得的就是自己了,然后就实现了拖动的效果,sprite3
拖动是没有效果的。在2.x的时候我们一般将希望接受触摸的精灵作为成员函数,然后在回调函数中去判断。