http://blog.linguofeng.com/archive/2012/09/12/cocos2d-x-touch.html
提供两种触摸事件处理机制:CCStandardTouchDelegate和CCTargetedTouchDelegate。
一、两种机制的四种不同的事件
CCStandardTouchDelegate默认事件 | |
---|---|
virtual void ccTouchesBegan(CCSet *pTouches,CCEvent *pEvent); |
处理按下事件 |
virtual void ccTouchesMoved(CCSet *pTouches,221)"> 处理按下并移动事件 | |
virtual void ccTouchesEnded(CCSet *pTouches,221)"> 处理松开事件 | |
virtual void ccTouchesCancelled(CCSet *pTouches,221)"> 处理打断事件 |
virtual bool ccTouchBegan(CCTouch *pTouch,221)"> 处理用户按下事件,true表示继续处理,否则false. |
virtual void ccTouchMoved(CCTouch *pTouch,232)">virtual void ccTouchEnded(CCTouch *pTouch,232)">virtual void ccTouchCancelled(CCTouch *pTouch,221)"> 处理打断事件 |
两者的区别:CCSet
与CCTouch
,一个事件集合一个单个事件。
事件分发的顺序:CCTargetedTouchDelegate
→CCStandardTouchDelegate
。
默认情况下所有CCLayer
都没有启用触摸事件,需要this->setIsTouchEnabled(true);
启用。
如需更改事件:void registerWithTouchDispatcher(void) {}
class MyLayer: public cocos2d:CCLayer { public virtualvoid registerWithTouchDispatcher(void); // addStandardDelegate() ccTouchesBegan(CCSet*pTouches,CCEventpEvent ccTouchesMoved ccTouchesEnded ccTouchesCancelled// addTargetedDelegate()bool ccTouchBeganCCTouchpTouch ccTouchMoved ccTouchEnded ccTouchCancelled } ::registerWithTouchDispatcher) // 委托,优先级 CCTouchDispatchersharedDispatcher()->addStandardDelegatethis kCCMenuTouchPriority// 委托,优先级,是否继续处理addTargetedDelegatetrue// 2.0版本以后CCDirectorsharedDirectorgetTouchDispatcher kCCMenuHandlerPriority}
二、 如果实现回调函数?
利用ccTouchBegan
或ccTouchesBegan
加以实现点击的回调
ccTouchesBegan// 单点pTouch =CCTouch*)(->anyObject());// 所有点forCCSetIterator iterTouch pTouches->begin();!=end iterTouch++) pCurTouch *)(*iterTouch // 获取点在视图中的坐标(左上角为原点)CCPoint touchLocation pTouchgetLocationInView// 把点的坐标转换成OpenGL坐标(左下角为原点) touchLocation convertToGL(touchLocation// 把OpenGL的坐标转换成CCLayer的坐标local convertToNodeSpace// 大小为100x100,坐标为(0,0)的矩形CCRect rect CCRectMake(0 100// 判断该坐标是否在rect矩形内 flag rect.containsPointlocalifflag // 回调else// 不执行}