[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放置动态的图形图像到功能区库中,在该文中,作者创建了两个库:一个 ...
随机推荐
- HDU 2045不easy系列之三LELE的RPG难题(趋向于DP的递推)
不easy系列之(3)-- LELE的RPG难题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Ot ...
- Android开发之——编码规范
1. 前言 这份文档参考了 Google Java 编程风格规范和 Google 官方 Android 编码风格规范.该文档仅供参考,只要形成一个统一的风格,见量知其意就可. 2. 源文件基础 2.1 ...
- UVA 1149 Bin Packing 二分+贪心
A set of n 1-dimensional items have to be packed in identical bins. All bins have exactly the samele ...
- ZOJ 3633 Alice's present RMQ
Alice's present Description As a doll master, Alice owns a wide range of dolls, and each of them ha ...
- 英语发音规则---R字母
英语发音规则---R字母 一.总结 一句话总结: 1.在词首和词中时,字母r常读作摩擦辅音/r/? red /red/ n. 红色 ruler /'ruːlə/ n. 尺:统治者 rub /rʌb/ ...
- hdoj--1251--统计难题(字典树)
统计难题 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131070/65535 K (Java/Others) Total Subm ...
- 【POJ 1082】 Calendar Game
[题目链接] http://poj.org/problem?id=1082 [算法] 对于每种状态,要么必胜,要么必败 记忆化搜索即可 [代码] #include <algorithm> ...
- 在nodejs使用Redis缓存和查询数据及Session持久化(Express)
在nodejs使用Redis缓存和查询数据及Session持久化(Express) https://segmentfault.com/a/1190000002488971
- c++面向对象程序设计 谭浩强 第二章答案
类体内定义成员函数 #include <iostream> using namespace std; class Time { public: void set_time(); void ...
- layui序章
layui,layer,laydate关系图,layer和laydate作为layui的独立模块存在 下载地址:layer.layui.com