[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放置动态的图形图像到功能区库中,在该文中,作者创建了两个库:一个 ...
随机推荐
- VMWare虚拟机下为Ubuntu 12.04.1网络设置(NAT方式)
NAT方式: 虚拟机能够上外网,能够訪问宿主计算机所在网络的其它计算机(反之不行). 第一步:设置虚拟机vmware网络參数 (1)打开虚拟机,选择菜单"编辑">" ...
- 【云快讯】之四十八《IBM和Cisco最新收购,加强Openstack易用能力》
2015-06-08 张晓东 东方云洞察 点击上面的链接文字,能够高速关注"东方云洞察"公众号 本周宣布的两起收购引人注意.思科购买Piston云计算公司.同期IBM的收购Blue ...
- Android学习之——优化篇(1)
一.优化的品质 1.简练.2.可读性强.3.模块化:4.层次性:5.设计良好.6.高效.7.优雅:8.清晰. 二.常见的编程规范 1. 基本要求 · 结构清晰,简单易懂.单个函数不超过100行 ...
- Node.js:连接 MySQL
ylbtech-Node.js:连接 MySQL 1.返回顶部 1. Node.js 连接 MySQL 本章节我们将为大家介绍如何使用 Node.js 来连接 MySQL,并对数据库进行操作. 如果你 ...
- 算法入门经典第六章 例题6-14 Abbott的复仇(Abbott's Revenge)BFS算法实现
Sample Input 3 1 N 3 3 1 1 WL NR * 1 2 WLF NR ER * 1 3 NL ER * 2 1 SL WR NF * 2 2 SL WF ELF * 2 3 SF ...
- 广播Intent的三种方式总结
1.android有序广播和无序广播的区别 BroadcastReceiver所对应的广播分两类:普通广播和有序广播. 普通广播通过Context.sendBroadcast()方法来发送.它是完全异 ...
- Android WebView访问网站携带登录认证Cookies和动态自定义的cookies
最近项目几个页面要复用微信程序的网页.但是需要调用微网站登录接口,返回Cookies,webview访问需要的网页的时候携带. 并且还需要几个其他的动态改变的cookie,目的是根据这几个动态自定义c ...
- Thingworx SDK开发自定义Widget
Thingworx自带的图表数量有限,样式也很有限,在echarts上看到了这样一个非常简单的图表,下面将做一个简单的静态引入示范 首先创建Thingworx项目 然后右键ui新建widget 自动生 ...
- Clonezilla制作镜像时报错: errextfsclone.c:bitmap free count err
在检查时选中下面的选项, 如下图: -fsck-src-part Interactively check and repair source file
- poj1050查找最大子矩阵和
题目: To the Max Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 48507 Accepted: 2566 ...