- 浏览: 187241 次
- 性别:
- 来自: 无锡
文章分类
最新评论
-
luoqianjiang:
很好,谢谢
一些iOS高效开源类库 -
sgjsdf5944:
没看明白。。。。。。。。。。
UIWebView打开doc、pdf文件 -
593864589:
mac 上不支持呢?
cocos2d 粒子设计器 -
寻墨小楼:
多谢了...正在弄这个。
mysql for mac 安装和基本操作 -
yueliancao:
楼主如何联系啊 我的MAC系统 #LoadModule php ...
mac OS x中配置apache + php + mysql
首先进入AppDelegate.m 类中,
- <strong>- (void) applicationDidFinishLaunching:(UIApplication*)application{}</strong>
在上面这个方法中添加如下一句开启多触点支持的代码:
- <strong> //支持多触点
- [viewController.view setMultipleTouchEnabled:YES];</strong>
其他类设置多触点:
[[[CCDirector sharedDirector]openGLView]setMultipleTouchEnabled:YES];
--------------------------本章补充完毕------------------------------------------------------------------------------
最近几天一直在啃cocos2d,消化了不少东西,基本可以有些把握下手写公司的游戏了;那么今天就把一些重点的拿出来分享下经验,给新童鞋们作为参考;
这篇就来详细介绍下cocos2d对用户触屏的监听事件进行下分析(cocos2d有很多详细的文章和教程,我这里只是出于自己的理解来说)
进入正题:从整体cocos2d对触屏的事件监听可以分为两种:
1.单一监听,所谓单一监听其实是跟cocos2d引擎框架有关,因为在cocos2d中每个游戏界面都可以使用一个CCLayout完成,那么当一个CCLayout在屏幕显示出来后,想要监听用户的按键事件,一般都会使用以下形式来进行监听:(注意:这里是CCLayout类进行监听的方式)
首先开启监听:
然后重写监听函数即可:
- self.isTouchEnabled=YES;
此种监听狠eazy,但是要注意这里是对CCLayout类进行的监听方式;
- //监听首次触发事件
- - (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
- {
- }
- //触摸事件 - 当手指在屏幕上进行移动
- - (void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
- {
- }
- //触摸事件 - 当手指从屏幕抬起时调用的方法
- -(void) ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
- {
- }
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];
- }
或者将注册的这句代码,放在重写的onEnter函数中也可;
(此函数是注册监听,如果里面什么都不写,则当前不会相应任何触屏事件;)
重写触摸的各事件函数,如下:
- //监听首次触发事件
- - (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-判断用户单击还是双击(针对一个触点)
- </pre><p></p><pre name="code" class="cpp">if([allTouches count]==1) {
- UITouch *touchOne = [[allTouches allObjects]objectAtIndex:0];
- switch ([touchOne tapCount]) {
- case 1:
- //单击
- CCLOG(@"%@",@"单击");
- break;
- case 2:
- //双击
- CCLOG(@"%@",@"双击");
- break;
- }
- }
1-判断用户两个触点之间是合拢还是分开(针对两个触点)
- </pre><p></p><p class="p1"></p><pre name="code" class="cpp"> <pre name="code" class="cpp">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,一个是单一监听,一个是分发监听;
ok,本章就到这里~~~(下周进入封闭开发了,吃睡都在公司了,咳咳,带上我的多啦a梦的小裤衩,娃哈哈~)
发表评论
-
cocos2d游戏开发,常用工具集合
2012-01-07 13:42 768位图字体工具Bitmap Font ToolsBMFont ( ... -
cocos2d-x开源游戏引擎发布0.10.0版,支持iphone/android/bada/win32/linux平台
2012-01-02 22:28 1475cocos2d-1.0.1-x-0.10.0版本 http:/ ... -
详解CCProgressTimer 进度条
2012-01-06 00:05 1007原文地址:http://blog.csdn.net/xi ... -
Cocos2D-iPhone-Extensions嵌入视频播放
2012-01-06 00:05 727原文地址:http://blog.csdn.net ... -
CCSprite利用Bezier(贝塞尔)做抛物线动作
2012-01-06 00:05 834原文地址:http://blog.csdn.net/xi ... -
浅析使用C++/C/OC在iOS游戏中混编
2012-01-11 22:10 1163原文地址:http://blog.csdn.net/xi ... -
使用Box2d物理系统
2012-01-11 22:10 781原文地址:http://blog.csdn.net/ ... -
添加粒子特效并解决粒子系统特效与Layer之间的坐标问题
2012-01-11 22:11 801原文地址:http://blog.csdn.net/ ... -
对触屏事件追加讲解,解决无法触发ccTouchMoved事件
2012-01-11 22:11 986原文地址:http://blog.csdn.net/xi ... -
从零开始学习OpenGL ES之二 – 简单绘图概述
2012-01-02 22:29 1329还有许多理论知识需要讨论,但与其花许多时间在复杂的数学 ... -
一. 搭建cocos2d游戏引擎环境HelloWorld!
2012-01-29 16:05 701注意:本文经 Himi 论坛ID:xiaom ... -
CCSpeed实现CCAnimate动画进行时设置慢动作
2012-01-30 13:48 1016原文地址:http://bl ... -
Cocos2D自定义精灵类并为你的精灵设置攻击帧
2012-01-30 13:49 878上周貌似没有写新的博文,那么今天Himi写个精品的博文 ... -
Cocos2D-iPhone精灵的基础知识点总汇
2012-03-06 09:41 939最近写了不少Cocos2d的博文了,那么由于Him ... -
Cocos2D-iPhone游戏数据存储的四种常用方式
2012-03-06 09:41 1376首先向大家说句抱歉,可能一些童鞋看到我的微薄了,我说突然 ... -
Cocos2D-iPhone解决滚屏背景/拼接地图有黑边(缝隙)
2012-03-06 09:41 1731本章节主要为大家 ... -
灵活使用精灵可视区域(TextureRect)与锚点(anchorPoint)
2012-03-06 09:42 1009今天Himi单用一篇博文来给童鞋们介绍精灵相关 ... -
Cocos2D-iPhone添加本地通知(UILocalNotification)
2012-03-06 09:42 1736首先申明下:希望大家转载的时候不要忘记给原文连接, ... -
详解CCProgressTimer 进度条
2012-03-09 17:43 950游戏开发中难免用到进度条,例如做一些游戏技能的C ... -
Cocos2D-iPhone-Extensions嵌入视频播放
2012-03-09 17:43 784自从Himi书籍《Android游戏编程之从零开始》一 ...
相关推荐
资源名称:Cocos2d-x实战:JS卷——Cocos2d-JS开发内容简介:本书是介绍Cocos2d-x游戏编程和开发技术书籍,介绍了使用Cocos2d-JS中核心类、瓦片地图、物理引擎、音乐音效、数据持久化、网络通信、性能优化、多平台...
继续输入cd Cocos2d-iPhone-0.99.5(cd Cocos2d-iPhone-0.99.5为解压的cocos2d文件夹名称)进入cocos2d文件夹中。 4。继续输入./install-templates.sh则打开你文件夹下面的install-templates.sh进行cocos2d的安装。...
免费、开源的2D游戏开发引擎,适用于iphone、ipad游戏开发。
谨记,该事件只能用于cocos2d-x中。 事件发送者需要继承EventDispatcher类 事件接收者需要继承EventHandle类,还需要实现handleEvent方法 事件发送者和事件接收者要在构造函数和析构函数中调用一下方法 事件发送者...
cocos2d-iphone~cocos2d-html5移植之旅
【iOS-Cocos2d游戏开发】Cocos2d-iPhone动作Action-扩展动作 http://blog.csdn.net/tt5267621/article/details/7626450
Cocos2D-iPhone是 一个开源框架,利用它可以非常容易的在iPhone上开发2D游戏。它提供了物理,精灵(sprites),时差卷轴(parallax scrolling),支持iPhone touch和accelerator等很多功能。
Cocos2D-iPhone开发教程,从易到难,适合新手学习,老手进阶
cocos2d-x-2.1.5
cocos2d-objc-ext, Cocos2D iphone的扩展和实用程序类 Cocos2D扩展cocos2d-iphone的扩展和实用程序类。cocos2d-iphone-ext,将包括不同的类和库,而不是suitet发布的官方 cocos2d-iphone 。 一些类最初可以能会被...
知易Cocos2D-iPhone开发教程源代码。 移动开发新手入门必备。
资源名称:大富翁手机游戏开发实战基于Cocos2d-x3.2引擎内容简介:李德国编著的《大富翁手机游戏开发实战(基于 Cocos2d-x3.2引擎)》使用Cocos2d-x游戏引擎技术,带领读者一步一步从零开始进行大富翁移动游戏的开发...
Cocos2d-x是移动跨平台开发最流行的游戏引擎,而本书是一本很全面的、比较‘接地气’的游戏开发教程。书中汇聚了热门手机游戏《捕鱼达人》开发的实战经验,作者从最基础的内容开始,逐步深入地介绍了Cocos2d-x的相关...
Cocos2d-iphone之HelloWorld
【iOS-Cocos2d游戏开发】Cocos2d-iPhone动作Action-瞬时动作 http://blog.csdn.net/tt5267621/article/details/7624781
cocos2d-x-3.2下载,不多说。或者可以下载另一个资源 cocos引擎老版本集合(cocos2d-x-2.2.1 - 3.5) http://download.csdn.net/download/crazymagicdc/9982656
Cocos2D-X开发学习笔记-触屏事件使用示例 教程地址:http://blog.csdn.net/yangyu20121224/article/details/10029143
子龙山人兄弟翻译cocos2d-iphone教程.rar 学习游戏开发的可以看看,非常好的入门教程
cocos2d-x实战项目 01.cocos2d-x原理及环境配置.rar 03.cocostudio使用方法及UI控制.rar 04.XML文件读取与骨骼动画.rarcocos2d-x实战项目 01.cocos2d-x原理及环境配置.rar 03.cocostudio使用方法及UI控制.rar 04.XML...
Cocos2d-x实战 JS卷 Cocos2d-JS开发 PDF 电子书完整版本