本文仅供个人记录和复习,不用于其他用途
2.x与3.x
由于2.x版本和3.x版本的用法不一样,这里我就分开的讲一下,3.x版本可以去看后面的事件分发机制。注意,3.x版本是不能使用2.x的方式来完成触摸。
什么是触摸
说到底,Cocos2dx还是用来做手机游戏的,既然使用手机玩游戏,就少不了在屏幕上点来点去。无论是界面上的按钮,还是操控人物的移动,我们都需要用到触摸事件。在2.x版本事件处理时,将要触发的事件交给代理delegate
处理,再通过实现代理里面的onTouchBegan
等方法接收事件,最后完成事件的响应。触摸事件主要分为单点触摸和多点触摸,Cocos2dx默认只有CCLayer
和其派生类才有触摸功能。
CCTouch类
CCTouch
类是用来存储用户触摸屏幕的过程中,其触摸点的相关信息。也就是保存了触碰的整个过程中,手指所在的位置坐标。常用操作如下:
|
|
单点触摸
首先,我们需要注册触碰委托,单点触碰的注册委托函数为addTargetedDelegate()
:
|
|
除了开启触碰,我们还要编写关闭触摸:
|
|
接下来呢,就是写最重要的部分,用于响应触摸事件:
|
|
需要注意的是,ccTouchBegan
的返回值若为true
,表示继续响应ccTouchMoved
、ccTouchEnded
事件,返回false
则反之。
单点触摸代码实现
我使用的是3.x版本,没有办法使用2.x的方法,这里便借用别人的代码。首先声明触碰响应函数,以及类的生命周期:
|
|
编写开启和关闭触碰事件:
|
|
在init()
中创建一个CCSprite
精灵,用于测试触碰:
|
|
实现触碰响应函数:
|
|
多点触摸
注意,多点触摸的注册不能放在onEnter()
中,应该重写registerWithTouchDispatcher()
方法:
|
|
默认情况下CCLayer
是没有开启触摸事件的,需要init()
方法中开启:
|
|
同样的,多点触摸的关闭也是onExit()
方法:
|
|
至于多点触摸的响应函数,除了onTouchBegan()
没有返回值以外,都是一样的:
|
|
CCSet类
CCSet
类用于存储多点触碰的触摸点CCTouch
集合,使用迭代器CCSetIterator
进行CCSet
集合中多个触点CCTouch
的遍历:
|
|
多点触摸代码实现
这个只能在手机上面显示,电脑只有一个鼠标,所以无法看到效果:
|
|
编写开启和关闭多点触碰事件:
|
|
创建两个CCSprite
,用于测试触碰:
|
|
将精灵的位置设置到触点位置,sp1
精灵设置到第0个触点位置;sp2
精灵设置到第1个触点位置:
|
|