[cocos2dx笔记013]一个使用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);
[cocos2dx笔记013]一个使用CCRenderTexture创建动态纹理显示数字的类的更多相关文章
- [cocos2dx笔记005]一个字符串管理配置类
在用vs开发cocos2dx过程中.要显示的中文,要求是UTF-8格式的才干正常显示出来.但VS通常是ANSI格式保存,这样,在代码中写入的中文字符串,执行后.显示的就是乱码. 为了正确显示中文.或支 ...
- K8S学习笔记之二进制的方式创建一个Kubernetes集群
0x00 单节点搭建和简述 minikube Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,尝试Kubernetes或日常开发的用户使用.不能用于生产环境. 官方地址: ...
- golang学习笔记5 用bee工具创建项目 bee工具简介
golang学习笔记5 用bee工具创建项目 bee工具简介 Bee 工具的使用 - beego: 简约 & 强大并存的 Go 应用框架https://beego.me/docs/instal ...
- 《Linux就该这么学》培训笔记_ch20使用LNMP架构部署动态网站环境
<Linux就该这么学>培训笔记_ch20使用LNMP架构部署动态网站环境 文章最后会post上书本的笔记照片. 文章主要内容: 源码包程序 LNMP动态网站架构 配置Mysql服务 配置 ...
- GifShot - 创建动态 GIF 的 JavaScript 库
GifShot 是一个可以创建流媒体,视频或图像的 GIF 动画的 JavaScript 库.该库的客户端特性使其非常便携,易于集成到几乎任何网站.利用最先进的浏览器 API ,包括 WebRTC , ...
- ASP.NET MVC Web API 学习笔记---第一个Web API程序
http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html GetListAll /api/Contact GetListBySex ...
- Unity3D 创建动态的立方体图系统
Unity3D 创建动态的立方体图系统 这一篇主要是利用上一篇的Shader,通过脚本来完成一个动态的立方体图变化系统. 准备工作如下: 创建一个新的场景.一个球体.提供给场景一个平行光,准备2个立方 ...
- [cocos2dx笔记004] android添加�静态库project
(基于2.2.2版本号) 这步比較麻烦,不像vs2013那样好设置.參考了非常多文章.还是不能解决这个问题.仅仅有慢慢摸索了.在这里贴出来,希望能让大家能少走点弯路. 还是其于前面的文章提到的myli ...
- Ribbon2: 创建动态的Ribbon库
Sam Radakovitz曾在Excel团队博客中发表过一篇文章,介绍了如何创建动态的Ribbon库,即如何通过RibbonX和VBA放置动态的图形图像到功能区库中,在该文中,作者创建了两个库:一个 ...
随机推荐
- 韩国IT业是怎么走向国际我们须要学习什么
无论从国土面积仍是从人口数量上来衡量.韩国都不能算是一个大国,而且自然资本十分缺乏,即是在这种情况下,韩国经过几十年的尽力开展变成技能大国,格外是在IT这种新经济范畴更是引人注目.并诞生了三星等国际级 ...
- 【翻译自mos文章】怎么startup/shutdown PDB?
怎么startup/shutdown PDB? 来源于: 12c: How to Startup/Shutdown PDB's? (文档 ID 1592247.1) 适用于: Oracle Datab ...
- VMware虚拟机无法识别U盘解决方式
1. 本机情况: Winxp操作系统(相同应该适用于win7),VMware虚拟机.虚拟机版本号:VMware 10.安装Ubuntu14.04.现要求在主机上插入U盘.在虚拟机中显示. 2. 遇到问 ...
- UVA 10539 - Almost Prime Numbers 素数打表
Almost prime numbers are the non-prime numbers which are divisible by only a single prime number.In ...
- DB-MySQL:MySQL 索引
ylbtech-DB-MySQL:MySQL 索引 1.返回顶部 1. MySQL 索引 MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度. 打个比方,如果 ...
- 什么是BOM头(字节顺序标记(ByteOrderMark))
在utf-8编码文件中BOM在文件头部,占用三个字节,用来标示该文件属于utf-8编码,现在已经有很多软件识别bom头,但是还有些不能识别bom头,比如PHP就不能识别bom头,这也是用记事本编辑ut ...
- Spark RDD概念学习系列之RDD的本质特征
不多说,直接上干货!
- sql导出到excel
1.先查询数据ID,别名 导出到excel 2.增加标准名称,标识错误数据,导入sqlServer select distinct [StandardName] from [GMSOA].[dbo] ...
- 【摘录】JAVA内存管理-JVM垃圾收集机制
很多公司都有自己的JVM实现,被Oracle收购的sun公司开发的JVM实现名为HotSpot.这一实现是我们最常用到的. 还有哪些JVM实现呢?比较有名的有Oracle之前收购的BEA公司(就是以前 ...
- C++ 简单内存泄漏检测方法
遇到个bug,MFC程序异常退出,debug模式下输出 Detected memory leaks! Dumping objects -> {366566} normal block at 0x ...