[cocos2dx筆記013]一個使用CCRenderTexture建立動態紋理顯示數位類,ccrendertexture

來源:互聯網
上載者:User

[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);





聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.