[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);
时间: 2024-10-07 00:19:01

[cocos2dx笔记013]一个使用CCRenderTexture创建动态纹理显示数字的类的相关文章

(译)如何使用CCRenderTexture来创建动态纹理

(译)如何使用CCRenderTexture来创建动态纹理 免责申明(必读!):本博客提供的所有教程的翻译原稿均来自于互联网,仅供学习交流之用,切勿进行商业传播.同时,转载时不要移除本申明.如产生任何纠纷,均与本博客所有人.发表该翻译稿之人无任何关系.谢谢合作! 原文链接地址:http://www.raywenderlich.com/3857/how-to-create-dynamic-textures-with-ccrendertexture 教程截图: 对于事先制作好的背景图片,我想你已经非

[cocos2dx笔记007]一个自定义场景切换的实例

cocos2dx框架已经提供了很多场景切换的类,但是一些自定义的场景切换,只有自己实现了.下面是实现的类.这里设计的分辨率是750*500.请根据实际的要求调整. 头文件 #ifndef _TRANSITION_GAME_H_ #define _TRANSITION_GAME_H_ #include <cocos2d.h> namespace cocos2d { class CCTransitionGame : public CCTransitionScene { public: CCTran

[cocos2dx笔记014]一个用于cocos2dx的对象智能指针模板

现在C++智能指针有无数个实现了,多一个也无所谓.哈. 这个智能指针是专门为cocos2dx 2.2.x定制的.主要是为了方便使用,同时又要遵循现有的cocos2dx的内存管理.特实现这样一个智能指针.在使用的时候不需要考虑retain或release操作,也不需要new或delete操作! 下面是实现代码 //在很多时候,类的成员是CCObject的子对象,为了保证对其正常使用,又要遵循cocos2dx的内存管理,特实现了这样的一个智能指针,方便使用. #ifndef _X_COCOS_PTR

如何使用CCRenderTexture来创建动态纹理

免责申明(必读!):本博客提供的所有教程的翻译原稿均来自于互联网,仅供学习交流之用,切勿进行商业传播.同时,转载时不要移除本申明.如产生任何纠纷,均与本博客所有人.发表该翻译稿之人无任何关系.谢谢合作! 原文链接地址:http://www.raywenderlich.com/3857/how-to-create-dynamic-textures-with-ccrendertexture 教程截图: 对于事先制作好的背景图片,我想你已经非常熟知如何把它们添加进游戏里面了.但是,你有没有想过动态地创

[cocos2dx笔记005]一个字符串管理配置类

在用vs开发cocos2dx过程中.要显示的中文,要求是UTF-8格式的才干正常显示出来.但VS通常是ANSI格式保存,这样,在代码中写入的中文字符串,执行后.显示的就是乱码. 为了正确显示中文.或支持多语言,我这里定义一个简单的字符串管理类,来满足上述要求. 这个类使用了我的开源码中的XAnsiString和XMap.TextIni这几个类.能够在我的开放代码找到下载. 以下是代码://字符串资源管理器 #ifndef _X_STRING_MANAGER_H_ #define _X_STRIN

【代码笔记】利用图片序列创建动态图片效果

一,效果图. 二,代码. RootViewController.m - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. //显示图片的UIImageView UIImageView *imageview=[[UIImageView alloc]initWithFrame:CGRectMake(50, 100, 200, 200)]; imageview.back

IDEA 创建 动态 Web 项目的正确姿势

打开 IDEA,点击 Create New Project 左侧选中Java Enterprise, Java EE version 下拉框选择 Java 7 解释一下,这里选择 Java 7 是为了解决一个 IDEA 在创建动态 Web 项目流程上的小 Bug. 左侧选中 Java,然后再选中回 Java Enterprise,Java EE version 下拉框选择 Java 8,选择项目其他相应信息 如果没有上面切换 Java EE version 的操作,那么这一步在选中 Web Ap

[cocos2dx笔记008]cocos2d 用luabridge手动绑定类

基于cocos2dx 2.2.2版本.这几天使用了cocostudio实现了,动画,骨骼动画,UI编辑,粒子效果,虽然有些不足,但已经算是非常好了.今天尝试用lua,这个非常简单,创建的时候,设置语言为lua,那就可以创建lua工程. 在cocos2d-x-2.2.2\tools\project-creator下运行: python create_project.py -project test_lua -package com.android.zdhsoft -language lua xco

JS学习笔记-OO疑问之对象创建

问一.引入工厂,解决重复代码 前面已经提到,JS中创建对象的方法,不难发现,基本的创建方法中,创建一个对象还算简单,如果创建多个类似的对象的话就会产生大量重复的代码. 解决:工厂模式方法(添加一个专门创建对象的方法,传入参数避免重复) function createObject(name,age){ var obj =new Object(); //创建对象 obj.name = name; obj.age = age; obj.run = function(){ return this.nam