• 自定义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 plaincopy
     
    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 plaincopy
     
    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 plaincopy
     
    1. ////////////////////////////  
    2. // Add MyButton  
    3. MyButton *button = MyButton::create();  
    4. this->addChild(button, 10);  
    5. button->setPosition(CCPointZero);  

    运行测试:


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

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

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

    例如如下:

    [cpp] view plaincopy
     
      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. }  
  • 相关阅读:
    css calc()
    timeline css
    $obj->0
    释放内存
    Aggregate (GROUP BY) Function Descriptions
    算法-拼团-推荐团排序
    linux 命令行 执行 php
    c memery
    获取监控信息,产生监控响应动作
    green rgb(255, 102, 0) #FF6600
  • 原文地址:https://www.cnblogs.com/MiniHouse/p/3963261.html
Copyright © 2020-2023  润新知