CCLayer中Touch事件(Standard Touch Delegate和Targeted Touch Delegate)

在做练习时,触控失灵,看源码了解下触控事件.

练习中的操作:直接在CClayer子类的init里 this->setTouchEnabled(true);

覆盖的事件处理方法

	virtual bool ccTouchBegan(CCTouch* touch, CCEvent* event);
	virtual void ccTouchMoved(CCTouch* touch, CCEvent* event);
	virtual void ccTouchEnded(CCTouch* touch, CCEvent* event);	

结果按键没反应

因为setTouchEnabled(true); 开启多点触摸,  而事件处理方法是针对单点的,所以不行.

解决方法1.

覆盖事件多点处理方法

	 // default implements are used to call script callback if exist
    	virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent);
   	virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent);
    	virtual void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent);
   	virtual void ccTouchesCancelled(CCSet *pTouches, CCEvent *pEvent);

从参数类型CCSet可以看出此参数是集合,应该是多个按的点.

解决方法2.

覆盖onEnter(),加上单点事件委托

onEnter()
{
	CCDirector* pDirector = CCDirector::sharedDirector();
	pDirector->getTouchDispatcher()->addTargetedDelegate(this, 0, true);
	CCLayer::onEnter();//这个要要加
}
CClayer::onEnter()
{
	....
    if (m_bTouchEnabled)	//这个m_bTouchEnabled就是setTouchEnabled(true)设置的
    {
        this->registerWithTouchDispatcher();//会设置Standard Touch Delegate,这也是为什么CCLayer默认采纳这种方式
    }
	.....
}

touch 事件分发顺序

cocos2d-x 首先派发事件给CCTargetedTouchDelegate, 再派发事件给CCStandardTouchDelegate。对于相同类型的TouchDelegate, 则是根据注册的优先级

来确定派发先后顺序。如果优先级也一样,则按照注册的顺序派发事件。

-------------------------------------------------------------------------------------------------------------------------

下面是别人总结分享的   http://www.cnblogs.com/pengyingh/articles/2435160.html

Cocos2d 开发中提供了两种touch处理方式,Standard Touch Delegate Targeted Touch Delegate方式(参见CCTouchDelegateProtocol.h中源代码),CCLayer默认是采用第一种方式(参见CCLayer的 registerWithTouchDispatcher方法)。

CCLayer子类中要能接收touch事件,首先需要激活touch支持,在init方法中设置isTouchEnabled值为YES。

Standard Touch Delegate(CCLayer默认采纳这种方式)

Standard方法中用户需要重载四个基本的touch处理方法,如下:

  1. -(void) ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; 

touch事件发生时,会调用该方法响应touch事件。如果是单点touch,则只需要调用 UITouch *touch = [touches anyObject],就可以获取touch对象;如果需要响应多点 touch,则需要调用[[event allTouches] allObjects]返回一个UITouch的NSArray对象,然后使用NSArray的objectAtIndex依次访问各个UITouch对象。

为了获取UITouch对象的坐标(假设该UITouch名称为touch),调用[touch locationInView: [ touch view]]会返回一个UIView相关的坐标viewPoint。

使用Cocos2d的新建应用程序向导创建一个新的cocos2d application时,在xxxAppDelegate类的applicationDidFinishLaunching方法中CCDirector会将UIView转换为支持OpenGL ES的EAGLView。此时,我们还需要将前面获取的UIView中的viewPoint转换为EAGLView坐标,调用[[CCDirector sharedDirector] convertToGL: viewPoint]即可实现。

  1. -(void) ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;  
  2. -(void) ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;   
  3. -(void) ccTouchesCancelled:(NSSet*)touch withEvent:(UIEvent *)event;  

这三个方法和ccTouchesBegan类似。

Targeted Touch Delegate方式

在standard方式中的响应处理事件处理的都是NSSet,而 targeted方式只处理单个的UITouch对象,在多点触摸条件下,应该采纳standard方式。在使用targeted方式之前需要重写CCLayer中的registerWithTouchDispatcher方法:

  1. //记得在头文件中导入“CCTouchDispatcher.h”  
  2.  
  3. -(void) registerWithTouchDispatcher {   
  4.        [[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES];  
  5.  } 

targeted方式中用户需要重载4个基本的处理方法,其中ccTouchBegan必须重写,其他三个是可选的。

  1. - (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event; (必须实现)  
  2. - (void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event;  
  3. - (void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event;  
  4. - (void)ccTouchCancelled:(UITouch *)touch withEvent:(UIEvent *)event; 

每次touch事件发生时,先调用ccTouchBegan方法,该方法对每个UITouch进行响应并返回一个BOOL值,若为YES,则后续的ccTouchMoved、ccTouchEnabled和ccTouchCancelled才会接着响应。

多点触摸支持

在xxxAppDelegate类的applicationDidFinishLaunching方法中加入下面代码

  1. [glView setMultipleTouchEnabled:YES]; 
 
 
 
关于swallowsTouches

[[CCTouchDispatcher  sharedDispatcher] addTargetedDelegate:self priority:kCCMenuTouchPriority swallowsTouches:YES];   

如果 swallowsTouches:YES && touch begin return  yes 

        那么他的move 和end就接受,,别的类就不再接受了。

 如果swallowsTouches:NO &&begin return  yes

        那么他的move 和end就接受,别的类就仍然可以接受。


内容概要:本文档是一份关于交换路由配置的学习笔记,系统地介绍了网络设备的远程管理、交换机与路由器的核心配置技术。内容涵盖Telnet、SSH、Console三种远程控制方式的配置方法;详细讲解了VLAN划分原理及Access、Trunk、Hybrid端口的工作机制,以及端口镜像、端口汇聚、端口隔离等交换技术;深入解析了STP、MSTP、RSTP生成树协议的作用与配置步骤;在路由部分,涵盖了IP地址配置、DHCP服务部署(接口池与全局池)、NAT转换(静态与动态)、静态路由、RIP与OSPF动态路由协议的配置,并介绍了策略路由ACL访问控制列表的应用;最后简要说明了华为防火墙的安全区域划分与基本安全策略配置。; 适合人群:具备一定网络基础知识,从事网络工程、运维或相关技术岗位1-3年的技术人员,以及准备参加HCIA/CCNA等认证考试的学习者。; 使用场景及目标:①掌握企业网络中常见的交换与路由配置技能,提升实际操作能力;②理解VLAN、STP、OSPF、NAT、ACL等核心技术原理并能独立完成中小型网络搭建与调试;③通过命令示例熟悉华为设备CLI配置逻辑,为项目实施故障排查提供参考。; 阅读建议:此笔记以实用配置为主,建议结合模拟器(如eNSP或Packet Tracer)动手实践每一条命令,对照拓扑理解数据流向,重点关注VLAN间通信、路由选择机制、安全策略控制等关键环节,并注意不同设备型号间的命令差异。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值