【iOS-Cocos2d游戏开发之五】【1】多触点与触屏事件详解(单一监听、事件分发)

简介:

最近几天一直在啃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. }   

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

 

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

 

 
 
  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. }  

 

 

 
 
  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. }   

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

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

 

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





本文转自 xiaominghimi 51CTO博客,原文链接:http://blog.51cto.com/xiaominghimi/632984,如需转载请自行联系原作者

目录
相关文章
|
1月前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
10天前
|
iOS开发 开发者 MacOS
深入探索iOS开发中的SwiftUI框架
【10月更文挑战第21天】 本文将带领读者深入了解Apple最新推出的SwiftUI框架,这一革命性的用户界面构建工具为iOS开发者提供了一种声明式、高效且直观的方式来创建复杂的用户界面。通过分析SwiftUI的核心概念、主要特性以及在实际项目中的应用示例,我们将展示如何利用SwiftUI简化UI代码,提高开发效率,并保持应用程序的高性能和响应性。无论你是iOS开发的新手还是有经验的开发者,本文都将为你提供宝贵的见解和实用的指导。
93 66
|
20天前
|
开发框架 Android开发 iOS开发
安卓与iOS开发中的跨平台策略:一次编码,多平台部署
在移动应用开发的广阔天地中,安卓和iOS两大阵营各占一方。随着技术的发展,跨平台开发框架应运而生,它们承诺着“一次编码,到处运行”的便捷。本文将深入探讨跨平台开发的现状、挑战以及未来趋势,同时通过代码示例揭示跨平台工具的实际运用。
|
24天前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
26天前
|
存储 前端开发 Swift
探索iOS开发:从新手到专家的旅程
本文将带您领略iOS开发的奇妙之旅,从基础概念的理解到高级技巧的掌握,逐步深入iOS的世界。文章不仅分享技术知识,还鼓励读者在编程之路上保持好奇心和创新精神,实现个人成长与技术突破。