- 浏览: 321762 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
ljl961890233bear:
...
利用MySQL Cluster 7.0 + LVS 搭建高可用环境 -
wang1352083:
$m->listDBs(); 返回的是一个有dbnam ...
MongoDB PHP API 及用法 -
走忽闪953:
...
putty PasswordAuthentication -
jxhgzs001:
很好 很强大,不顶你一下 觉得过意不去啊
cocos2d 的一些实用代码 -
lingtianlan:
我实际测试的结果却和你不一样,调用顺序是awakeFromNi ...
[转]loadView/viewDidLoad/initWithNibName/awakeFromNib/initWithCoder的用法
原文地址:http://blog.csdn.net/xiaominghimi/article/details/6665887
最近几天一直在啃cocos2d,消化了不少东西,基本可以有些把握下手写公司的游戏了;那么今天就把一些重点的拿出来分享下经验,给新童鞋们作为参考;
这篇就来详细介绍下cocos2d对用户触屏的监听事件进行下分析(cocos2d有很多详细的文章和教程,我这里只是出于自己的理解来说)
进入正题:从整体cocos2d对触屏的事件监听可以分为两种:
1.单一监听,所谓单一监听其实是跟cocos2d引擎框架有关,因为在cocos2d中每个游戏界面都可以使用一个CCLayout完成,那么当一个CCLayout在屏幕显示出来后,想要监听用户的按键事件,一般都会使用以下形式来进行监听:(注意:这里是CCLayout类进行监听的方式)
首先开启监听:
然后重写监听函数即可:
此种监听狠eazy,但是要注意这里是对CCLayout类进行的监听方式;
2.监听分发; 刚才说了,游戏的每个界面可能都是一个CCLayout,但是如果我想让一个CCSprite精灵主角单独进行监听,或者说在CCLayout有很多个精灵我想单独监听其中的一种的时候,这时候就需要使用监听分发的形式了;
假设我们自定义了一个类XX继承CCSprite,还有一个YY类也继承CCSprite,而且XX类型与YY类的实例都存在于一个Layout上,那么我想对XX与YY类型分别单独监听的话;首先我们先让当前继承的CCSprite类的XX于YY类都使用 <CCTargetedTouchDelegate>协议;
(CCSprite中没有 self.isTouchEnabled=YES; 这个函数,别直接写这个哦~)
代码如下:
然后在当前实现类中重写一个函数如下:
(此函数是注册监听,如果里面什么都不写,则当前不会相应任何触屏事件;)
重写触摸的各事件函数,如下:
大家可以看到,此种监听方式除了各种监听函数与第一种类似之外,在 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-判断用户单击还是双击(针对一个触点)
1-判断用户两个触点之间是合拢还是分开(针对两个触点)
这里我就粗略的写在一起,判定两个触点是否合拢其实就是用户刚触屏时记录两点之间的距离记做disFirst,然后在两个触点离开屏幕(或者移动事件中)的时候计算
当前的两个触点的距离disFinal,那么最后根据disFirst与disFinal距离关系就能知道是合拢还是分开;
(CCLOG 是cocos2d封装的打印方法,此种打印在编译发布正式游戏程序的时候是不会编译到程序中的,但是NSLOG会一直存在!要注意!)
最后给出两个函数,用于计算不同方式监听的函数中获取(转换)坐标的,因为cocos2d是openGL进行搭建的框架,所以需要坐标转换;
两个方法一看就能看出区别,一个是UITouch的,一个是NSSet,一个是单一监听,一个是分发监听;
最近几天一直在啃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 { }
此种监听狠eazy,但是要注意这里是对CCLayout类进行的监听方式;
2.监听分发; 刚才说了,游戏的每个界面可能都是一个CCLayout,但是如果我想让一个CCSprite精灵主角单独进行监听,或者说在CCLayout有很多个精灵我想单独监听其中的一种的时候,这时候就需要使用监听分发的形式了;
假设我们自定义了一个类XX继承CCSprite,还有一个YY类也继承CCSprite,而且XX类型与YY类的实例都存在于一个Layout上,那么我想对XX与YY类型分别单独监听的话;首先我们先让当前继承的CCSprite类的XX于YY类都使用 <CCTargetedTouchDelegate>协议;
(CCSprite中没有 self.isTouchEnabled=YES; 这个函数,别直接写这个哦~)
代码如下:
@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 { }
大家可以看到,此种监听方式除了各种监听函数与第一种类似之外,在 ccTouchBegan的函数有个返回类型-布尔值;那么其作用下面详细介绍;如果XX与YY类都实现了第二种监听方式的话,那么当用户触屏后,(当前用户触发的是XX与YY类实例所在的CCLayout)首先会进入XX或者YY的其中的ccTouchBegan函数中,这里假设首先进入了XX类中,那么XX类中的ccTouchBegan将会被响应,如果return true;表示不再将用户触屏的消息传递给YY类中进行响应,也就是说不再响应YY类中的ccTouchBegan函数,那么如果 return false;则会将当前触屏信息传递给其他注册过的类型中;
一句话概括:return 的值,如果是真则表明用户触摸事件已经被处理,其他不会再去进行监听;如果为假,则会继续交给其他注册过的类型中进行处理;
那么第二种监听的方式比较常用,这样便于处理,那么至于注册,一般都是放在 onEnter函数中;onEnter函数是每个CCScene之间切换会被响应的函数,相当于是CCScene的生命周期函数,具体调用顺序如下:
//使用[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]; //...类推
获取多点狠简单,那么下面再将基本常用到的几个判断写下:
1-判断用户单击还是双击(针对一个触点)
if([allTouches count]==1) { UITouch *touchOne = [[allTouches allObjects]objectAtIndex:0]; switch ([touchOne tapCount]) { case 1: //单击 CCLOG(@"%@",@"单击"); break; case 2: //双击 CCLOG(@"%@",@"双击"); break; } }
1-判断用户两个触点之间是合拢还是分开(针对两个触点)
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(@"%@",@"分开"); } }
这里我就粗略的写在一起,判定两个触点是否合拢其实就是用户刚触屏时记录两点之间的距离记做disFirst,然后在两个触点离开屏幕(或者移动事件中)的时候计算
当前的两个触点的距离disFinal,那么最后根据disFirst与disFinal距离关系就能知道是合拢还是分开;
(CCLOG 是cocos2d封装的打印方法,此种打印在编译发布正式游戏程序的时候是不会编译到程序中的,但是NSLOG会一直存在!要注意!)
最后给出两个函数,用于计算不同方式监听的函数中获取(转换)坐标的,因为cocos2d是openGL进行搭建的框架,所以需要坐标转换;
+(CGPoint) locationFromTouches:(NSSet*)touches { return [self locationFromTouch:[touches anyObject]]; } +(CGPoint) locationFromTouch:(UITouch*)touch { CGPoint touchLocation = [touch locationInView: [touch view]]; return [[CCDirector sharedDirector] convertToGL:touchLocation]; }
两个方法一看就能看出区别,一个是UITouch的,一个是NSSet,一个是单一监听,一个是分发监听;
发表评论
-
sprite list 白边
2012-01-17 11:32 829很奇怪的白边问题 就是sprite list!切图会变成白色 ... -
cocos2d 内存整理
2011-12-31 11:29 1502[[CCSpriteFrameCache sharedSp ... -
CCTransitionScene
2011-12-28 19:08 1024//淡入淡出 CCFadTransition *tran = ... -
OpenGL draw base functions
2011-12-28 19:04 1968-(void) draw { CGSize s = [[C ... -
(转)cocos2d的常用动作及效果总结之五:Animation
2011-12-12 15:57 0这一篇是讲一下如何在cocos2d中实现动画。 实现动画的步 ... -
(转)cocos2d的常用动作及效果总结之四:Special Actions
2011-12-12 15:53 1975Special Actions 个人理解包含三部分,一个是函数 ... -
(转)cocos2d的常用动作及效果总结之三:Ease actions
2011-12-12 15:51 6295Ease actions 影响的是动作的时间线性。 举个例子 ... -
cocos2d的常用动作及效果总结之二:Composition actions
2011-12-12 15:49 1933上一篇整理了 basice action 基本动作的部分,这 ... -
(转)cocos2d的常用动作及效果总结之一: Basic actions
2011-12-12 15:47 3581在官方网站上,对cocos2d ... -
xcode 4 Add Existing Framework
2011-11-14 11:52 1248现在的记性十分不好!老是记不住xcode 4如何Add Exi ... -
(转)iphone应用开发:发送短信/邮件/打电话
2011-11-10 10:46 1187+ (void) makeCall:(NSString *)p ... -
cocos2d 添加 原生得空间的类:CCUIViewWrapper 的用法
2011-11-03 11:55 1915UIView *myView = [[[UIView allo ... -
cocos2d 的一些实用代码
2011-09-15 10:51 22981.问题描述: 如果我想让一个 sprite 显示3秒钟然后消 ... -
mac 的一些基本操作
2011-09-08 13:34 8141.寻找共享文件: 以前在windows上输入:\\192 ... -
[转]Cocos2D的4个基本概念
2011-09-06 18:35 1814开发cocos2d 应用程序,必须先了解如下4个概念: Sce ... -
(转) iphone 开发常用到的代码
2011-07-12 11:01 2119- (NSString *)URLEncodedString: ... -
iphone 升级到4.3.3 编译出现的问题
2011-05-25 15:46 1814unable to load symbol file: una ... -
iphone sdk 更新
2011-05-25 12:01 1182ipad被升级到4.3.3版本,但是使用device测试的时候 ... -
iphone in-app-purchase 注意的地方
2011-05-24 12:03 2039使用apple in-app-purchase 还是很麻烦! ... -
iphone 开发的一些错误 与答案
2011-05-23 17:47 7751。local declaration of 'delegat ...
相关推荐
cocos2d游戏开发教程中文版 1-13章全
cocos2d游戏开发之旅,对于初学者有很大的帮助,跟着教程做可以学会很对初级的知识
cocos2d游戏开发入门好书,详细介绍了cocos2d的安装和使用方法
cocos2d游戏开发实战.pdf 全本 高清 如果学习cocos2d的童鞋 可以下来看看 一定可以学到 不少的知识。
《iOS5 cocos2d游戏开发实战(第2版)》免费P
《iPhone & iPad cocos2d游戏开发实战》是介绍Cocos2d游戏编程和开发技术的书籍,介绍了使用Cocos2d中oc中相关的基础知识、简例游戏,游戏组件、粒子效果、地图、物理引擎和如何制作一个完整的游戏还有游戏发布到App...
【iOS-Cocos2d游戏开发】触屏事件处理机制 http://blog.csdn.net/tt5267621/article/details/7631729
cocos2dx游戏开发之旅 文档。无水印无广告
Cocos2D-iPhone是一个开源框架,利用它可以非常容易的在iPhone上开发2D游戏。它提供了物理,精灵(sprites),时差卷轴等多种特性
Cocos2d游戏开发教程(iOS5),ePUB类型电子书。 详细介绍了Cocos2d游戏开发涉及的方方面面。
Cocos2D这款用于开发2D游戏的开发框架以及由其衍生的Cocos2D-X跨平台开发框架和众多分支,正在帮助越来越多的开发者实现高效稳定的游戏开发。Cocos2D的稳定性、可商用型和流行程度已无需证明。目前App Store中国区...
Cocos2d-x 游戏开发
第六章用一款完整游戏项目《飞机大战》设计来详解手机游戏的开发流程,介绍了游戏进度和游戏菜单的实现、游戏按键处理与碰撞检测等。 第七章介绍了DeepBlueX引擎,这是对Cocos2d-x的二次封装,通过封装让开发者...
iPhone & iPad cocos2d游戏开发实战,完整版电子书
第六章用一款完整游戏项目《飞机大战》设计来详解手机游戏的开发流程,介绍了游戏进度和游戏菜单的实现、游戏按键处理与碰撞检测等。 第七章介绍了DeepBlueX引擎,这是对Cocos2d-x的二次封装,通过封装让开发者...
iOS 5 cocos2d游戏开发实战(第2版)
Cocos2d-x手机游戏开发与项目实战详解_随书代码 作者:沈大海 由于原作者共享的资源为UTF-8字符编码,下载后解压在win下显示乱码或还出现文件不全问题,现完整整理,解决所有乱码问题,供大家下载。
第六章用一款完整游戏项目《飞机大战》设计来详解手机游戏的开发流程,介绍了游戏进度和游戏菜单的实现、游戏按键处理与碰撞检测等。 第七章介绍了DeepBlueX引擎,这是对Cocos2d-x的二次封装,通过封装让开发者...
iphone&ipad cocos2d游戏开发实战[PDF完整版]
【iOS-Cocos2d游戏开发之二十二 】CCSpeed实现CCAnimate动画进行时设置慢动作以及设置游戏加减速进行(塔防游戏必备)! http://blog.csdn.net/xiaominghimi/article/details/7009503