自定义CCNode

对Touch事件的获取与处理可以使用CCLayer, CCMenuItem等,但是如果我们需要一个虚拟按键或者需要对特定精灵进行拖动等等,我们就需要自定义Touch类。

 

自定义Touch事件处理类重要的步骤是:

1. 继承CCTargetedTouchDelegate

2. 添加addTargetedDelegate(pDelegate, nPriority, bSwallowsTouches),来获取Touch事件,第二个参数是优先级,越高越优先。

3. 根据自己的需要override Touch事件处理函数:

virtual bool ccTouchBegan(CCTouch* touch, CCEvent* event);
virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);

 

如下是实例:这里添加一个自定义的Button到场景层。

 

[cpp]  view plain copy
 
  1. #include <cocos2d.h>  
  2.   
  3. USING_NS_CC;  
  4.   
  5. class MyButton : public CCNode, public CCTargetedTouchDelegate  
  6. {  
  7. public:  
  8.     MyButton(void);  
  9.     ~MyButton(void);  
  10.   
  11.     virtual void onEnter();  
  12.     virtual void onExit();  
  13.   
  14.     virtual bool ccTouchBegan(CCTouch* touch, CCEvent* event);  
  15.     virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);  
  16.     virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);  
  17.   
  18.     virtual bool init();  
  19.     CREATE_FUNC(MyButton);  
  20.   
  21. private:  
  22.     CCSprite *m_ShowPic;  
  23. };  
[cpp]  view plain copy
 
  1. #include "MyButton.h"  
  2.   
  3. MyButton::MyButton(void):m_ShowPic(NULL)  
  4. {  
  5. }  
  6.   
  7. MyButton::~MyButton(void)  
  8. {  
  9. }  
  10.   
  11. bool MyButton::init()  
  12. {  
  13.     bool bRet = false;  
  14.     do  
  15.     {  
  16.         CCSize winSize = CCDirector::sharedDirector()->getWinSize();  
  17.   
  18.         m_ShowPic = CCSprite::create("share.png");  
  19.         m_ShowPic->setPosition(ccp(winSize.width/2, winSize.height/2));  
  20.         this->addChild(m_ShowPic);  
  21.   
  22.         bRet = true;  
  23.     } while(0);  
  24.     return bRet;  
  25. }  
  26.   
  27. void MyButton::onEnter()  
  28. {  
  29.     CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true);  
  30.     CCNode::onEnter();  
  31. }  
  32.   
  33. void MyButton::onExit()  
  34. {  
  35.     CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);  
  36.     CCNode::onExit();  
  37. }  
  38.   
  39. bool MyButton::ccTouchBegan(CCTouch* touch, CCEvent* event)  
  40. {  
  41.     CCLog("MyButton Touch Began!");  
  42.   
  43.     return true;  
  44. }  
  45.   
  46. void MyButton::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent)  
  47. {  
  48.     CCLog("MyButton Touch Move!");  
  49. }  
  50.   
  51. void MyButton::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)  
  52. {  
  53.     CCLog("MyButton Touch Ended!");  
  54. }  

 

将以下代码其添加到HelloWorldScene::init中,

[cpp]  view plain copy
 
  1.   
  2. // Add MyButton  
  3. MyButton *button = MyButton::create();  
  4. this->addChild(button, 10);  
  5. button->setPosition(CCPointZero);  

运行测试:

 


在屏幕中点击可以看到Output中显示了我们的CCLog提示

可是我们没有点击到图片时也会提示出CCLog,这并不是我们想要的。

那么我们就需要添加自己需要的Touch事件处理代码了:

例如如下:

 

[cpp]  view plain copy
 
    1. bool MyButton::ccTouchBegan(CCTouch* touch, CCEvent* event)  
    2. {  
    3.     CCPoint position = convertTouchToNodeSpaceAR(touch);  
    4.     if (!m_ShowPic->boundingBox().containsPoint(position))  
    5.         return false;  
    6.     CCLog("MyButton Touch Began!");  
    7.     // add your code...  
    8.       
    9.     return true;  
    10. }  
    11.   
    12. void MyButton::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent)  
    13. {  
    14.     CCLog("MyButton Touch Move!");  
    15.     // add your code...  
    16. }  
    17.   
    18. void MyButton::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)  
    19. {  
    20.     CCLog("MyButton Touch Ended!");  
    21.     // add your code...  
    22. }  

转载于:https://www.cnblogs.com/MiniHouse/p/3963261.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值