[cocos2dx动作]CCLabel类数字变化动作
cococs2dx的CCLabel类的数字变化动作
介绍: 简单的数字变化动作(适用于CCLabel类对象, 包括CCLabelTTF, CCLabelAtlas, CCLabelBMFont等等)
//注意 demo中支持的是CCLabelTTF ,把dynamic_cast相应的代码改成如下即可支持多种CCLabel对象
CCLabelProtocol *pLabel = dynamic_cast<CCLabelProtocol*>(m_pTarget);
demo下载地址:http://pan.baidu.com/s/1c09r3jU 环境:cocos2dx 2.14, xcode 5.0.2
版权木有,欢迎转载与各种使用修改~
源代码:
//头文件 CCLabelChange.h
// CCLabelChange.h #ifndef __testLabelChange__CCLabelChange__ #define __testLabelChange__CCLabelChange__ #include "cocos2d.h" USING_NS_CC; class CCLabelChange : public CCActionInterval { public: CCLabelChange(); public: /** creates the action */ static CCLabelChange* create(float duration, int fromNum, int toNum); /** initializes the action */ bool initWithDuration(float duration, int fromNum, int toNum); virtual CCObject* copyWithZone(CCZone* pZone); virtual void startWithTarget(CCNode *pTarget); virtual CCActionInterval* reverse(void); virtual void update(float time); protected: int m_nFromNum; int m_nToNum; };
//cpp文件 CCLabelChange.cpp
#include "CCLabelChange.h" CCLabelChange::CCLabelChange(): m_nFromNum(0), m_nToNum(0) { } CCLabelChange* CCLabelChange::create(float duration, int fromNum, int toNum) { CCLabelChange *pRet = new CCLabelChange(); pRet->initWithDuration(duration, fromNum, toNum); pRet->autorelease(); return pRet; } bool CCLabelChange::initWithDuration(float duration, int fromNum, int toNum) { if (CCActionInterval::initWithDuration(duration)) { m_nFromNum = fromNum; m_nToNum = toNum; return true; } return false; } CCObject* CCLabelChange::copyWithZone(CCZone *pZone) { CCZone* pNewZone = NULL; CCLabelChange* pCopy = NULL; if(pZone && pZone->m_pCopyObject) { //in case of being called at sub class pCopy = (CCLabelChange*)(pZone->m_pCopyObject); } else { pCopy = new CCLabelChange(); pZone = pNewZone = new CCZone(pCopy); } CCActionInterval::copyWithZone(pZone); pCopy->initWithDuration(m_fDuration, m_nFromNum, m_nToNum); CC_SAFE_DELETE(pNewZone); return pCopy; } void CCLabelChange::startWithTarget(CCNode *pTarget) { CCActionInterval::startWithTarget(pTarget); CCLabelProtocol *pLabel = dynamic_cast<CCLabelProtocol*>(m_pTarget); if (pLabel) { CCString *numStr = CCString::createWithFormat("%i", m_nFromNum); pLabel->setString(numStr->getCString()); } } CCActionInterval* CCLabelChange::reverse(void) { return CCLabelChange::create(m_fDuration, m_nToNum, m_nFromNum); } void CCLabelChange::update(float t) { CCLabelProtocol *pLabel = dynamic_cast<CCLabelProtocol*>(m_pTarget); if (pLabel) { int num = m_nFromNum + (m_nToNum - m_nFromNum) * t; CCString *numStr = CCString::createWithFormat("%i", num); pLabel->setString(numStr->getCString()); } }
//使用方法
CCLabelTTF *label = CCLabelTTF::create("", "Arial", 30); float duration = 5.0f; int fromNum = 20; //开始数字 int toNum = 1000; //结束数字 CCLabelChange *pChange = CCLabelChange::create(duration, fromNum, toNum); label->runAction(pChange);