`
yuanlanjun
  • 浏览: 1184293 次
文章分类
社区版块
存档分类
最新评论

Cocos2d中添加手势支持的三种方法

 
阅读更多

最近一直琢磨在Cocos2d里添加手势的功能,找了一些资料加上自己的理解,整理出了三种方法和大家分享。

第一种,很简单,就是知易cocos2d-iPhone教程-04所介绍的(其实这并不是真正的手势,只是也能实现部分手势功能而已),代码如下:

1) 单击、双击处理

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{ 
	//Get all the touches. 
	NSSet *allTouches = [event allTouches]; 
	//Number of touches on the screen 
	switch ([allTouches count]) 
	{ 
		case 1: 
		{ 
			//Get the first touch. 
			UITouch *touch = [[allTouches allObjects] objectAtIndex:0]; 
			switch([touch tapCount]) 
			{ 
				case 1://Single tap 
					// 单击!! 
					break; 
				case 2://Double tap. 
					// 双击!! 
					break; } 
			} 
			break; 
		}
	}
}

2) 两个指头的分开、合拢手势。

//计算两个点之间的距离函数
- (CGFloat)distanceBetweenTwoPoints:(CGPoint)fromPoint toPoint:(CGPoint)toPoint
{
	float x = toPoint.x - fromPoint.x;
	float y = toPoint.y - fromPoint.y;
	return sqrt(x * x + y * y);
}

//记录多触点之间的初始距离
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
	NSSet *allTouches = [event allTouches];
	switch ([allTouches count])
	{
		case 1: { //Single touch
			break;}
		case 2: { //Double Touch
			//Track the initial distance between two fingers.
			UITouch *touch1 = [[allTouches allObjects] objectAtIndex:0];
			UITouch *touch2 = [[allTouches allObjects] objectAtIndex:1];
			initialDistance = [self distanceBetweenTwoPoints:[touch1 locationInView:[self view]] toPoint:[touch2 locationInView:[self view]]];
			}
			break;
		default:
			break;
	}
}

//两个指头移劢时,判断是分开还是合拢
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
	NSSet *allTouches = [event allTouches];
	switch ([allTouches count])
	{
		case 1:
			break;
		case 2:{
			UITouch *touch1 = [[allTouches allObjects] objectAtIndex:0];
			UITouch *touch2 = [[allTouches allObjects] objectAtIndex:1];
			//Calculate the distance between the two fingers.
			CGFloat finalDistance = [self distanceBetweenTwoPoints: [touch1 locationInView:[self view]] toPoint:[touch2 locationInView:[self view]]];
			//Check if zoom in or zoom out.
			if(initialDistance > finalDistance) {
				NSLog(@"Zoom Out"); // 合拢!!
			}
			else {
				NSLog(@"Zoom In"); // 分开!!
			}
			} 
			break;
	}
}

第二种,是在Cocoa China中找的一种办法,它的原理是通过修改CCLayer,CCNode两个Cocos2d类的源码实现手势支持:

1.首先要修改两个Cocos2d类的源码分别为CCLayer,CCNode

2.增加手势类源码 CCGestureRecognizer

以上三个类的源码,可以在我的资源中找着(地址:http://download.csdn.net/detail/wangqiuyun/4460442),(记住CCLayer与CCNode要覆盖原来的文件)
CCGestureRecognizer.h与.m要拷贝到当前工程的libs/cocos2d/Platforms/iOS目录下
在工程文件中加入CCGestureRecognizer.h与.m

3.完成以上工作后所有Node的子类中都可以使用手势了,如在HelloWorld工程中:

1)修改HelloWorldLayer.m中的init方法加入以下代码:

        //定义响应的手势类(支持所有UI手势)
        UILongPressGestureRecognizer * longPress = [[[UILongPressGestureRecognizer alloc] init] autorelease];
        longPress.minimumPressDuration = 0.5f;
        longPress.allowableMovement = 5.0f;
        //将UI手势对象longPress作为CCGestureRecognizer类的初始化参数
        //@selector(longPress:node:) 为响应手势的触发方法
        CCGestureRecognizer * rescognizer = [CCGestureRecognizer CCRecognizerWithRecognizerTargetAction:longPress target:self action:@selector(longPress:node:)];
        //设置手势类的代理
        rescognizer.delegate = self;
        //为self (当前为CCLayer对象)注册手势
        [self addGestureRecognizer:rescognizer];
        //必须设置self可接收Touch事件
        self.isTouchEnabled = YES;

2)另需要增加响应方法的实现:

-(void) longPress:(UIGestureRecognizer *) recognizer node:(CCNode *) node
{
    CCLOG(@"%s",__FUNCTION__);
}

3)需要支持协议UIGestureRecognizerDelegate 头文件如下:

#import "cocos2d.h"

// HelloWorldLayer
@interface HelloWorldLayer : CCLayer<UIGestureRecognizerDelegate>
{
}

// returns a CCScene that contains the HelloWorldLayer as the only child
+(CCScene *) scene;
-(void) longPress:(UIGestureRecognizer *) recognizer node:(CCNode *) node;
@end

第三种,自己琢磨的一种办法,个人感觉也还不错。

1)默认情况下面,cocos2d 模板并没有在AppDelegate里面包含一个RootViewController的属性,因此必须手动添加一个:
跳转到AppDelegate.h文件,并添加下面的代码:

@property (nonatomic, retain) RootViewController*viewController;

然后跳转到AppDelegate.m,@synthesize之:
@synthesize viewController; 

2)在场景或者层中m文件中,#import "AppDelegate.h"

+(id) scene
{
	//给层添加手势支持
	CCScene *scene = [CCScene node];
	
	// 'layer' is an autorelease object.
	HelloWorld *layer = [HelloWorld node];
	
	UIPanGestureRecognizer *gestureRecognizer = [[[UIPanGestureRecognizer alloc] initWithTarget:layer action:@selector(handlePanFrom:)] autorelease];
    
	AppDelegate *delegate=(AppDelegate *)[UIApplication sharedApplication].delegate;

	[delegate.viewController.view addGestureRecognizer:gestureRecognizer];
	
	// add layer as a child to scene
	[scene addChild: layer];
	
	// return the scene
	return scene;
}

//手势识别函数
- (void)handlePanFrom:(UIPanGestureRecognizer *)recognizer {
    
    if (recognizer.state == UIGestureRecognizerStateBegan) {    
        
        CGPoint touchLocation = [recognizer locationInView:recognizer.view];
        touchLocation = [[CCDirector sharedDirector] convertToGL:touchLocation];
        touchLocation = [self convertToNodeSpace:touchLocation];                
        //实现的效果.. 
        
    } else if (recognizer.state == UIGestureRecognizerStateChanged) {    
        
        CGPoint translation = [recognizer translationInView:recognizer.view];
        translation = ccp(translation.x, -translation.y);
        //实现的效果.. 
        [recognizer setTranslation:CGPointZero inView:recognizer.view];    
        
    } else if (recognizer.state == UIGestureRecognizerStateEnded) {
        
        //实现的效果..        
        
    }        
}

以上是本人总结的三种在Cocos2d里添加手势支持的方法,不妥之处欢迎各位指教!

分享到:
评论

相关推荐

    cocos2d-x手势识别(单击、双击、各形状)

    cocos2d-x手势识别(单击、双击、各形状)形状可根据需求自定义

    cocos2d入门cocos2d入门

    cocos2d入门 cocos2d入门 cocos2d入门 cocos2d入门 cocos2d入门 cocos2d入门

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

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

    cocos2d 手势识别

    cocos2d-x手势识别(单击、双击、各形状)形状可根据需求自定义------

    cocos2d-x json字符串与cocos2d::Value转换工具

    该资源主要用于cocos2d-x中Value与json字符串的相互转换,提供从json文件读取为cocos2d::Value,cocos2d::Value写入到文件,cocos2d::Value转换为json字符串,json字符串转换为cocos2d::Value。json字符串转换成cocos...

    cocos2d-x事件类

    在使用cocos2d-x开发游戏的过程中,为了实现逻辑和显示相分离。 在下通宵了一个晚上,写出了该事件类。 谨记,该事件只能用于cocos2d-x中。 事件发送者需要继承EventDispatcher类 事件接收者需要继承EventHandle类...

    Cocos2D权威指南

    第1章 开始前的准备工作 1 第2章 你的第一款iPhone游戏:垂直射击游戏 38 第3章 Cocos2D核心类 69 第4章 Cocos2D中的动作、特效与动画 152 第5章 Cocos2D中的文本渲染系统 229 共19章

    cocos2d-x-2.1.5

    cocos2d-x-2.1.5

    cocos2d-x中文显示

    cocos2d-x中文显示 cocos2d-x v2.2.0

    cocos2d-x实战项目

    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游戏代码

    cocos2d-x游戏代码

    cocos2d游戏资源

    cocos2d资料大全,里面有丰富的资源,游戏引擎是一种特殊的软件,它提供游戏开发时需要的常见功能;引擎会提供许多组件,使用这些组件能缩短开发时间,让游戏开发变得更简单;专业引擎通常会能比自制引擎表现出更好的...

    Cocos2d添加ZJoystick遥控杆所需源文件和图片

    Cocos2d添加ZJoystick遥控杆所需源文件和图片 cocos2d学习之路四(添加遥控杆)所需资源

    cocos2d初级教程-Cocos2d SimpleGame源码

    Ray Wenderlich的《Cocos2d SimpleGame》,被认为是cocos2d的初学者最好的教程,这本书被Cocos2D-X团队从objective-c转化到了c++版,并发布在了github上。在此感谢Ray Wenderlich的慷慨相助。 源代码是在cocos2d-x ...

    Cocos2d-x高级开发教程

    书中汇聚了热门手机游戏《捕鱼达人》开发的实战经验,作者从最基础的内容开始,逐步深入地介绍了Cocos2d-x的相关知识点。此外,书中的教学资源获得《捕鱼达人》手机游戏的授权,读者可以从一流游戏开发中高起点地...

    Cocos2D-X游戏开发技术精解

    资源名称:Cocos2D-X游戏开发技术精解内容简介:Cocos2D-X是一款支持多平台的 2D手机游戏引擎,支持iOS、Android、BlackBerry等众多平台。当前,很多移动平台流行的游戏,都是基于Cocos2D-X开发的。 《Cocos2D-X...

    cocos2d粒子编辑器 particle_builder -windows

    windows环境,一款很好用cocos2d粒子特效编辑器,里面有不少例子

    cocos2d播放视频方法相关

    cocos2d 播放视频的方法和相关。

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

    Cocos2d-x实战 JS卷 Cocos2d-JS开发 PDF 电子书完整版本

    Cocos2d-x实战 JS卷

    Cocos2d-x实战

Global site tag (gtag.js) - Google Analytics