Cocos2d-X 3.4版-技能冷却按钮《赵云要格斗》

前端之家收集整理的这篇文章主要介绍了Cocos2d-X 3.4版-技能冷却按钮《赵云要格斗》前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

这里为需要注意的是开启触屏的方法,以及NotificationCenter的用法有所改变。

这个类中我改动了一些代码,比如说SkellEnd时候没有就将ProgressTimer设置为

setVisible(false),而是将它的percent设置为0,然后再冷却结束后又可以冲percent0开始播放动画。

SkillButton.h

  1. //
  2. // SkillButton.h
  3. // Fight
  4. //
  5. // Created by Cytzrs on 15/2/4.
  6. //
  7. //
  8.  
  9. #ifndef __Fight__SkillButton__
  10. #define __Fight__SkillButton__
  11.  
  12. #include <iostream>
  13. #include "cocos2d.h"
  14. #include "cocos-ext.h"
  15. USING_NS_CC;
  16. USING_NS_CC_EXT;
  17. class SkillButton:public cocos2d::Layer{
  18. public:
  19. //创建冷却技能按钮,create 和 init 是连在一起的,调用create的时候必然会调用init
  20. static SkillButton* create(const char* fore_name,const char* back_name);
  21. //初始化按钮
  22. bool init(const char* fore_name,const char* back_name);
  23. //开始冷却技能
  24. void BeginSkill();
  25. //冷却技能结束后
  26. void EndSkill();
  27. //判断是否在冷却技能
  28. bool IsSkilling;
  29. //开始触摸
  30. virtual bool onTouchBegan(Touch *pTouch,Event *pEvent);
  31. //触摸结束
  32. virtual void onTouchEnded(Touch *pTouch,Event *pEvent);
  33. private:
  34. Sprite *fore;//fore是较亮的图片
  35. Sprite *back;//back是较暗的图片
  36. ProgressTimer *pt;//技能效果
  37. };
  38. #endif /* defined(__Fight__SkillButton__) */

SkillButton.cpp
  1. //
  2. // SkillButton.cpp
  3. // Fight
  4. //
  5. // Created by Cytzrs on 15/2/4.
  6. //
  7. //
  8.  
  9. #include "SkillButton.h"
  10. SkillButton* SkillButton::create(const char* fore_name,const char* back_name){
  11. SkillButton* ret = new SkillButton();
  12. //这样写更安全一些
  13. if(ret&&ret->init(fore_name,back_name)){
  14. ret->autorelease();
  15. return ret;
  16. }
  17. CC_SAFE_DELETE(ret);//安全删除
  18. return nullptr;
  19. }
  20. bool SkillButton::init(const char* fore_name,const char* back_name)
  21. {
  22. if(!Layer::init()){
  23. return false;
  24. }
  25. fore=Sprite::create(fore_name);//fore_name是较亮的图片
  26. this->addChild(fore,1);
  27. back=Sprite::create(back_name);//back_name是较暗的图片
  28. pt=ProgressTimer::create(back);
  29. this->addChild(pt,2);
  30. auto listener = EventListenerTouchOneByOne::create();
  31. listener->onTouchBegan = CC_CALLBACK_2(SkillButton::onTouchBegan,this);
  32. listener->onTouchEnded = CC_CALLBACK_2(SkillButton::onTouchEnded,this);
  33. Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraPHPriority(listener,this);
  34. return true;
  35. }
  36.  
  37. //开始冷却技能
  38. void SkillButton::BeginSkill()
  39. {
  40. //转圈的CD实现
  41. // pt->setType(cocos2d::ProgressTimerType(kCCProgressTimerTypeRadial));
  42. pt->setType(ProgressTimer::Type::RADIAL);
  43. ProgressTo *waittime=ProgressTo::create(8,100);
  44. //创建回调动作,技能冷却结束后调用EndSkill()
  45. CallFunc* callFunc=CCCallFunc::create(CC_CALLBACK_0(SkillButton::EndSkill,this));
  46. //创建连续动作
  47. auto act = Sequence::create(waittime,callFunc,NULL);
  48. pt->setVisible(true);
  49. IsSkilling=true;
  50. pt->runAction(act);
  51. }
  52. //冷却技能结束后
  53. void SkillButton::EndSkill()
  54. {
  55. // pt->setVisible(false);
  56. pt->setPercentage(0.0f);
  57. IsSkilling=false;
  58. // NotificationCenter::sharedNotificationCenter()->postNotification("jian_xue");
  59. NotificationCenter::getInstance()->postNotification("jian_xue");
  60. }
  61.  
  62. //判断是否点击的范围为精灵 如果是则执行动作
  63. void SkillButton::onTouchEnded(Touch *pTouch,Event *pEvent)
  64. {
  65. if(IsSkilling)
  66. return;
  67. //判断是否点击在精灵上面
  68. Point touchPoint = convertTouchToNodeSpace(pTouch);
  69. if(fore->boundingBox().containsPoint(touchPoint))
  70. {
  71. BeginSkill();
  72. log("NotificationCenter::getInstance()->postNotification(jian_xue);");
  73. }
  74. }
  75.  
  76. //返回true表示支持触摸 返回false表示忽略
  77. bool SkillButton::onTouchBegan(Touch *pTouch,Event *pEvent)
  78. {
  79. return true;
  80. }
工程源码 PS:多写博客,帮助自己,方便他人!

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