触碰事件主要分为两类:单点触碰 和 多点触碰。
cocos2dx引擎中实现触碰的类CCTouchDelegate。而CCLayer类默认继承了CCTouchDelegate接口,所以CCLayer的子类就很方便地为我们提供了触摸相关的操作。
1.单点触摸事件
单点触碰TargetedDelegate,顾名思义,就是只接受一个点的触摸响应事件。在使用触碰之前,必须要先注册触碰委托。单点触碰的注册委托函数为addTargetedDelegate。
void TouchMove::onEnter(){
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,0,false);
CCLayer::onEnter();
}
void TouchMove::onExit(){
CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
CCLayer::onExit();
}
单点触摸事件的响应函数如下,其中CCTouch类是用来存储用户触摸屏幕的过程中,其触摸点的相关信息。也就是保存了触碰的整个过程中,手指所在的位置坐标。
bool TouchMove::ccTouchBegan(CCTouch* touch,CCEvent* event){
CCLOG("ccTouchBegan");
//获取CCSprite精灵
CCSprite* sp = (CCSprite*)this->getChildByTag(1);
//设置精灵的坐标为: 当前触点位置
CCPoint pTouch = touch->getLocation();
sp->setPosition( pTouch );
return true;
}
void TouchMove::ccTouchMoved(CCTouch* touch,CCEvent* event){
CCLOG("ccTouchMoved");
//获取可视区域尺寸大小
CCSize mysize = CCDirector::sharedDirector()->getVisibleSize();
//获取CCSprite精灵
CCSprite* sp = (CCSprite*)this->getChildByTag(1);
//实现精灵的触屏移动
CCPoint pos = touch->getDelta(); //获得触屏滑动的偏移量
CCPoint currentPos = sp->getPosition(); //获得精灵的当前坐标
currentPos = ccpAdd(currentPos, pos); //精灵+偏移量 后的坐标
sp->setPosition(currentPos); //设置触屏移动后的坐标
}
void TouchMove::ccTouchEnded(CCTouch* touch,CCEvent* event){
CCLOG("ccTouchEnded");
//获取CCSprite精灵
CCSprite* sp = (CCSprite*)this->getChildByTag(1);
//设置精灵的坐标为: 触屏开始时的触点位置
CCPoint touchStartPos = touch->getStartLocation();
sp->setPosition( touchStartPos );
}
2.多点触控
多点触碰的委托注册放在onEnter的生命函数中会造成程序异常退出。所以注册多点触碰都需要重写如下函数:registerWithTouchDispatcher。开启多点触碰,除了注册触
碰委托外,还需要调用setTouchEnabled(true)来启用触碰。
void TouchMove::registerWithTouchDispatcher()</span>
{
CCDirector::sharedDirector()->getTouchDispatcher()->addStandardDelegate(this,0);
}
//启用多点触碰
this->setTouchEnabled(true);
多点触控的响应函数如下,其中CCSet类是一个集合类,和C++中的Set是类似的。在这里CCSet的数据元素类型为CCTouch,其主要存储的是多点触碰的触摸点CCTouch集合。使用迭代器CCSetIterator进行CCSet集合中多个触点CCTouch的遍历。
virtual void ccTouchesBegan(CCSet* touches, CCEvent* event); //触碰开始
virtual void ccTouchesMoved(CCSet* touches, CCEvent* event); //触碰移动
virtual void ccTouchesEnded(CCSet* touches, CCEvent* event); //触碰结束
virtual void ccTouchesCancelled(CCSet *pTouches, CCEvent *pEvent); //取消多点触屏
for (CCSetIterator iter = touches->begin() ;iter != touches->end(); iter++)
{
//获取触点后,就和单点一样的处理了
<span style="white-space:pre"> </span>CCTouch* touch = (CCTouch*)(*iter);
<span style="white-space:pre"> </span>......
}