cocos2dx 2.2 之触摸事件

 cocos2dx  2.2  之触摸事件

 

要使精灵能够接收到触摸事件,无非要做三件事。

注册触摸事件;

接收触摸事件;

处理触摸事件。

下面就从这三点出发,来了解一下精灵如何响应触摸事件。

1.注册触摸事件

精灵类Poker继承Sprite和CCTargetedTouchDelegate,并重写CCTargetedTouchDelegate的三个函数ccTouchBegan,ccTouchMoved,ccTouchEnded

同时加入辅助函数rect()和containTouchPoint(CCTouch* touch)用于后面的判断。

poker.h文件:

  1. class Poker : public CCSprite ,public CCTargetedTouchDelegate  
  2. {  
  3.     PokerState m_state;  
  4. public:  
  5.   
  6.     Poker(void);  
  7.     CCRect rect();  
  8.     virtual void onEnter();  
  9.     virtual void onExit();  
  10.     virtual ~Poker(void);  
  11.     boolean containTouchPoint(CCTouch* touch);  
  12.     virtual bool ccTouchBegan(CCTouch *touch ,CCEvent *event);  
  13.     virtual void ccTouchMoved(CCTouch *touch ,CCEvent *event);  
  14.     virtual void ccTouchEnded(CCTouch *touch ,CCEvent *event);  
  15.   
  16. };  

poker.cpp文件:

这里需要再poker.cpp中添加具体的注册行为,onEnter和onExit函数分别是精灵创建和销毁时调用,因为可以在这两个函数中添加注册和销毁注册。

  1. //CCNode进入场景时调用  
  2. void Poker::onEnter()  
  3. {  
  4.     CCDirector* pDirector = CCDirector::sharedDirector();  
  5.     pDirector->getTouchDispatcher()->addTargetedDelegate(this, 0, true);  
  6.     CCSprite::onEnter();  
  7. }  
  8.   
  9. //CCNode退出场景时调用  
  10. void Poker::onExit()  
  11. {  
  12.     CCDirector* pDirector = CCDirector::sharedDirector();  
  13.     pDirector->getTouchDispatcher()->removeDelegate(this);  
  14.     CCSprite::onExit();  
  15. }   

以上,我们的触摸事件注册流程就完成了。

2.接收触摸事件

接收触摸事件,实际上就是重写CCTargetedTouchDelegate的三个函数ccTouchBegan,ccTouchMoved,ccTouchEnded。
  1. bool Poker::ccTouchBegan(CCTouch *touch ,CCEvent *event)  
  2. {  
  3.     CCLog("Poker ccTouchBegan ");  
  4.     return false;  
  5. }  
  6.   
  7.   
  8. void Poker::ccTouchMoved(CCTouch *touch ,CCEvent *event)  
  9. {  
  10.     CCLog("Poker ccTouchMoved ");  
  11. }  
  12.   
  13.   
  14.   
  15. void Poker::ccTouchEnded(CCTouch *touch ,CCEvent *event)  
  16. {  
  17.       
  18.     CCLog("Poker ccTouchEnded ");  
  19. }  
如此,接收流程已经完成,无意外的话,运行可以看到打印日志了。

3.处理触摸事件

首先要获取当前精灵所在的矩形
也即是CCRect Poker::rect()需要做的事情。
请注意,这里获取的方式的前提是,精灵使用系统默认的锚点,也即是精灵的正中央,如果改变过精灵的锚点(setAnchorPoint),那么就需要改变计算方法了。
  1. CCRect Poker::rect()  
  2. {  
  3.     CCSize size = getTexture()->getContentSize();  
  4.     return CCRectMake(-size.width / 2 ,-size.height / 2, size.width ,size.height);  
  5. }  
如果将当前精灵也看做一个坐标系,若精灵的长为100,宽为100,那么获取的矩形应该是x = -50 , y = -50 ,width = 100 ,height = 100
其次,将触摸事件的点转化为当前精灵内部坐标系的点。
(可能不是很好理解,但是我们每一个继承自CCNode的结点都可以看做一个坐标系)
  1. boolean  Poker::containTouchPoint(CCTouch* touch)  
  2. {  
  3.     return rect().containsPoint(convertTouchToNodeSpaceAR(touch));  
  4. }  
在CCSprite内部使用convertTouchToNodeSpaceAR函数就可以将当前触摸点转化成精灵内部坐标系的点。
最后,判断触摸事件,并处理。
  1. bool Poker::ccTouchBegan(CCTouch *touch ,CCEvent *event)  
  2. {  
  3.       
  4.     int x = getPositionX();  
  5.     int y = getPositionY();  
  6.     if (containTouchPoint(touch))  
  7.     {  
  8.         setPosition(ccp(x , y + 30));  
  9.     }  
  10.       
  11.     CCLog("Poker ccTouchBegan ");  
  12.     return false;  
  13. }  
如果发现当前触摸点在CCSprite的内部,则将当前CCSprite的Y坐标上移30个像素。

posted @ 2015-09-21 18:58  silent-bobo  阅读(411)  评论(0编辑  收藏  举报