[cocos2dx 3.x]Label类数字变化动作
之前写了个2.14版本的动作变化,见 http://www.cnblogs.com/creeper/p/3531304.html
3.x版本变化了很多,但是核心思想还是没有变化,所以对应3.x版本的改了一下放上来
有空的话把tolua的转换方法也放上来吧:)
1 #ifndef __MISC_NODE_CCNUMBER_CHANGE_H__ 2 #define __MISC_NODE_CCNUMBER_CHANGE_H__ 3 4 #include <vector> 5 6 #include "2d/CCAction.h" 7 #include "2d/CCAnimation.h" 8 #include "2d/CCActionInterval.h" 9 #include "base/CCProtocols.h" 10 #include "base/CCVector.h" 11 12 //NS_CC_BEGIN 13 USING_NS_CC; 14 class Node; 15 class SpriteFrame; 16 class EventCustom; 17 18 19 class NumberChange : public ActionInterval 20 { 21 public: 22 23 static NumberChange* create(float duration, int fromNum, int toNum); 24 25 virtual NumberChange* clone() const override; 26 virtual NumberChange* reverse(void) const override; 27 virtual void startWithTarget(cocos2d::Node *target) override; 28 virtual void update(float time) override; 29 30 CC_CONSTRUCTOR_ACCESS: 31 NumberChange(); 32 virtual ~NumberChange(); 33 34 /** initializes the action */ 35 bool initWithDuration(float duration, int fromNum, int toNum); 36 37 protected: 38 int _fromNum; 39 int _toNum; 40 41 private: 42 CC_DISALLOW_COPY_AND_ASSIGN(NumberChange); 43 }; 44 45 //NS_CC_END 46 47 #endif //__MISC_NODE_CCNUMBER_CHANGE_H__
1 #include "2d/CCActionInterval.h" 2 3 #include <stdarg.h> 4 5 #include "2d/CCSprite.h" 6 #include "2d/CCNode.h" 7 #include "2d/CCSpriteFrame.h" 8 #include "2d/CCActionInstant.h" 9 #include "base/CCDirector.h" 10 #include "base/CCEventCustom.h" 11 #include "base/CCEventDispatcher.h" 12 #include "platform/CCStdC.h" 13 #include "deprecated/CCString.h" 14 #include "NumberChange.h" 15 16 USING_NS_CC; 17 //NS_CC_BEGIN 18 NumberChange::NumberChange(){ 19 } 20 21 NumberChange::~NumberChange(){ 22 } 23 24 NumberChange* NumberChange::create(float duration, int fromNum, int toNum) 25 { 26 NumberChange *ret = new (std::nothrow) NumberChange(); 27 ret->initWithDuration(duration, fromNum, toNum); 28 ret->autorelease(); 29 30 return ret; 31 } 32 33 34 bool NumberChange::initWithDuration(float duration, int fromNum, int toNum) 35 { 36 if (ActionInterval::initWithDuration(duration)) 37 { 38 _fromNum = fromNum; 39 _toNum = toNum; 40 return true; 41 } 42 43 return false; 44 } 45 46 NumberChange* NumberChange::clone() const 47 { 48 // no copy constructor 49 auto a = new (std::nothrow) NumberChange(); 50 a->initWithDuration(_duration, _fromNum, _toNum); 51 a->autorelease(); 52 return a; 53 } 54 55 void NumberChange::startWithTarget(cocos2d::Node *target) 56 { 57 ActionInterval::startWithTarget(target); 58 LabelProtocol *pLabel = dynamic_cast<LabelProtocol*>(target); 59 if (pLabel) 60 { 61 std::string numStr = cocos2d::StringUtils::format("%i", _fromNum); 62 pLabel->setString(numStr.c_str()); 63 } 64 } 65 66 NumberChange* NumberChange::reverse() const 67 { 68 return NumberChange::create(_duration, _toNum, _fromNum); 69 } 70 71 72 void NumberChange::update(float t) 73 { 74 LabelProtocol *pLabel = dynamic_cast<LabelProtocol*>(_target); 75 if (pLabel) 76 { 77 int tempNum = (_toNum - _fromNum) * t; 78 int num = _fromNum + tempNum; 79 std::string numStr = cocos2d::StringUtils::format("%i", num); 80 pLabel->setString(numStr.c_str()); 81 } 82 } 83 84 //NS_CC_END