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

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里添加手势支持的方法,不妥之处欢迎各位指教!

分享到:
评论

相关推荐

    二级理论题(选择83+判断96).xlsx

    二级理论题(选择83+判断96).xlsx

    2024年中国超声非侵入式腐蚀检测传感器行业研究报告.docx

    2024年中国超声非侵入式腐蚀检测传感器行业研究报告

    设备OEE实践与教学知识

    设备自动化综合利用率实践,详细描述了OEE各方面的参数与应用,让设备自动化工厂利用此工具可以快速提高生产

    tensorflow-gpu-2.2.3-cp37-cp37m-win-amd64.whl

    python

    server-jre-8u411-windows-x64.tar.gz

    server-jre-8u411-windows-x64.tar.gz

    node-v7.8.0-sunos-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    基于51单片机秒表的程序设计.RAR

    单片机学习代码资料

    升压斩波电路Multisim源文件-输入电压DC15V,输出电压调节范围:+18V~+30V,电流:500mA~100mA范围

    输入电压DC15V,输出电压调节范围:+18V~+30V,电流:500mA~100mA范围,纹波1%

    nacos-server-2.3.2

    nacos-server-2.3.2

    聚类微博数据可视化分析系统 技术框架python + django + mysql + nlp + 聚类 +pycharm

    聚类微博数据可视化分析系统 技术框架 python + django + mysql + nlp + 聚类 +pycharm 角色介绍 普通用户 qqq 123456 模块分析 登录注册 数据获取 数据处理 数据挖掘 NLP情感分析 K-means聚类分析 敏感词预警 (支持邮箱发送模式) 不同聚类 (三个不同的聚类计算结果对比,选择最优的聚类来显示) 数据可视化模块 大事件数据可视化 热点数据排行 热门主题词云 评论数据可视化 时间顺序可视化 退出模块 数据库weibo_nlp_system 分析原理 我的最爱是动漫,你喜欢什么呢? 我 的 最爱 是 动漫 你 喜欢 什么 呢

    选择判断题库.doc

    选择判断题库.doc

    青藏高原城市化和生态环境迫切化大屏数据可视化系统

    【作品名称】:青藏高原城市化和生态环境迫切化大屏数据可视化系统 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。

    TCABEE 008-2020 轨道交通车站高效空调系统技术标准.pdf

    TCABEE 008-2020 轨道交通车站高效空调系统技术标准.pdf

    MySQL笔记思维导图

    MySQL笔记思维导图

    Windows 10 Docker 安装教程

    附件是Windows 10 Docker 安装教程, 文件绿色安全,请大家放心下载,仅供交流学习使用,无任何商业目的!

    node-v4.4.1-x86.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    东北大学信息学院控制与科学博士课程《matlab语言与应用》薛定宇课程作业 chapter1-chapter14 自己做的

    东北大学信息学院控制与科学博士课程《matlab语言与应用》薛定宇课程作业 chapter1-chapter14 自己做的

    azure-ai-services-speech-service(微软语音服务文档)

    azure-ai-services-speech-service(微软语音服务文档)

    数据库课程设计涵盖了从需求分析、概念设计、逻辑设计到物理设计的整个数据库设计流程 为了帮助学生更好地理解和掌握这些内容,课程设计

    数据库课程设计涵盖了从需求分析、概念设计、逻辑设计到物理设计的整个数据库设计流程。为了帮助学生更好地理解和掌握这些内容,课程设计提供了丰富的学习资源。 首先,课程提供了详细的教学课件和PPT,这些资源系统地介绍了数据库设计的基本概念和步骤,帮助学生建立起对数据库设计的整体认识。 其次,课程设计还提供了大量的实践案例和练习题。学生可以通过分析实际案例,了解数据库设计在实际应用中的具体实现方法。同时,练习题可以帮助学生巩固所学知识,提高实际操作能力。 此外,课程设计还鼓励学生利用网络资源进行学习。学生可以通过在线教程、视频系列以及经典的数据库设计书籍等拓展学习视野,深入了解数据库设计的最新技术和方法。 最后,课程设计还强调团队协作和沟通能力的培养。学生需要分组完成设计任务,通过团队合作解决问题,提高协作和沟通能力。 总之,数据库课程设计提供了丰富的学习资源和实践机会,帮助学生全面掌握数据库设计的基本知识和技能。通过这门课程的学习,学生将能够为后续的数据库应用开发和数据管理工作打下坚实的基础。

    17.rar

    17.rar

Global site tag (gtag.js) - Google Analytics