Cocos2d-x之Touch事件处理机制

转载自:http://blog.linguofeng.com/archive/2012/09/12/cocos2d-x-touch.html

Cocos2d-x之Touch事件处理机制

提供两种触摸事件处理机制:CCStandardTouchDelegate和CCTargetedTouchDelegate。

CCStandardTouchDelegate 默认事件
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); 处理打断事件
CCTargetedTouchDelegate
virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent); 处理用户按下事件,true表示继续处理, 否则false.
virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent); 处理按下并移动事件
virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent); 处理松开事件
virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent); 处理打断事件

两者的区别: CCSet 与 CCTouch ,一个事件集合一个单个事件。

事件分发的顺序: CCTargetedTouchDelegate → CCStandardTouchDelegate 。

默认情况下所有 CCLayer 都没有启用触摸事件,需要 this->setIsTouchEnabled(true); 启用。

如需更改事件: void registerWithTouchDispatcher(void) {}

 
 
class MyLayer : public cocos2d : CCLayer  
{
public :
virtual void registerWithTouchDispatcher ( void );
// addStandardDelegate()
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 );
// addTargetedDelegate()
virtual bool  ccTouchBegan ( CCTouch * pTouch , CCEvent * pEvent );
virtual void  ccTouchMoved ( CCTouch * pTouch , CCEvent * pEvent );
virtual void  ccTouchEnded ( CCTouch * pTouch , CCEvent * pEvent );
virtual void  ccTouchCancelled ( CCTouch * pTouch , CCEvent * pEvent );
}
void MyLayer :: registerWithTouchDispatcher ( void )  
{
// 委托,优先级
CCTouchDispatcher :: sharedDispatcher ()-> addStandardDelegate ( this ,  kCCMenuTouchPriority );
// 委托,优先级,是否继续处理
CCTouchDispatcher :: sharedDispatcher ()-> addTargetedDelegate ( this ,  kCCMenuTouchPriority , true );
// 2.0版本以后
CCDirector :: sharedDirector ()-> getTouchDispatcher ()-> addStandardDelegate ( this ,  kCCMenuHandlerPriority );
CCDirector :: sharedDirector ()-> getTouchDispatcher ()-> addTargetedDelegate ( this ,  kCCMenuHandlerPriority , true );
}

利用 ccTouchBegan 或 ccTouchesBegan 加以实现点击的回调

 
 
void MyLayer :: ccTouchesBegan ( CCSet * pTouches , CCEvent * pEvent )  
{
// 单点
CCTouch * pTouch = ( CCTouch *)( pTouches -> anyObject ());
// 所有点
for ( CCSetIterator iterTouch = pTouches -> begin (); iterTouch != pTouches -> end (); iterTouch ++)  
{
CCTouch * pCurTouch = ( CCTouch *)(* iterTouch );
}
// 获取点在视图中的坐标(左上角为原点)
CCPoint touchLocation = pTouch -> getLocationInView ();
// 把点的坐标转换成OpenGL坐标(左下角为原点)
touchLocation = CCDirector :: sharedDirector ()-> convertToGL ( touchLocation );
// 把OpenGL的坐标转换成CCLayer的坐标
CCPoint local = convertToNodeSpace ( touchLocation )
// 大小为100x100,坐标为(0, 0)的矩形
CCRect * rect = CCRectMake ( 0 , 0 , 100 , 100 );
// 判断该坐标是否在rect矩形内
bool flag = rect . containsPoint ( local )
if ( flag )
{
// 回调
}  
else  
{
// 不执行
}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值