REDNodeButton.cpp 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. //
  2. // REDNodeButton.cpp
  3. // cocos2d_libs
  4. //
  5. // Created by ZhengSong on 2020/4/14.
  6. //
  7. #include "REDNodeButton.h"
  8. #include "2d/CCAction.h"
  9. #include "2d/CCActionInterval.h"
  10. #include "RPRedAudio.hpp"
  11. using namespace cocos2d;
  12. namespace redream {
  13. enum
  14. {
  15. kZoomActionTag = 0xCCCB0001,
  16. };
  17. REDNodeButton* REDNodeButton::create()
  18. {
  19. REDNodeButton *pControlButton = new (std::nothrow) REDNodeButton();
  20. if (pControlButton && pControlButton->init())
  21. {
  22. pControlButton->autorelease();
  23. return pControlButton;
  24. }
  25. CC_SAFE_DELETE(pControlButton);
  26. return nullptr;
  27. }
  28. REDNodeButton::REDNodeButton()
  29. : _isPushed(false)
  30. , _zoomOnTouchDown(false)
  31. {
  32. }
  33. bool REDNodeButton::init(){
  34. if (Control::init())
  35. {
  36. _isPushed = false;
  37. // Adjust the background image by adjustBackGroundSize
  38. setPreferredSize(Size::ZERO);
  39. // Zooming button by default
  40. _zoomOnTouchDown = true;
  41. _scaleRatio = 1.1f;
  42. // Set the default anchor point
  43. setIgnoreAnchorPointForPosition(false);
  44. setAnchorPoint(Vec2::ANCHOR_MIDDLE);
  45. // Set the default color and opacity
  46. setColor(Color3B::WHITE);
  47. setOpacity(255.0f);
  48. setOpacityModifyRGB(true);
  49. // Layout update
  50. needsLayout();
  51. return true;
  52. }
  53. //couldn't init the Control
  54. else
  55. {
  56. return false;
  57. }
  58. }
  59. void REDNodeButton::setHighlighted(bool enabled)
  60. {
  61. if (enabled == true)
  62. {
  63. _state = Control::State::HIGH_LIGHTED;
  64. }
  65. else
  66. {
  67. _state = Control::State::NORMAL;
  68. }
  69. Control::setHighlighted(enabled);
  70. Action *action = getActionByTag(kZoomActionTag);
  71. if (action)
  72. {
  73. stopAction(action);
  74. }
  75. needsLayout();
  76. if( _zoomOnTouchDown )
  77. {
  78. float scaleValue = (isHighlighted() && isEnabled() && !isSelected()) ? _scaleRatio : 1.0f;
  79. Action *zoomAction = ScaleTo::create(0.05f, scaleValue);
  80. zoomAction->setTag(kZoomActionTag);
  81. runAction(zoomAction);
  82. }
  83. }
  84. void REDNodeButton::setZoomOnTouchDown(bool zoomOnTouchDown)
  85. {
  86. _zoomOnTouchDown = zoomOnTouchDown;
  87. }
  88. bool REDNodeButton::getZoomOnTouchDown() const
  89. {
  90. return _zoomOnTouchDown;
  91. }
  92. void REDNodeButton::setPreferredSize(const Size& size)
  93. {
  94. _preferredSize = size;
  95. this->setContentSize(size);
  96. needsLayout();
  97. }
  98. void REDNodeButton::setContentSize(const Size& size){
  99. Control::setContentSize(size);
  100. }
  101. const Size& REDNodeButton::getPreferredSize() const
  102. {
  103. return _preferredSize;
  104. }
  105. bool REDNodeButton::onTouchBegan(Touch *pTouch, Event* /*pEvent*/)
  106. {
  107. if (!isTouchInside(pTouch) || !isEnabled() || !isVisible() || !hasVisibleParents() )
  108. {
  109. return false;
  110. }
  111. for (Node *c = this->_parent; c != nullptr; c = c->getParent())
  112. {
  113. if (c->isVisible() == false)
  114. {
  115. return false;
  116. }
  117. }
  118. _isPushed = true;
  119. this->setHighlighted(true);
  120. sendActionsForControlEvents(Control::EventType::TOUCH_DOWN);
  121. if(_wiseBnkFile4TouchDown.size() > 0 && _wiseEvent4TouchDown.size() > 0){
  122. redprotocol::RedAudio::getInstance()->playAudio(_wiseBnkFile4TouchDown, _wiseEvent4TouchDown, _forcePostEvent4TouchDown, _audioParams4TouchDown);
  123. }
  124. return true;
  125. }
  126. void REDNodeButton::onTouchMoved(Touch *pTouch, Event* /*pEvent*/)
  127. {
  128. if (!isEnabled() || !isPushed() || isSelected())
  129. {
  130. if (isHighlighted())
  131. {
  132. setHighlighted(false);
  133. }
  134. return;
  135. }
  136. bool isTouchMoveInside = isTouchInside(pTouch);
  137. if (isTouchMoveInside && !isHighlighted())
  138. {
  139. setHighlighted(true);
  140. sendActionsForControlEvents(Control::EventType::DRAG_ENTER);
  141. }
  142. else if (isTouchMoveInside && isHighlighted())
  143. {
  144. sendActionsForControlEvents(Control::EventType::DRAG_INSIDE);
  145. }
  146. else if (!isTouchMoveInside && isHighlighted())
  147. {
  148. setHighlighted(false);
  149. sendActionsForControlEvents(Control::EventType::DRAG_EXIT);
  150. }
  151. else if (!isTouchMoveInside && !isHighlighted())
  152. {
  153. sendActionsForControlEvents(Control::EventType::DRAG_OUTSIDE);
  154. }
  155. }
  156. void REDNodeButton::onTouchEnded(Touch *pTouch, Event* /*pEvent*/)
  157. {
  158. _isPushed = false;
  159. setHighlighted(false);
  160. if (isTouchInside(pTouch))
  161. {
  162. sendActionsForControlEvents(Control::EventType::TOUCH_UP_INSIDE);
  163. if(_wiseBnkFile4TouchUpInside.size() > 0 && _wiseEvent4TouchUpInside.size() > 0){
  164. redprotocol::RedAudio::getInstance()->playAudio(_wiseBnkFile4TouchUpInside, _wiseEvent4TouchUpInside, _forcePostEvent4TouchUpInside, _audioParams4TouchUpInside);
  165. }
  166. }
  167. else
  168. {
  169. sendActionsForControlEvents(Control::EventType::TOUCH_UP_OUTSIDE);
  170. }
  171. }
  172. void REDNodeButton::onTouchCancelled(Touch* /*pTouch*/, Event* /*pEvent*/)
  173. {
  174. _isPushed = false;
  175. setHighlighted(false);
  176. sendActionsForControlEvents(Control::EventType::TOUCH_CANCEL);
  177. }
  178. void REDNodeButton::setTouchDownAudioData(const std::string& wiseBnkFile,const std::string& wiseEvent, const std::vector<redprotocol::AudioParam>& audioParams, bool forcePostEvent)
  179. {
  180. _wiseBnkFile4TouchDown = wiseBnkFile;
  181. _wiseEvent4TouchDown = wiseEvent;
  182. _audioParams4TouchDown = audioParams;
  183. _forcePostEvent4TouchDown = forcePostEvent;
  184. }
  185. void REDNodeButton::setTouchUpInsideAudioData(const std::string& wiseBnkFile,const std::string& wiseEvent, const std::vector<redprotocol::AudioParam>& audioParams, bool forcePostEvent)
  186. {
  187. _wiseBnkFile4TouchUpInside = wiseBnkFile;
  188. _wiseEvent4TouchUpInside = wiseEvent;
  189. _audioParams4TouchUpInside = audioParams;
  190. _forcePostEvent4TouchUpInside = forcePostEvent;
  191. }
  192. }//namespace