cocos2dx 利用schedule實現長按觸發事件功能

在cocos2dx中給我們提供了很多點擊屏幕觸發的事件監聽,比如CCMenu類的一系列 ,ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent) ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent)等監聽方法,但有時項目中會要求當長按某一精靈達到一定時間時才響應觸發事件,而不是簡單的按下擡起,這時就可以利用schedule來實現,下面是實現代碼。


.h文件
  1. #ifndef __HELLOWORLD_SCENE_H__  
  2. #define __HELLOWORLD_SCENE_H__  
  3.   
  4. #include "cocos2d.h"  
  5. #include "cocos-ext.h"  
  6.   
  7. using namespace std;  
  8. using namespace cocos2d;  
  9. using namespace extension;  
  10.   
  11. enum{  
  12.     backgroundTag = 0,  
  13. };  
  14.   
  15. class HelloWorld : public CCLayer  
  16. {  
  17. public:  
  18.     virtual bool init();  
  19.     static CCScene* scene();  
  20.       
  21.     CCSprite* red_sp;  
  22.     CCSprite* green_sp;  
  23.     CCSprite* blue_sp;  
  24.     CCSprite* longTouch_sp;  
  25.       
  26.     void update();  
  27.       
  28.     virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);  
  29.     virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);  
  30.     virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);  
  31.     virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);  
  32.     virtual void onEnter();  
  33.     virtual void onExit();  
  34.       
  35.     CREATE_FUNC(HelloWorld);  
  36. };  
  37.   
  38. #endif // __HELLOWORLD_SCENE_H__  

.cpp文件
  1. #include "HelloWorldScene.h"  
  2. #include "SimpleAudioEngine.h"  
  3.   
  4. using namespace cocos2d;  
  5. using namespace CocosDenshion;  
  6.   
  7. CCScene* HelloWorld::scene()  
  8. {  
  9.     CCScene *scene = CCScene::create();  
  10.     HelloWorld *layer = HelloWorld::create();  
  11.     scene->addChild(layer);  
  12.     return scene;  
  13. }  
  14.   
  15. bool HelloWorld::init()  
  16. {  
  17.     if ( !CCLayer::init() )  
  18.     {  
  19.         return false;  
  20.     }  
  21.       
  22.     CCSize size = CCDirector::sharedDirector()->getWinSize();  
  23.       
  24.     //添加一背景當點擊此背景時彈出鍵盤  
  25.     CCSprite* background = CCSprite::create("HelloWorld.png");  
  26.     background->setScale(2);  
  27.     background->setPosition(ccp(size.width*0.5, size.height*0.5));  
  28.     this->addChild(background,1,backgroundTag);  
  29.       
  30.     //紅色精靈  
  31.     red_sp = CCSprite::create("Icon.png");  
  32.     red_sp->setColor(ccRED);  
  33.     red_sp->setPosition(ccp(size.width*0.3, size.height*0.5));  
  34.     this->addChild(red_sp,1,1);  
  35.     //綠色精靈  
  36.     green_sp = CCSprite::create("Icon.png");  
  37.     green_sp->setColor(ccGREEN);  
  38.     green_sp->setPosition(ccp(size.width*0.5, size.height*0.5));  
  39.     this->addChild(green_sp,1,2);  
  40.     //藍色精靈  
  41.     blue_sp = CCSprite::create("Icon.png");  
  42.     blue_sp->setColor(ccBLUE);  
  43.     blue_sp->setPosition(ccp(size.width*0.7, size.height*0.5));  
  44.     this->addChild(blue_sp,1,3);  
  45.       
  46.     return true;  
  47. }  
  48.   
  49. void HelloWorld::update()  
  50. {  
  51.     this->unschedule(schedule_selector(HelloWorld::update));  
  52.     //被長按觸發的精靈做旋轉動作  
  53.     longTouch_sp->runAction(CCRotateBy::create(1, 360));  
  54. }  
  55.   
  56. bool HelloWorld::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)  
  57. {  
  58.     CCPoint touch_point = pTouch->getLocation();  
  59.     if (red_sp->boundingBox().containsPoint(touch_point)) {  
  60.         this->schedule(schedule_selector(HelloWorld::update), 1);  
  61.         longTouch_sp = red_sp;  
  62.     }else if(green_sp->boundingBox().containsPoint(touch_point)){  
  63.         this->schedule(schedule_selector(HelloWorld::update), 1);  
  64.         longTouch_sp = green_sp;  
  65.     }else if(blue_sp->boundingBox().containsPoint(touch_point)){  
  66.         this->schedule(schedule_selector(HelloWorld::update), 1);  
  67.         longTouch_sp = blue_sp;  
  68.     }  
  69.     return  true;  
  70. }  
  71.   
  72. void HelloWorld::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent)  
  73. {  
  74.     CCPoint touch_point = pTouch->getLocation();  
  75.     if (longTouch_sp) {  
  76.         //當手指滑動超出所點精靈範圍時取消觸發  
  77.         if (!longTouch_sp->boundingBox().containsPoint(touch_point)) {  
  78.             this->unschedule(schedule_selector(HelloWorld::update));  
  79.         }  
  80.     }  
  81. }  
  82.   
  83. void HelloWorld::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)  
  84. {  
  85.     this->unschedule(schedule_selector(HelloWorld::update));  
  86. }  
  87.   
  88. void HelloWorld::ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent){}  
  89.   
  90.   
  91. void HelloWorld::onEnter()  
  92. {  
  93.     //事件註冊  
  94.     CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, false);  
  95.     CCLayer::onEnter();  
  96. }  
  97. void HelloWorld::onExit()  
  98. {  
  99.     CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);  
  100.     CCLayer::onExit();  
  101. }  

效果如下圖,當長按某一精靈達到1秒時,就會觸發旋轉動作。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章