[cocos2dx笔记013]一个使用CCRenderTexture创建动态纹理显示数字的类
本文地址: http://www.cppblog.com/zdhsoft/archive/2014/07/25/207805.html
用CCLabelTTF显示的数字不好看,于是就想到用图片来代理。目前网上的实现都是把每个数字做一个CCSprite组合的方式。但是我想,动态生成纹理的方式。没有就只好自己手动写一个。
头文件
源文件
使用例子
用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
#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;
}
}
数字图片文件
#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);
//
pNum->BuildNumber(1234567, "ui_play_num05.png");
pNum->setPosition(200, 200);
pNum->setAnchorPoint(0, 0);
this->addChild(pNum, 100);