`

【转】【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
{
	 	
}


此种监听狠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,一个是单一监听,一个是分发监听;
分享到:
评论

相关推荐

    cocos2d游戏开发之旅

    《cocos2d游戏开发之旅》是一本专为游戏开发初学者设计的教程,它深入浅出地介绍了使用cocos2d框架进行移动游戏开发的基本概念和技术。cocos2d是一个广泛使用的开源游戏引擎,特别适合开发2D游戏,其易用性、灵活性...

    cocos2d游戏开发

    Cocos2d是一款广泛用于创建2D游戏、交互式应用和视觉效果的开源框架,尤其在iOS和Mac OS X平台上非常流行。它基于Objective-C语言,同时也提供了Swift接口。本教程涵盖从基础到进阶的cocos2d游戏开发全过程,共13...

    Cocos2d游戏开发实战全本

    Cocos2d游戏开发是一个专注于2D游戏开发的开源框架,它支持多种操作系统和编程语言,广泛应用于iOS、Android、Windows等平台的游戏开发。Cocos2d允许开发者快速构建游戏应用,其丰富的功能和灵活的设计让游戏开发变...

    cocos2d游戏开发电子书超清

    《cocos2d游戏开发电子书超清》是一本针对初学者的游戏开发指南,专注于cocos2d框架的使用。cocos2d是一款强大的、开源的2D游戏引擎,广泛应用于iPhone游戏开发以及移动平台的其他应用开发。本书旨在帮助读者快速...

    cocos2d游戏开发入门

    Cocos2D-iPhone是iOS平台上一款广受欢迎的2D游戏开发框架,它以其高效、易用和功能丰富而受到开发者们的青睐。本教程将带你踏入Cocos2D游戏开发的大门,通过学习,你将掌握如何利用这个强大的工具创建令人惊叹的2D...

    cocos2d游戏开发基础(一).pdf

    ### cocos2d游戏开发基础知识点概述 #### 一、cocos2d简介 cocos2d是一款专为iOS和跨平台游戏开发设计的开源框架。它不仅能够支持2D游戏的构建,还提供了丰富的功能来简化游戏开发过程。cocos2d的核心优势在于其...

    全面剖析Cocos2d游戏触摸机制

    描述:“cocos2d作为手机2d游戏开发的优秀工具,在实际应用时多与屏幕触摸结合”,点明了触摸事件处理在Cocos2d游戏开发中的重要性。一个游戏的互动性很大程度上是通过触摸屏幕来实现的,因此理解和掌握Cocos2d的...

    【iOS-Cocos2d游戏开发】触屏事件处理机制

    本篇文章将详细讲解Cocos2d游戏开发中的触屏事件处理机制,帮助你理解如何利用这个框架来响应用户的触摸操作。 触屏事件处理在iOS游戏开发中至关重要,因为它直接决定了游戏的交互性和用户体验。Cocos2d中的触摸...

    Cocos2D-X开发学习笔记-触屏事件使用示例

    Cocos2D-X是一款强大的跨平台2D游戏开发框架,被广泛应用于iOS、Android、Windows Phone等多平台的游戏开发。本学习笔记将深入探讨如何在Cocos2D-X中处理触屏事件,让游戏能够响应用户的触摸操作。 首先,我们要...

    iPhone & iPad cocos2d游戏开发实战完整版

    《iPhone & iPad cocos2d游戏开发实战完整版》是一本专为iOS平台上的游戏开发者编写的实战指南。这本书深入浅出地介绍了如何使用cocos2d框架来创建高性能、交互性强的游戏应用程序。cocos2d是一款强大的开源游戏开发...

    Cocos Creator引擎开发:2D游戏开发

    Cocos Creator引擎开发:2D游戏开发_(10).游戏界面UI设计.docx Cocos Creator引擎开发:2D游戏开发_(11).游戏音频处理.docx Cocos Creator引擎开发:2D游戏开发_(12).游戏发布与优化.docx Cocos Creator引擎...

    Cocos2D-X2.2.3学习笔记7(事件队列之触屏事件

    Cocos2D-X是一款流行的开源游戏开发框架,广泛用于创建2D游戏、演示和其他图形交互应用。在Cocos2D-X 2.2.3版本的学习中,触屏事件处理是移动平台上非常重要的一环,因为它涉及到用户与游戏的直接交互。在本篇学习...

    cocos2d游戏开发教程(国外书籍译文)

    《cocos2d游戏开发教程(国外书籍译文)》是一份全面的资源包,旨在帮助初学者和进阶者掌握cocos2d游戏开发的核心技术。cocos2d是一款强大的开源游戏开发框架,广泛应用于iOS、Android以及多个平台的游戏制作。这份...

    Cocos2D游戏之旅(三):卡牌翻转效果2(只有当鼠标点中卡牌才翻转)

    Cocos2D是一款开源的2D游戏开发框架,它提供了丰富的图形渲染、动画、物理模拟以及用户输入处理等功能。在Cocos2D中,我们可以利用Node对象来构建游戏场景,每个Node可以包含子Node,形成一棵节点树,这使得游戏场景...

    iphone&ipad cocos2d游戏开发实战[PDF完整版]

    《iPhone&iPad cocos2d游戏开发实战》这本书深入浅出地介绍了在苹果移动设备上使用cocos2d框架进行游戏开发的技术与实践。cocos2d是一个强大的、开源的游戏开发库,尤其适合初学者和有一定编程基础的开发者,用于...

    cocos2d游戏开发期末设计

    本项目“cocos2d游戏开发期末设计”是一份基础游戏源码,旨在帮助初学者了解和掌握Cocos2d框架的基本使用。 1. **Cocos2d基本概念** - **场景(Scene)**:游戏中的一个独立可视区域,可以包含多个层(Layer)。 ...

    小鸟闯管道CocosCreator 2D小游戏

    《小鸟闯管道:CocosCreator 2D游戏开发详解》 CocosCreator是一款强大的2D游戏开发工具,尤其适合新手入门。在这个名为“小鸟闯管道”的2D小游戏项目中,我们能够深入理解CocosCreator的核心功能,包括其丰富的...

    iOS cocos2d游戏开发教程

    ### iOS Cocos2d游戏开发教程:从入门到精通 #### 引言 在苹果的iTunes App Store以及伴随而来的移动设备(如iPhone、iPod touch和iPad)的推动下,开发并销售自己的计算机游戏变得前所未有的容易。尽管这并不意味...

    cocos2d游戏实例完整代码

    这个“cocos2d游戏实例完整代码”提供了从基础到进阶的游戏开发实践,是初学者深入理解cocos2d框架的理想资源。 在iOS游戏开发中,cocos2d引擎扮演着核心角色,它包含了场景(Scene)、层(Layer)、精灵(Sprite)...

Global site tag (gtag.js) - Google Analytics