`
yangping_Account
  • 浏览: 191765 次
  • 性别: Icon_minigender_1
  • 来自: 无锡
社区版块
存档分类
最新评论

Cocos2D-iPhone多触点与触屏事件详解

 
阅读更多

         首先进入AppDelegate.m 类中, 

 

  1. <strong>- (void) applicationDidFinishLaunching:(UIApplication*)application{}</strong>  

 

  在上面这个方法中添加如下一句开启多触点支持的代码:

 

  1. <strong>  //支持多触点  
  2.     [viewController.view setMultipleTouchEnabled:YES];</strong>  

 

其他类设置多触点:

[[[CCDirector sharedDirector]openGLView]setMultipleTouchEnabled:YES];

--------------------------本章补充完毕------------------------------------------------------------------------------


 

最近几天一直在啃cocos2d,消化了不少东西,基本可以有些把握下手写公司的游戏了;那么今天就把一些重点的拿出来分享下经验,给新童鞋们作为参考;

这篇就来详细介绍下cocos2d对用户触屏的监听事件进行下分析(cocos2d有很多详细的文章和教程,我这里只是出于自己的理解来说)

进入正题:从整体cocos2d对触屏的事件监听可以分为两种:

1.单一监听,所谓单一监听其实是跟cocos2d引擎框架有关,因为在cocos2d中每个游戏界面都可以使用一个CCLayout完成,那么当一个CCLayout在屏幕显示出来后,想要监听用户的按键事件,一般都会使用以下形式来进行监听:(注意:这里是CCLayout类进行监听的方式)

首先开启监听:

 

 

  1. self.isTouchEnabled=YES;  
然后重写监听函数即可:

 

 

  1. //监听首次触发事件  
  2. - (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event  
  3. {  
  4. }  
  5. //触摸事件 - 当手指在屏幕上进行移动  
  6. - (void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event  
  7. {  
  8.       
  9. }  
  10. //触摸事件 - 当手指从屏幕抬起时调用的方法  
  11. -(void) ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event  
  12. {  
  13.           
  14. }  
此种监听狠eazy,但是要注意这里是对CCLayout类进行的监听方式;

 


2.监听分发; 刚才说了,游戏的每个界面可能都是一个CCLayout,但是如果我想让一个CCSprite精灵主角单独进行监听,或者说在CCLayout有很多个精灵我想单独监听其中的一种的时候,这时候就需要使用监听分发的形式了;

假设我们自定义了一个类XX继承CCSprite,还有一个YY类也继承CCSprite,而且XX类型与YY类的实例都存在于一个Layout上,那么我想对XX与YY类型分别单独监听的话;首先我们先让当前继承的CCSprite类的XX于YY类都使用 <CCTargetedTouchDelegate>协议;

(CCSprite中没有 self.isTouchEnabled=YES; 这个函数,别直接写这个哦~)

代码如下:

 

  1. @interface XX : CCSprite <CCTargetedTouchDelegate>{  
  2.   
  3. }  

然后在当前实现类中重写一个函数如下:

 

 

  1. -(void) registerWithTouchDispatcher  
  2. {  
  3.     [[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES];  
  4. }  

 

或者将注册的这句代码,放在重写的onEnter函数中也可;


(此函数是注册监听,如果里面什么都不写,则当前不会相应任何触屏事件;)

 

重写触摸的各事件函数,如下:

 

  1. //监听首次触发事件  
  2. - (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event  
  3. {   
  4.     return NO;  
  5. }  
  6. //监听移动事件  
  7. - (void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event  
  8. {     
  9. }  
  10. //监听离开事件  
  11. - (void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event  
  12. {  
  13.       
  14. }  
  15.    

 

大家可以看到,此种监听方式除了各种监听函数与第一种类似之外,在 ccTouchBegan的函数有个返回类型-布尔值;那么其作用下面详细介绍;如果XX与YY类都实现了第二种监听方式的话,那么当用户触屏后,(当前用户触发的是XX与YY类实例所在的CCLayout)首先会进入XX或者YY的其中的ccTouchBegan函数中,这里假设首先进入了XX类中,那么XX类中的ccTouchBegan将会被响应,如果return true;表示不再将用户触屏的消息传递给YY类中进行响应,也就是说不再响应YY类中的ccTouchBegan函数,那么如果 return false;则会将当前触屏信息传递给其他注册过的类型中;

一句话概括:return 的值,如果是真则表明用户触摸事件已经被处理,其他不会再去进行监听;如果为假,则会继续交给其他注册过的类型中进行处理;

 

那么第二种监听的方式比较常用,这样便于处理,那么至于注册,一般都是放在 onEnter函数中;onEnter函数是每个CCScene之间切换会被响应的函数,相当于是CCScene的生命周期函数,具体调用顺序如下:

 

  1. //使用[CCDirector replaceScene:XX],替换场景时,会调用以下3个方法  
  2. //调用顺序依次为:  
  3. //1.othterScene的+(id)Scene——>  
  4. //2.otherScene的init——>  
  5. //3.otherScene的onEnter——>  
  6. //4.运行过渡效果  
  7. //5.当前Scene的onExit函数——>  
  8. //6.otherLayout的onEnterTransitionDidFinish()  
  9. //7.当前Scene的dealoc函数  
  10. -(void) onEnter{  
  11.     //调用其他Scene的init方法以后会调用此方法  
  12.     //如果使用了CCTransitionScene,本方法将在过渡效果开始后调用  
  13.     //(如果不调用super onEnter新场景可能对触摸和加速计无发应)  
  14.     [super onEnter];  
  15. }  
  16. -(void) onEnterTransitionDidFinish{  
  17.     //调用onEnter后会调用此函数  
  18.     //如果使用了CCTransitionScene,将会在过渡效果完成时调用此方法  
  19.     [super onEnterTransitionDidFinish];  
  20. }  
  21. -(void)onExit{   
  22.     //在调用dealloc之前会调用此函数;  
  23.     //如果使用了CCTransitionScene,将会在过渡效果结束以后调用此方法  
  24.     //(如果不调用super onExit,当前场景可能不会从内存中释放)  
  25.     [super onExit];  
  26. }  

那么大概介绍了监听事件后,那么触屏中最关心的就应该是多触点啦;

 

 

  1. //-----获取多点触摸  
  2. NSSet *allTouches = [event allTouches];  
  3. UITouch *touchOne = [[allTouches allObjects]objectAtIndex:0];  
  4. UITouch *touchTwo = [[allTouches allObjects]objectAtIndex:1];  
  5. //...类推  

获取多点狠简单,那么下面再将基本常用到的几个判断写下:

 

1-判断用户单击还是双击(针对一个触点)

 

  1. </pre><p></p><pre name="code" class="cpp">if([allTouches count]==1) {   
  2.     UITouch *touchOne = [[allTouches allObjects]objectAtIndex:0];  
  3.     switch ([touchOne tapCount]) {  
  4.         case 1:  
  5.              //单击  
  6.             CCLOG(@"%@",@"单击");  
  7.             break;  
  8.         case 2:  
  9.             //双击  
  10.             CCLOG(@"%@",@"双击");  
  11.             break;  
  12.     }  
  13. }  

1-判断用户两个触点之间是合拢还是分开(针对两个触点)

  1. </pre><p></p><p class="p1"></p><pre name="code" class="cpp"> <pre name="code" class="cpp">if([allTouches count]==2) {   
  2.     //适当修改处理,不能同时取,否则肯定一样的啦(可以一个在began 一个在end)  
  3.     UITouch *touchOne = [[allTouches allObjects]objectAtIndex:0];  
  4.     UITouch *touchTwo = [[allTouches allObjects]objectAtIndex:1];  
  5.     CGFloat *disFirst  =[self distance:[touchOne locationInView:[self view]]   
  6.                             todistance:[touchTwo locationInView:[self view]]];  
  7.       
  8.     UITouch *touchOne = [[allTouches allObjects]objectAtIndex:0];  
  9.     UITouch *touchTwo = [[allTouches allObjects]objectAtIndex:1];  
  10.     CGFloat *disFinal  =[self distance:[touchOne locationInView:[self view]]  
  11.                             todistance:[touchTwo locationInView:[self view]]];  
  12.     if (disFirst>disFinal) {  
  13.         CCLOG(@"%@",@"合拢");  
  14.     }else{  
  15.         CCLOG(@"%@",@"分开");  
  16.     }  
  17. }  


 


 

这里我就粗略的写在一起,判定两个触点是否合拢其实就是用户刚触屏时记录两点之间的距离记做disFirst,然后在两个触点离开屏幕(或者移动事件中)的时候计算

当前的两个触点的距离disFinal,那么最后根据disFirst与disFinal距离关系就能知道是合拢还是分开;

(CCLOG 是cocos2d封装的打印方法,此种打印在编译发布正式游戏程序的时候是不会编译到程序中的,但是NSLOG会一直存在!要注意!)

 

最后给出两个函数,用于计算不同方式监听的函数中获取(转换)坐标的,因为cocos2d是openGL进行搭建的框架,所以需要坐标转换;

 

  1. +(CGPoint) locationFromTouches:(NSSet*)touches  
  2. {  
  3.     return [self locationFromTouch:[touches anyObject]];  
  4. }  
  5. +(CGPoint) locationFromTouch:(UITouch*)touch  
  6. {  
  7.     CGPoint touchLocation = [touch locationInView: [touch view]];  
  8.     return [[CCDirector sharedDirector] convertToGL:touchLocation];  
  9. }  

两个方法一看就能看出区别,一个是UITouch的,一个是NSSet,一个是单一监听,一个是分发监听;

 

ok,本章就到这里~~~(下周进入封闭开发了,吃睡都在公司了,咳咳,带上我的多啦a梦的小裤衩,娃哈哈~)

分享到:
评论

相关推荐

    cocos2d-iphone-2.0.tar.gz

    12. **Multitouch Support**:针对iOS设备的多点触控特性,Cocos2d-iPhone提供了易于使用的事件处理机制,可以处理多个手指的触摸事件。 13. **Debugging Tools**:框架内嵌了调试工具,如性能分析器、内存泄漏检测...

    cocos2d-iphone~cocos2d-html5移植之旅

    ### cocos2d-iphone至cocos2d-html5移植之旅:深入解析与实践指南 #### 引言 在数字化时代,跨平台游戏开发成为了一种趋势,尤其在移动设备和网页端之间的转换变得日益频繁。《cocos2d-iphone至cocos2d-html5移植...

    【iOS-Cocos2d游戏开发】Cocos2d-iPhone动作Action-扩展动作

    在iOS游戏开发中,Cocos2d-x是一个广泛使用的2D游戏引擎,其Cocos2d-iPhone版本专为Objective-C编程语言设计。本主题主要关注Cocos2d-iPhone中的“动作”(Actions)机制,这是一个强大的工具,用于创建各种动画效果...

    Cocos2d-x实战:JS卷——Cocos2d-JS开发

    资源名称:Cocos2d-x实战:JS卷——Cocos2d-JS开发内容简介:本书是介绍Cocos2d-x游戏编程和开发技术书籍,介绍了使用Cocos2d-JS中核心类、瓦片地图、物理引擎、音乐音效、数据持久化、网络通信、性能优化、多平台...

    子龙山人兄弟翻译cocos2d-iphone教程.rar

    《子龙山人兄弟翻译cocos2d-iphone教程》是一个专为初学者设计的游戏开发教程,由知名开发者子龙山人及其团队精心翻译。cocos2d-iphone是一款广泛应用于iOS平台的游戏开发框架,它基于cocos2d,特别为iPhone和iPad...

    cocos2d-iphone 2.1 第一部分

    继续输入cd Cocos2d-iPhone-0.99.5(cd Cocos2d-iPhone-0.99.5为解压的cocos2d文件夹名称)进入cocos2d文件夹中。 4。继续输入./install-templates.sh则打开你文件夹下面的install-templates.sh进行cocos2d的安装。...

    iOS游戏应用源代码——cocos2d-cocos2d-iphone-extensions.zip

    4. **事件处理**:提供了触摸事件、键盘事件的处理机制,方便与用户交互。 5. **音频支持**:内置了简单的音频播放功能,可以播放背景音乐和音效。 6. **性能优化**:cocos2d-iphone利用OpenGL ES进行图形渲染,...

    cocos2d-x-3.13.1 spine3.6.zip

    《Cocos2d-x 3.13.1与Spine 3.6集成详解》 Cocos2d-x是一个广泛使用的开源游戏开发框架,它基于C++,同时支持Lua和JavaScript等多种脚本语言,为开发者提供了高效、跨平台的游戏开发解决方案。在3.13.1版本中,...

    cocos2d-x windows vs2010配置

    "cocos2d-x windows vs2010 配置详解" 本文将详细介绍如何在 Windows 环境下使用 Visual Studio 2010 配置 Cocos2d-x 游戏引擎。Cocos2d-x 是一个跨平台的游戏引擎,可以在多种平台上运行,包括 Windows、Mac OS X...

    Cocos2d-x 3.x游戏开发实战pdf含目录

    《Cocos2d-x 3.x游戏开发实战》是一本深度探讨Cocos2d-x 3.x框架的游戏开发书籍,适合对游戏编程有兴趣的开发者学习。Cocos2d-x 是一个开源的、跨平台的2D游戏开发框架,广泛应用于iOS、Android、Windows等多平台的...

    cocos2d-x事件类

    谨记,该事件只能用于cocos2d-x中。 事件发送者需要继承EventDispatcher类 事件接收者需要继承EventHandle类,还需要实现handleEvent方法 事件发送者和事件接收者要在构造函数和析构函数中调用一下方法 事件发送者...

    Cocos2d-x实战:C++卷(2版)源代码

    5. **事件处理**:Cocos2d-x提供了事件处理机制,包括触摸事件、键盘事件、网络事件等,使得游戏能够响应用户的输入。 6. **声音与音乐**:Cocos2d-x支持音频播放,包括背景音乐和音效,可以实现音效的同步和控制。...

    cocos2d-x-cocos2d-x-2.2.2.zip

    这个压缩包“cocos2d-x-cocos2d-x-2.2.2.zip”包含了cocos2d-x 的2.2.2版本,该版本是cocos2d-x发展中的一个重要里程碑,它提供了许多改进和优化,使得开发者能够更加高效地创建2D游戏和应用。 在cocos2d-x 2.2.2中...

    Cocos2d-iphone 开发教程

    #### 一、Cocos2d-iPhone简介与版权要求 **Cocos2d-iPhone**是一款专为iOS设备设计的2D游戏开发框架,它基于OpenGL ES图形渲染,并且拥有丰富的功能集,能够支持多种游戏元素如动画、粒子效果、碰撞检测等,使得...

    Cocos2d-x实战 JS卷 Cocos2d-JS开发

    《Cocos2d-x实战 JS卷 Cocos2d-JS开发》是一本深入探讨Cocos2d-x游戏引擎JavaScript版本使用的专业书籍。Cocos2d-x是全球范围内广泛采用的游戏开发框架,尤其适用于2D游戏的制作,而Cocos2d-JS则是其JavaScript接口...

    Cocos2d-JS游戏开发

    同时,Cocos2d-JS的事件系统使得响应用户输入和游戏事件变得简单,如触摸事件、键盘事件等,这对于游戏的交互设计至关重要。 在Cocos2d-JS中,动画是游戏生动性的关键。通过序列帧动画(SpriteSheet)和动作组合,...

    cocos2d-x_v3.16安装及环境变量配置文档

    cocos2d-x 是一个开源的游戏开发框架,使用 C++ 语言编写,支持多平台发布,包括 iOS、Android、Windows、macOS、Linux 和 Web。cocos2d-x v3.16 是该框架的一个版本号,本文档主要介绍了该版本的安装流程以及环境...

    经典版本 方便下载 源码 旧版本 3.8 官网找不到了 cocos2d-x-3.8.zip

    在学习和使用cocos2d-x 3.8时,开发者需要注意与最新版本的差异,例如API的变化、新功能的缺失等。同时,由于3.8是旧版本,可能不再受到官方的维护和支持,所以在解决特定问题时可能需要查阅旧的文档或社区论坛。 ...

    cocos2d-x-3.1.zip

    6. **事件处理**:通过EventDispatcher处理用户输入、触摸事件、键盘事件等,为游戏交互提供支持。 7. **物理引擎**:集成Box2D物理引擎,可以创建真实的物理模拟,如重力、碰撞检测等。 8. **音频支持**:支持...

    Cocos2d-x实战++JS卷++Cocos2d-JS开发+PDF电子书下载+带书签目录+完整

    1. Cocos2d-x:是一个开源的游戏开发框架,它主要用于开发跨平台的游戏和应用程序,支持iOS、Android、Windows、Mac等多个平台。它允许开发者使用一套代码,就可以在不同的操作系统上部署应用程序。 2. 实战++JS卷...

Global site tag (gtag.js) - Google Analytics