博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
自定义CCNode
阅读量:4946 次
发布时间:2019-06-11

本文共 2671 字,大约阅读时间需要 8 分钟。

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

运行测试:

 

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

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

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

例如如下:

 

[cpp] 
 
    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

你可能感兴趣的文章
人情与面子
查看>>
JS加载获取父窗体传递的参数
查看>>
NumPy 学习笔记(三)
查看>>
选择排序详解
查看>>
SpringCloud系列五:Ribbon 负载均衡(Ribbon 基本使用、Ribbon 负载均衡、自定义 Ribbon 配置、禁用 Eureka 实现 Ribbon 调用)...
查看>>
【转】UML的9种图例解析
查看>>
python2.x到python3.x函数变化
查看>>
CSS之Position详解
查看>>
javascript面向对象重写右键菜单事件
查看>>
UVa10791 - Minimum Sum LCM
查看>>
Android底部导航栏——FrameLayout + RadioGroup
查看>>
NOI2016 优秀的拆分 后缀数组
查看>>
Java消息服务
查看>>
Jtester使用
查看>>
详解CSS样式的position属性
查看>>
Python机器学习(5)——朴素贝叶斯分类器
查看>>
Mac 10.12连接iSCSI硬盘软件iSCSI Initiator X
查看>>
ffmpeg获取文件的总时长(mp3/mp4/flv等)
查看>>
Python virtualenvwrapper在Win下的安装和管理
查看>>
费马小定理
查看>>