对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 MyButton MyButton *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... }