cocos2d-x 自定义Touch事件处理类

来源:互联网 发布:uefi修复windows引导 编辑:程序博客网 时间:2024/05/23 21:29

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

#include <cocos2d.h>USING_NS_CC;class MyButton : public CCNode, public CCTargetedTouchDelegate{public:MyButton(void);~MyButton(void);virtual void onEnter();virtual void onExit();virtual bool ccTouchBegan(CCTouch* touch, CCEvent* event);virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);virtual bool init();CREATE_FUNC(MyButton);private:CCSprite *m_ShowPic;};
#include "MyButton.h"MyButton::MyButton(void):m_ShowPic(NULL){}MyButton::~MyButton(void){}bool MyButton::init(){    bool bRet = false;    do    {CCSize winSize = CCDirector::sharedDirector()->getWinSize();        m_ShowPic = CCSprite::create("share.png");m_ShowPic->setPosition(ccp(winSize.width/2, winSize.height/2));this->addChild(m_ShowPic);        bRet = true;    } while(0);    return bRet;}void MyButton::onEnter(){CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true);CCNode::onEnter();}void MyButton::onExit(){CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);CCNode::onExit();}bool MyButton::ccTouchBegan(CCTouch* touch, CCEvent* event){CCLog("MyButton Touch Began!");return true;}void MyButton::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent){CCLog("MyButton Touch Move!");}void MyButton::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent){CCLog("MyButton Touch Ended!");}

 

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

////////////////////////////// Add MyButtonMyButton *button = MyButton::create();this->addChild(button, 10);button->setPosition(CCPointZero);
运行测试:


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

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

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

例如如下:

bool MyButton::ccTouchBegan(CCTouch* touch, CCEvent* event){CCPoint position = convertTouchToNodeSpaceAR(touch);if (!m_ShowPic->boundingBox().containsPoint(position))return false;CCLog("MyButton Touch Began!");// add your code...return true;}void MyButton::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent){CCLog("MyButton Touch Move!");// add your code...}void MyButton::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent){CCLog("MyButton Touch Ended!");// add your code...}