cocos2dx 利用schedule实现长按触发事件功能

前端之家收集整理的这篇文章主要介绍了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. @H_404_50@#define__HELLOWORLD_SCENE_H__
  3. @H_404_50@#include"cocos2d.h"
  4. #include"cocos-ext.h"
  5. @H_404_50@
  6. usingnamespacestd;
  7. @H_404_50@usingnamespacecocos2d;
  8. usingnamespaceextension;
  9. @H_404_50@
  10. enum{
  11. @H_404_50@backgroundTag=0,
  12. };
  13. @H_404_50@
  14. classHelloWorld:publicCCLayer
  15. @H_404_50@{
  16. public:
  17. @H_404_50@virtualboolinit();
  18. staticCCScene*scene();
  19. @H_404_50@
  20. CCSprite*red_sp;
  21. @H_404_50@CCSprite*green_sp;
  22. CCSprite*blue_sp;
  23. @H_404_50@CCSprite*longTouch_sp;
  24. @H_404_50@voidupdate();
  25. @H_404_50@virtualboolccTouchBegan(CCTouch*pTouch,CCEvent*pEvent);
  26. virtualvoidccTouchMoved(CCTouch*pTouch,CCEvent*pEvent);
  27. @H_404_50@virtualvoidccTouchEnded(CCTouch*pTouch,CCEvent*pEvent);
  28. virtualvoidccTouchCancelled(CCTouch*pTouch,CCEvent*pEvent);
  29. @H_404_50@virtualvoidonEnter();
  30. virtualvoidonExit();
  31. @H_404_50@
  32. CREATE_FUNC(HelloWorld);
  33. @H_404_50@};
  34. @H_404_50@#endif//__HELLOWORLD_SCENE_H__

.cpp文件
  1. #include"HelloWorldScene.h"
  2. @H_404_50@#include"SimpleAudioEngine.h"
  3. @H_404_50@usingnamespacecocos2d;
  4. usingnamespaceCocosDenshion;
  5. @H_404_50@
  6. CCScene*HelloWorld::scene()
  7. @H_404_50@{
  8. CCScene*scene=CCScene::create();
  9. @H_404_50@HelloWorld*layer=HelloWorld::create();
  10. scene->addChild(layer);
  11. @H_404_50@returnscene;
  12. }
  13. @H_404_50@
  14. boolHelloWorld::init()
  15. @H_404_50@{
  16. if(!CCLayer::init())
  17. @H_404_50@{
  18. returnfalse;
  19. @H_404_50@}
  20. @H_404_50@CCSizesize=CCDirector::sharedDirector()->getWinSize();
  21. @H_404_50@//添加一背景当点击此背景时弹出键盘
  22. CCSprite*background=CCSprite::create("HelloWorld.png");
  23. @H_404_50@background->setScale(2);
  24. background->setPosition(ccp(size.width*0.5,size.height*0.5));
  25. @H_404_50@this->addChild(background,1,backgroundTag);
  26. @H_404_50@//红色精灵
  27. red_sp=CCSprite::create("Icon.png");
  28. @H_404_50@red_sp->setColor(ccRED);
  29. red_sp->setPosition(ccp(size.width*0.3,size.height*0.5));
  30. @H_404_50@this->addChild(red_sp,1);
  31. //绿色精灵
  32. @H_404_50@green_sp=CCSprite::create("Icon.png");
  33. green_sp->setColor(ccGREEN);
  34. @H_404_50@green_sp->setPosition(ccp(size.width*0.5,size.height*0.5));
  35. this->addChild(green_sp,2);
  36. @H_404_50@//蓝色精灵
  37. blue_sp=CCSprite::create("Icon.png");
  38. @H_404_50@blue_sp->setColor(ccBLUE);
  39. blue_sp->setPosition(ccp(size.width*0.7,size.height*0.5));
  40. @H_404_50@this->addChild(blue_sp,3);
  41. @H_404_50@returntrue;
  42. }
  43. @H_404_50@
  44. voidHelloWorld::update()
  45. @H_404_50@{
  46. this->unschedule(schedule_selector(HelloWorld::update));
  47. @H_404_50@//被长按触发的精灵做旋转动作
  48. longTouch_sp->runAction(CCRotateBy::create(1,360));
  49. @H_404_50@}
  50. @H_404_50@boolHelloWorld::ccTouchBegan(CCTouch*pTouch,CCEvent*pEvent)
  51. {
  52. @H_404_50@CCPointtouch_point=pTouch->getLocation();
  53. if(red_sp->boundingBox().containsPoint(touch_point)){
  54. @H_404_50@this->schedule(schedule_selector(HelloWorld::update),1);
  55. longTouch_sp=red_sp;
  56. @H_404_50@}elseif(green_sp->boundingBox().containsPoint(touch_point)){
  57. this->schedule(schedule_selector(HelloWorld::update),1);
  58. @H_404_50@longTouch_sp=green_sp;
  59. }elseif(blue_sp->boundingBox().containsPoint(touch_point)){
  60. @H_404_50@this->schedule(schedule_selector(HelloWorld::update),1);
  61. longTouch_sp=blue_sp;
  62. @H_404_50@}
  63. returntrue;
  64. @H_404_50@}
  65. @H_404_50@voidHelloWorld::ccTouchMoved(CCTouch*pTouch,CCEvent*pEvent)
  66. {
  67. @H_404_50@CCPointtouch_point=pTouch->getLocation();
  68. if(longTouch_sp){
  69. @H_404_50@//当手指滑动超出所点精灵范围时取消触发
  70. if(!longTouch_sp->boundingBox().containsPoint(touch_point)){
  71. @H_404_50@this->unschedule(schedule_selector(HelloWorld::update));
  72. }
  73. @H_404_50@}
  74. }
  75. @H_404_50@
  76. voidHelloWorld::ccTouchEnded(CCTouch*pTouch,CCEvent*pEvent)
  77. @H_404_50@{
  78. this->unschedule(schedule_selector(HelloWorld::update));
  79. @H_404_50@}
  80. @H_404_50@voidHelloWorld::ccTouchCancelled(CCTouch*pTouch,CCEvent*pEvent){}
  81. @H_404_50@
  82. voidHelloWorld::onEnter()
  83. @H_404_50@{
  84. //事件注册
  85. @H_404_50@CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,false);
  86. CCLayer::onEnter();
  87. @H_404_50@}
  88. voidHelloWorld::onExit()
  89. @H_404_50@{
  90. CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
  91. @H_404_50@CCLayer::onExit();
  92. }

效果如下图,当长按某一精灵达到1秒时,就会触发旋转动作。

猜你在找的Cocos2d-x相关文章