【转】【Cocos2d游戏开发之一】多触点与触屏事件详解(单一监听、事件分发)
原文地址:http://blog.csdn.net/xiaominghimi/article/details/6665887
最近几天一直在啃cocos2d,消化了不少东西,基本可以有些把握下手写公司的游戏了;那么今天就把一些重点的拿出来分享下经验,给新童鞋们作为参考;
这篇就来详细介绍下cocos2d对用户触屏的监听事件进行下分析(cocos2d有很多详细的文章和教程,我这里只是出于自己的理解来说)
进入正题:从整体cocos2d对触屏的事件监听可以分为两种:
1.单一监听,所谓单一监听其实是跟cocos2d引擎框架有关,因为在cocos2d中每个游戏界面都可以使用一个CCLayout完成,那么当一个CCLayout在屏幕显示出来后,想要监听用户的按键事件,一般都会使用以下形式来进行监听:(注意:这里是CCLayout类进行监听的方式)
首先开启监听:
self.isTouchEnabled=YES;
//监听首次触发事件- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{}//触摸事件 - 当手指在屏幕上进行移动- (void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{}//触摸事件 - 当手指从屏幕抬起时调用的方法-(void) ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ }
@interface XX : CCSprite <CCTargetedTouchDelegate>{}
-(void) registerWithTouchDispatcher{[[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES];}
//监听首次触发事件- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event{ return NO;}//监听移动事件- (void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event{ }//监听离开事件- (void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event{}
//使用[CCDirector replaceScene:XX],替换场景时,会调用以下3个方法//调用顺序依次为://1.othterScene的+(id)Scene——>//2.otherScene的init——>//3.otherScene的onEnter——>//4.运行过渡效果//5.当前Scene的onExit函数——>//6.otherLayout的onEnterTransitionDidFinish()//7.当前Scene的dealoc函数-(void) onEnter{//调用其他Scene的init方法以后会调用此方法//如果使用了CCTransitionScene,本方法将在过渡效果开始后调用//(如果不调用super onEnter新场景可能对触摸和加速计无发应)[super onEnter];}-(void) onEnterTransitionDidFinish{//调用onEnter后会调用此函数//如果使用了CCTransitionScene,将会在过渡效果完成时调用此方法[super onEnterTransitionDidFinish];}-(void)onExit{ //在调用dealloc之前会调用此函数;//如果使用了CCTransitionScene,将会在过渡效果结束以后调用此方法//(如果不调用super onExit,当前场景可能不会从内存中释放)[super onExit];}
//-----获取多点触摸NSSet *allTouches = [event allTouches];UITouch *touchOne = [[allTouches allObjects]objectAtIndex:0];UITouch *touchTwo = [[allTouches allObjects]objectAtIndex:1];//...类推
if([allTouches count]==1) { UITouch *touchOne = [[allTouches allObjects]objectAtIndex:0];switch ([touchOne tapCount]) {case 1: //单击CCLOG(@"%@",@"单击");break;case 2://双击CCLOG(@"%@",@"双击");break;}}
if([allTouches count]==2) { //适当修改处理,不能同时取,否则肯定一样的啦(可以一个在began 一个在end)UITouch *touchOne = [[allTouches allObjects]objectAtIndex:0];UITouch *touchTwo = [[allTouches allObjects]objectAtIndex:1];CGFloat *disFirst =[self distance:[touchOne locationInView:[self view]] todistance:[touchTwo locationInView:[self view]]];UITouch *touchOne = [[allTouches allObjects]objectAtIndex:0];UITouch *touchTwo = [[allTouches allObjects]objectAtIndex:1];CGFloat *disFinal =[self distance:[touchOne locationInView:[self view]]todistance:[touchTwo locationInView:[self view]]];if (disFirst>disFinal) {CCLOG(@"%@",@"合拢");}else{CCLOG(@"%@",@"分开");}}
+(CGPoint) locationFromTouches:(NSSet*)touches{return [self locationFromTouch:[touches anyObject]];}+(CGPoint) locationFromTouch:(UITouch*)touch{CGPoint touchLocation = [touch locationInView: [touch view]];return [[CCDirector sharedDirector] convertToGL:touchLocation];}