CCTouchDelegateProtocol(CCTouchDelegate触摸事件委托 两子类:1CCTargetedTouchDelegate,2CCStandardTouchDelegate)
2014-05-22 21:03
316 查看
#ifndef __TOUCH_DISPATHCHER_CCTOUCH_DELEGATE_PROTOCOL_H__
#define __TOUCH_DISPATHCHER_CCTOUCH_DELEGATE_PROTOCOL_H__
#include "cocoa/CCObject.h"
#include "ccConfig.h"
NS_CC_BEGIN
class CCTouch;
class CCEvent;
class CCSet;
class CCTouchDispatcher;
class CC_DLL CCTouchDelegate //触摸事件委托,就是系统捕捉到触摸事件后交由它或者它的子类处理,所以我们在处理触屏事件时,必须得继承它
{
public:
CCTouchDelegate() {}
virtual ~CCTouchDelegate(){}
//单点触摸 子类重写回调
virtual
bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouch); CC_UNUSED_PARAM(pEvent); return false;};
//optional(可选择的,随意的)
virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouch); CC_UNUSED_PARAM(pEvent);}
virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouch); CC_UNUSED_PARAM(pEvent);}
virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouch); CC_UNUSED_PARAM(pEvent);}
//多点触摸 子类重写回调 optional(可选择的,随意的)
virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouches); CC_UNUSED_PARAM(pEvent);}
virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouches); CC_UNUSED_PARAM(pEvent);}
virtual void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouches); CC_UNUSED_PARAM(pEvent);}
virtual void ccTouchesCancelled(CCSet *pTouches, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouches); CC_UNUSED_PARAM(pEvent);}
};
/**
@brief
Using this type of delegate results in two benefits(福利 收益):
- 1. You don't need to deal with CCSets, the dispatcher does the job of splitting(split 分解 分离)
them. You get exactly one UITouch per call.
- 2. You can *claim*(要求;声称;) a UITouch by returning YES in ccTouchBegan(声明一个触摸的开始通过在cctouchbegan返回true).
Updates of claimed
touches are sent only to the delegate(s) that claimed them. So if you get a move/
ended/canceled update you're sure it's your touch. This frees you from doing a
lot of checks when doing multi-touch(多点触摸).
/////////////
Cocos2d用CCTouchDispatcher类分发从IOS获取的触摸事件。它有两种分发方式一种是CCStandardTouchDelegate,一种是CCTargetedTouchDelegate。前者将所有的Touch信息直接传递给实现该协议的对象(CCStandardTouchDelegate),而后者则要求实现该代理的类一次只能处理一个事件,并且吃掉该事件,不再传播(CCTargetedTouchDelegate)。
所以CCTargetedTouchDelegate这个协议针对单点触控,而CCStandardTouchDelegate则可以处理当前屏幕触摸的每个触摸点,好像最多是十个吧。CCLayer默认情况下如果设定接受Touch事件,是使用标准协议。
我们可以看到,在注册协议的时候分别对应这样的方式:
-(void) addStandardDelegate:(id<CCStandardTouchDelegate>)
delegate priority:(int)priority;
-(void) addTargetedDelegate:(id<CCTargetedTouchDelegate>)
delegate priority:(int)priority swallowsTouches:(BOOL)swallowsTouches;
他们的区别在swallowsTouches参数,它表示是否吃掉该事件,而且只在目标协议里有意义。我们来分析各个协议的工作机理:
Standard这套协议,他会按照优先级给每个层排序。然后把touch按照顺序分别传进去,也就是说从上到下的所有层
只要开启了self.istouchenabled = YES 那么他们都会收到touch,而且不可以吃掉该事件。测试显示即使上面一层相应了该事件,它仍然会传递到下一层。
targeted这套协议只支持单点触控,即使是多点触控也当单点触控来用,但是返回的UITouch 就不知道是哪个了。他的好处是有swallow选项,即可判断是否继续传递 touch,而且,他的cctouchbegan函数是个bool值,如果你不返回一个yes的话,后面的
move 和 ended 都不会执行,如果要使用该协议,要在layer中手动设定代理:addStandardDelegate。因为CCLayer内部只注册标准代理。
我们的问题就来了,Standard协议无法吃掉事件,也许多个层都会相应的时候会出问题,而研究target协议实现的源码,也可以发现其实吃掉一个事件很简单,只要在Touch的集合中执行removeObject方法即可。
CCMenu继承了CCLayer,但是它注册的是targeted协议,所以我们很少发现CCMenu的混乱,因为它会将touch吃掉。
另外,CCTouchDispatcher中对两个协议的分配是有先后顺序的,首先会把事件传递给实现Target的代理,然后才是Stardard的代理。
//////////////////
(The name TargetedTouchDelegate relates to(涉及 有关) updates "targeting" their specific
handler, without bothering(烦扰)
the other handlers.)
@since v0.8
*/
class CC_DLL
CCTargetedTouchDelegate : public CCTouchDelegate
{
public:
/** Return YES to claim the touch.
@since v0
*/
virtual
bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent) { CC_UNUSED_PARAM(pTouch); CC_UNUSED_PARAM(pEvent);return false;};
// optional(可选择的,随意的)
virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouch); CC_UNUSED_PARAM(pEvent);}
virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouch); CC_UNUSED_PARAM(pEvent);}
virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouch); CC_UNUSED_PARAM(pEvent);}
};
/** @brief
This type of delegate is the same one used by CocoaTouch. You will receive(接收) all the events (Began,Moved,Ended,Canceled).
@since v0.8
*/
class CC_DLL
CCStandardTouchDelegate : public CCTouchDelegate
{
public:
// optional
virtual
void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouches); CC_UNUSED_PARAM(pEvent);}
virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouches); CC_UNUSED_PARAM(pEvent);}
virtual void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouches); CC_UNUSED_PARAM(pEvent);}
virtual void ccTouchesCancelled(CCSet *pTouches, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouches); CC_UNUSED_PARAM(pEvent);}
};
NS_CC_END
#endif
#define __TOUCH_DISPATHCHER_CCTOUCH_DELEGATE_PROTOCOL_H__
#include "cocoa/CCObject.h"
#include "ccConfig.h"
NS_CC_BEGIN
class CCTouch;
class CCEvent;
class CCSet;
class CCTouchDispatcher;
class CC_DLL CCTouchDelegate //触摸事件委托,就是系统捕捉到触摸事件后交由它或者它的子类处理,所以我们在处理触屏事件时,必须得继承它
{
public:
CCTouchDelegate() {}
virtual ~CCTouchDelegate(){}
//单点触摸 子类重写回调
virtual
bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouch); CC_UNUSED_PARAM(pEvent); return false;};
//optional(可选择的,随意的)
virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouch); CC_UNUSED_PARAM(pEvent);}
virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouch); CC_UNUSED_PARAM(pEvent);}
virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouch); CC_UNUSED_PARAM(pEvent);}
//多点触摸 子类重写回调 optional(可选择的,随意的)
virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouches); CC_UNUSED_PARAM(pEvent);}
virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouches); CC_UNUSED_PARAM(pEvent);}
virtual void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouches); CC_UNUSED_PARAM(pEvent);}
virtual void ccTouchesCancelled(CCSet *pTouches, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouches); CC_UNUSED_PARAM(pEvent);}
};
/**
@brief
Using this type of delegate results in two benefits(福利 收益):
- 1. You don't need to deal with CCSets, the dispatcher does the job of splitting(split 分解 分离)
them. You get exactly one UITouch per call.
- 2. You can *claim*(要求;声称;) a UITouch by returning YES in ccTouchBegan(声明一个触摸的开始通过在cctouchbegan返回true).
Updates of claimed
touches are sent only to the delegate(s) that claimed them. So if you get a move/
ended/canceled update you're sure it's your touch. This frees you from doing a
lot of checks when doing multi-touch(多点触摸).
/////////////
Cocos2d用CCTouchDispatcher类分发从IOS获取的触摸事件。它有两种分发方式一种是CCStandardTouchDelegate,一种是CCTargetedTouchDelegate。前者将所有的Touch信息直接传递给实现该协议的对象(CCStandardTouchDelegate),而后者则要求实现该代理的类一次只能处理一个事件,并且吃掉该事件,不再传播(CCTargetedTouchDelegate)。
所以CCTargetedTouchDelegate这个协议针对单点触控,而CCStandardTouchDelegate则可以处理当前屏幕触摸的每个触摸点,好像最多是十个吧。CCLayer默认情况下如果设定接受Touch事件,是使用标准协议。
我们可以看到,在注册协议的时候分别对应这样的方式:
-(void) addStandardDelegate:(id<CCStandardTouchDelegate>)
delegate priority:(int)priority;
-(void) addTargetedDelegate:(id<CCTargetedTouchDelegate>)
delegate priority:(int)priority swallowsTouches:(BOOL)swallowsTouches;
他们的区别在swallowsTouches参数,它表示是否吃掉该事件,而且只在目标协议里有意义。我们来分析各个协议的工作机理:
Standard这套协议,他会按照优先级给每个层排序。然后把touch按照顺序分别传进去,也就是说从上到下的所有层
只要开启了self.istouchenabled = YES 那么他们都会收到touch,而且不可以吃掉该事件。测试显示即使上面一层相应了该事件,它仍然会传递到下一层。
targeted这套协议只支持单点触控,即使是多点触控也当单点触控来用,但是返回的UITouch 就不知道是哪个了。他的好处是有swallow选项,即可判断是否继续传递 touch,而且,他的cctouchbegan函数是个bool值,如果你不返回一个yes的话,后面的
move 和 ended 都不会执行,如果要使用该协议,要在layer中手动设定代理:addStandardDelegate。因为CCLayer内部只注册标准代理。
我们的问题就来了,Standard协议无法吃掉事件,也许多个层都会相应的时候会出问题,而研究target协议实现的源码,也可以发现其实吃掉一个事件很简单,只要在Touch的集合中执行removeObject方法即可。
CCMenu继承了CCLayer,但是它注册的是targeted协议,所以我们很少发现CCMenu的混乱,因为它会将touch吃掉。
另外,CCTouchDispatcher中对两个协议的分配是有先后顺序的,首先会把事件传递给实现Target的代理,然后才是Stardard的代理。
//////////////////
(The name TargetedTouchDelegate relates to(涉及 有关) updates "targeting" their specific
handler, without bothering(烦扰)
the other handlers.)
@since v0.8
*/
class CC_DLL
CCTargetedTouchDelegate : public CCTouchDelegate
{
public:
/** Return YES to claim the touch.
@since v0
*/
virtual
bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent) { CC_UNUSED_PARAM(pTouch); CC_UNUSED_PARAM(pEvent);return false;};
// optional(可选择的,随意的)
virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouch); CC_UNUSED_PARAM(pEvent);}
virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouch); CC_UNUSED_PARAM(pEvent);}
virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouch); CC_UNUSED_PARAM(pEvent);}
};
/** @brief
This type of delegate is the same one used by CocoaTouch. You will receive(接收) all the events (Began,Moved,Ended,Canceled).
@since v0.8
*/
class CC_DLL
CCStandardTouchDelegate : public CCTouchDelegate
{
public:
// optional
virtual
void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouches); CC_UNUSED_PARAM(pEvent);}
virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouches); CC_UNUSED_PARAM(pEvent);}
virtual void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouches); CC_UNUSED_PARAM(pEvent);}
virtual void ccTouchesCancelled(CCSet *pTouches, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouches); CC_UNUSED_PARAM(pEvent);}
};
NS_CC_END
#endif
相关文章推荐
- cocos2d ccLayer响应触摸事件方法:CCStandardTouchDelegate 与 CCTargetedTouchDelegate
- cocos2d ccLayer响应触摸事件方法:CCStandardTouchDelegate 与 CCTargetedTouchDelegate
- cocos2d ccLayer响应触摸事件方法:CCStandardTouchDelegate 与 CCTargetedTouchDelegate
- cocos2d ccLayer响应触摸事件方法:CCStandardTouchDelegate 与 CCTargetedTouchDelegate
- Cocos2d-x之Touch事件处理机制 提供两种触摸事件处理机制:CCStandardTouchDelegate和CCTargetedTouchDelegate。
- CCLayer在Touch事件(Standard Touch Delegate和Targeted Touch Delegate)
- CCLayer中Touch事件(Standard Touch Delegate和Targeted Touch Delegate)
- Cocos-2d CCLayer的触摸响应CCTouchDelegate和CCStandardTouchDelegate 和 CCTargetedTouchDelegate
- (Standard Touch Delegate 和 Targeted Touch Delegate)CCLayer中的两种Touch类型
- quick-cocos2d-x游戏开发【10】——触摸捕获事件 cc.NODE_TOUCH_CAPTURE_EVENT
- Cocos-2d CCLayer的触摸响应CCTouchDelegate和CCStandardTouchDelegate 和 CCTargetedTouchDelegate
- cocos2dx之CCTouchTargetedDelegate、CCTouchStandardDelegate 吞噬触屏
- Cocos-2d CCLayer的触摸响应CCTouchDelegate和CCStandardTouchDelegate 和 CCTargetedTouchDelegate
- Cocos2d—X游戏开发之CCTouch屏幕触摸事件获取(九)
- ViewGroup和View以及TouchDelegate的触摸事件源码简析
- CCKeypadDelegate(Delegate 授权; 委托 ; 派…代表 ;键盘事件委托,就是系统捕捉到键盘事件后交由它或者它的子类处理 )
- Cocos-2d CCLayer的触摸响应CCTouchDelegate和CCStandardTouchDelegate 和 CCTargetedTouchDelegate
- 【quick-lua 002】 触摸捕获事件 cc.NODE_TOUCH_CAPTURE_EVENT
- Quick-Cocos2d-x游戏开发触摸捕获事件 cc.NODE_TOUCH_CAPTURE_EVENT
- quick-cocos2d-x游戏开发【10】——触摸捕获事件 cc.NODE_TOUCH_CAPTURE_EVENT