专职C++

不能停止的脚步

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  137 Posts :: 7 Stories :: 134 Comments :: 0 Trackbacks

常用链接

留言簿(13)

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

60天内阅读排行

本文地址:http://www.cppblog.com/zdhsoft/archive/2014/07/25/207805.html
用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);
//
posted on 2014-07-25 15:35 冬瓜 阅读(2379) 评论(0)  编辑 收藏 引用 所属分类: 原创cocos2dx

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理