cocos2d-x 触摸消息响应

单点触控:Targeted Touch Delegate方式

 

一个层接收触摸消息需要如下步骤:

1,在初始化阶段将此层的属性设置为接收触摸消息。例如在init()函数中添加:

m_bIsTouchEnabled = true;  或 setIsTouchEnabled(true);

2,重载函数virtual void registerWithTouchDispatcher(void);

因为默认的方式为Standard Touch Delegate,因此需要重新注册,在函数中添加以下语句

  1. <SPAN style="FONT-SIZE: 16px">CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this, INT_MIN+1, true);</SPAN>  
CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this, INT_MIN+1, true);

 

其中第二个参数为优先级,优先级数值越低,越先响应(未测试)

3,重载触摸响应函数

接收触摸消息需要重载以下函数

 

  1. virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);// 必须实现   
  2. virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);  
  3. virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);  
  4. virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);  
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);


这里需要注意的事第一个函数是必须实现的,否则点击会抛出异常

 

 

 

多点触控:Standard Touch Delegate方式(CCLayer默认采纳这种方式)

支持这种方式同样需要三个步骤:

1,同Targeted Touch Delegate方式第一步

2,将此节点添加到StandardDelegate(对于CCLayer可以省略此步),以实现一个可以点击的CCSprite为例:

     在onEnter函数中添加

  1. cocos2d::CCTouchDispatcher::sharedDispatcher()->addStandardDelegate(this,0);  
cocos2d::CCTouchDispatcher::sharedDispatcher()->addStandardDelegate(this,0);


3,重载响应函数

 

  1. virtual void ccTouchesBegan(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);  
  2. virtual void ccTouchesMoved(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);  
  3. virtual void ccTouchesEnded(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);  
  4. virtual void ccTouchesCancelled(cocos2d::CCSet*pTouches,cocos2d::CCEvent *pEvent);  
virtual void ccTouchesBegan(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);
virtual void ccTouchesMoved(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);
virtual void ccTouchesEnded(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);
virtual void ccTouchesCancelled(cocos2d::CCSet*pTouches,cocos2d::CCEvent *pEvent);


其中 pTouches为一个CCTouch的集合,可以通过以下方法来获取单一触点

 

 

  1. if(!pTouches||!pTouches->count())  
  2. {  
  3.     return;  
  4. }  
  5. cocos2d::CCTouch* pTouch = (cocos2d::CCTouch*)(*(pTouches->anyObject()));  
if(!pTouches||!pTouches->count())
{
    return;
}
cocos2d::CCTouch* pTouch = (cocos2d::CCTouch*)(*(pTouches->anyObject()));


获取全部触点需要遍历这个集合

 

 

  1. for(CCSetIterator iterTouch = pTouches->begin(); iterTouch != pTouches->end(); iterTouch++)  
  2. {  
  3.     CCTouch *pCurTouch =  (cocos2d::CCTouch*)(*iterTouch);  
  4.     // do something   
  5. }  
for(CCSetIterator iterTouch = pTouches->begin(); iterTouch != pTouches->end(); iterTouch++)
{
    CCTouch *pCurTouch =  (cocos2d::CCTouch*)(*iterTouch);
    // do something
}

 

 

4,从StandardDelegate移除:

如果第二步将自定义的CCSprite加入到StandardDelegate,那么在此CCSprite被清除时,移除此CCSprite。在onExit函数中调用

  1. cocos2d::CCTouchDispatcher::sharedDispatcher()->removeDelegate(this);  
cocos2d::CCTouchDispatcher::sharedDispatcher()->removeDelegate(this);

 

获取触点位置

从CCTouch中可以获取到触点的位置主要有以下几种方式

1:获取UIView坐标

  1. CCPoint ptTouch = pTouch->locationInView(pTouch->view());  
CCPoint ptTouch = pTouch->locationInView(pTouch->view());

 

这里获取的是设备的UIView坐标,原点在左上角,X向右侧递增,Y向下递增。

2:获取节点坐标

  1. CCPoint ptNode = convertTouchToNodeSpace(pTouch);  
CCPoint ptNode = convertTouchToNodeSpace(pTouch);

 

节点坐标的计算同GL坐标,它以所在节点的左下角为原点,X向右递增,Y向上递增

3,获取锚点坐标

一个节点,所有的变换都是基于锚点,比如平移,旋转,缩放等。可以通过函数setAnchorPoint(CCPoint var);来改变锚点。cocos2d-x里节点默认的锚点是中心点,即等同于setArchorPoint(ccp(0.5, 0.5));其中(0,0)代表左下角,(1,1)代表右上角。

  1. CCPoint ptNodeAR = convertTouchToNodeSpaceAR(pTouch);  
CCPoint ptNodeAR = convertTouchToNodeSpaceAR(pTouch);


这时,坐标系的原点在该节点的锚点位置。X向右递增,向左递减;Y向上递增,向下递减

你可能感兴趣的:(cocos2d-x)