[cocos2dx筆記013]一個使用CCRenderTexture建立動態紋理顯示數位類,ccrendertexture
用CCLabelTTF顯示的數字不好看,於是就想到用圖片來代理。目前網上的實現都是把每個數字做一個CCSprite組合的方式。但是我想,動態產生紋理的方式。沒有就只好自己手動寫一個。
標頭檔
#ifndef _X_NUMBER_H_#define _X_NUMBER_H_#include <cocos2d.h>#include <xtype.h>namespace cocos2d{//基於圖片顯示的數字/*這個類不是用一個一個數字拼起來,而是渲染成一個獨立的紋理zdh::XDDWord是一個64位不帶正負號的整數*/class CCPictureNumber : public CCSprite{public:typedef CCSprite Inherited;public:CCPictureNumber();~CCPictureNumber();virtual bool init(void);int BuildNumber(zdh::XDDWord paramNumber, const char * paramNumberResName);int BuildNumber(zdh::XDDWord paramNumber, CCTexture2D * paramTexture);int BuildNumber(zdh::XDDWord paramNumber);CREATE_FUNC(CCPictureNumber);void setNumberTexture(CCTexture2D * paramTexture);void setNumberTexture(const char * paramNumberResName);CCTexture2D * getNumberTexture();zdh::XDDWord getNumber() const;void setNumber(zdh::XDDWord paramNumber);int Build();private:CCTexture2D * m_NumberTexture;zdh::XDDWord m_Number;};}#endif
源檔案
#include "xpicture_number.h"#include <xstring.h>namespace cocos2d{//--------------------------------------------------------------------------------------//從指定資源名稱構建int CCPictureNumber::BuildNumber(zdh::XDDWord paramNumber, const char * paramNumberResName){this->setNumber(paramNumber);this->setNumberTexture(CCTextureCache::sharedTextureCache()->addImage(paramNumberResName));return this->Build();}//--------------------------------------------------------------------------------------//從指定紋理構建int CCPictureNumber::BuildNumber(zdh::XDDWord paramNumber, CCTexture2D * paramTexture){this->setNumber(paramNumber);this->setNumberTexture(paramTexture);return this->Build();}//--------------------------------------------------------------------------------------int CCPictureNumber::BuildNumber(zdh::XDDWord paramNumber){this->setNumber(paramNumber);return this->Build();}//--------------------------------------------------------------------------------------bool CCPictureNumber::init(void){if (!Inherited::init()) return false;return true;}//--------------------------------------------------------------------------------------CCPictureNumber::CCPictureNumber(){m_NumberTexture = nullptr;m_Number = 0;}//--------------------------------------------------------------------------------------CCPictureNumber::~CCPictureNumber(){if (zdh::isNotNULL(m_NumberTexture)){m_NumberTexture->release();}}//--------------------------------------------------------------------------------------void CCPictureNumber::setNumberTexture(CCTexture2D * paramTexture){if (m_NumberTexture == paramTexture) return;if (zdh::isNotNULL(m_NumberTexture)){m_NumberTexture->release();}m_NumberTexture = paramTexture;if (zdh::isNotNULL(m_NumberTexture)){m_NumberTexture->retain();}}//--------------------------------------------------------------------------------------void CCPictureNumber::setNumberTexture(const char * paramNumberResName){this->setNumberTexture(CCTextureCache::sharedTextureCache()->addImage(paramNumberResName));}//--------------------------------------------------------------------------------------CCTexture2D * CCPictureNumber::getNumberTexture(){return m_NumberTexture;}//--------------------------------------------------------------------------------------int CCPictureNumber::Build(){if (zdh::isNULL(m_NumberTexture)) return zdh::ERR_FAIL;zdh::XAnsiString strNumber(m_Number); //將整數轉換為字串int iNumCount = strNumber.getLength(); //取得字元個數CCSize stSize = m_NumberTexture->getContentSize(); //取得紋理大小,要求紋理中每個數字都是等寬等高,並依照0123456789排列int iNumWidth = (int)stSize.width / 10;//紋理中每個數位寬度int iNumHeight = (int)stSize.height; //紋理中每個數位高度CCRenderTexture * pRT = CCRenderTexture::create(iNumWidth * iNumCount, iNumHeight); //建立渲染紋理對象,並數字確定寬度CCSprite * pSprite = CCSprite::create(); //建立精靈對象,用於繪製數字pSprite->setAnchorPoint(0, 0);pSprite->setTexture(m_NumberTexture);CCRect stRect;pRT->begin();for (int i = 0; i < iNumCount; i++){int iNumber = strNumber[i] - '0';//設定要顯示數位紋理地區,這個地區是指參數中paramTexture中地區stRect.setRect(iNumber * iNumWidth, 0, iNumWidth, iNumHeight);pSprite->setTextureRect(stRect, false, stRect.size);pSprite->setPosition(i * iNumWidth, 0); //計算顯示的位移位置pSprite->visit(); //渲染到pRT中}pRT->end();//取得產生的紋理this->setTexture(pRT->getSprite()->getTexture());//設定顯示的內容stRect.setRect(0, 0, iNumWidth * iNumCount, iNumHeight);this->setTextureRect(stRect, false, stRect.size);//預設的情況下,通過CCRenderTexture得到的紋理是倒立的,這裡需要做一下翻轉this->setFlipY(true);//釋放資源delete pSprite;delete pRT;return zdh::ERR_OK;}//--------------------------------------------------------------------------------------zdh::XDDWord CCPictureNumber::getNumber() const{return m_Number;}//--------------------------------------------------------------------------------------void CCPictureNumber::setNumber(zdh::XDDWord paramNumber){m_Number = paramNumber;}}
數字圖片
使用例子
CCPictureNumber * pNum = CCPictureNumber::create(); pNum->BuildNumber(1234567, "ui_play_num05.png"); pNum->setPosition(200, 200); pNum->setAnchorPoint(0, 0); this->addChild(pNum, 100);