自定义CCNode

时间:2023-03-03 17:30:56

对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到场景层。

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

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

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

运行测试:

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

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

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

例如如下:

    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. return true;
    9. }
    10. void MyButton::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent)
    11. {
    12. CCLog("MyButton Touch Move!");
    13. // add your code...
    14. }
    15. void MyButton::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)
    16. {
    17. CCLog("MyButton Touch Ended!");
    18. // add your code...
    19. }