本文仅供个人记录和复习,不用于其他用途
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个触点位置:
|
|