cocos2d-x 图片数字显示,可用于计分板,金币显示板等

作用:cocos2d-x 编写的图片数字显示,可用于计分板,金币显示板等。

先看看效果图:

cocos2d-x 图片数字显示,可用于计分板,金币显示板等_第1张图片


1.图片格式

我所编写的代码是按照下面图片中的数字排列顺序编写的



2.编写 NumberSprite 类,但数字的显示

这个类主要是实现单个的数字显示用

//
//  NumberSprite.h
//  ShowNumberNodeTest
//
//  Created by Za aa on 13-7-14.
//
//

#ifndef __ShowNumberNodeTest__NumberSprite__
#define __ShowNumberNodeTest__NumberSprite__

#include "cocos2d.h"
USING_NS_CC;
class  NumberSprite : public CCSprite
{
public:
    /*
     创建一个数字精灵
     参数:
            pTexture: 包含所有数字图片的图片
            width; 单个数字显示的图片宽度
            lenght; 数字显示高度
    */
    static NumberSprite *CreateNumberSprite(CCTexture2D *pTexture, float width, float lenght);

    /*
     直接显示数字
     参数:
        num 是显示的数字图片序号
        isanimation:是否显示动画
     */
    void f_ShowNumber(int num);
    

    /**初始化 */
    bool myInit(float width, float lenght);

    
private:
    /** 保存输入的图片宽高,用于显示滚动数字或是直接显示数字*/
    //保存显示图片宽度
    float s_width;
    //保存图片高度
    float s_lenght;


   };

#endif /* defined(__ShowNumberNodeTest__NumberSprite__) */
//
//  NumberSprite.cpp
//  ShowNumberNodeTest
//
//  Created by Za aa on 13-7-14.
//
//

#include "NumberSprite.h"

bool NumberSprite::myInit(float width, float lenght)
{
    s_width     =   width;
    s_lenght    =   lenght;


}
NumberSprite *NumberSprite::CreateNumberSprite(CCTexture2D *pTexture, float width, float lenght)
{
    NumberSprite *pobSprite = new NumberSprite();

    if (pobSprite && pobSprite->initWithTexture(pTexture)  )
    {
        pobSprite->setVisible(false);
        pobSprite->myInit(width , lenght);
        pobSprite->autorelease();
        return pobSprite;
    }
    CC_SAFE_DELETE(pobSprite);
    return NULL;
}

void NumberSprite::f_ShowNumber(int num)
{
   
    this->setVisible(true)  ;
    this->setTextureRect(CCRectMake(s_width * num, 0, s_width, s_lenght));
}

3.多数字显示
//
//  ShowNumberNode.h
//  ShowNumberNodeTest
//
//  Created by Za aa on 13-7-12.
//
//

#ifndef __ShowNumberNodeTest__ShowNumberNode__
#define __ShowNumberNodeTest__ShowNumberNode__

#include "cocos2d.h"
USING_NS_CC;
/*

*/

#define SCROLLTIME 0.2f
class ShowNumberNode : public CCNode
{
public:
    /*
        创建一个showNumberNode节点
    参数:
        path: 文件名
        numberMAX:数字显示的最大值
        showwidth: 每个数字图片的宽度
        showheight:每个数字图片的宽度

    */
    static ShowNumberNode *CreateShowNumberNode(const char *path, int numberMAX, float showwidth, float showheight);

    /*同上*/
    bool Init(const char *path, int numberMAX, float showwidth, float showheight);

    
    // 修改显示数字,直接显示数字无滚动
    void f_ShowNumber(int number);
    


private: 
    //添加数字精灵到节点,并进行排列
    void f_addSprite();

    //判断输入数字的位数,比如:11就是2位,333就是3位
    int f_NumberLength(int number);

    //返回num从右边开始第k位数字的值,比如:654321,第3就是3,也就是百位上的数字
    int f_GetNumber(int num, int k);

private:
   
    //用于保存数字最大值
    int s_NumberMax;

    //计算数字最大位数
    int s_NumberLength;

    //图片宽度
    float s_ShowWidth;

    //    图片的高度
    float s_ShowHeight;

    CCSpriteBatchNode *batchNode ;





};


#endif /* defined(__ShowNumberNodeTest__ShowNumberNode__) */
//
//  ShowNumberNode.cpp
//  ShowNumberNodeTest
//
//  Created by Za aa on 13-7-12.
//
//

#include "ShowNumberNode.h"
#include "NumberSprite.h"
ShowNumberNode *ShowNumberNode::CreateShowNumberNode(const char *path, int numberMAX, float showwidth, float showheight)
{
    ShowNumberNode *pobSprite = new ShowNumberNode();

    if (pobSprite )
    {

        pobSprite->Init(path , numberMAX, showwidth, showheight);
        pobSprite->autorelease();
        return pobSprite;
    }
    CC_SAFE_DELETE(pobSprite);
    return NULL;

}
bool ShowNumberNode::Init(const char *path, int numberMAX, float showwidth, float showheight)
{
    //初始化参数
    this->s_NumberMax = numberMAX;
    this->s_ShowWidth = showwidth;
    this->s_ShowHeight = showheight;

    //计算数字长度
    s_NumberLength = f_NumberLength(numberMAX);

    //
    batchNode = CCSpriteBatchNode::create(path);

    //将numbersprite 添加进节点
    f_addSprite();

    return true;

}
/*添加数字精灵到节点,并进行排列*/
void ShowNumberNode::f_addSprite()
{

    for (int i = 0; i < s_NumberLength; i++)
    {
        /* code */
        NumberSprite *nsp  = NumberSprite::CreateNumberSprite(batchNode->getTexture(), s_ShowWidth, s_ShowHeight);

        nsp->setPosition(ccp(-s_ShowWidth * i, 0));

        batchNode->addChild(nsp, 0, i);

    }

    this->addChild(batchNode);
}

// 修改显示数字
void ShowNumberNode::f_ShowNumber(int number)
{
   
    if (number < 0 || number > s_NumberMax)
        return;

    int numlength = f_NumberLength(number);


    for (int i = 0; i < s_NumberLength; i++)
    {
        /* code */
        int num = f_GetNumber(number, i + 1);


        NumberSprite *nsp =  (NumberSprite * ) batchNode->getChildByTag(i);

        //将超出数字的隐藏,比如:最大值是999,现在需要显示33,那就是隐藏百位上的0
        if (i >= numlength)
        {
            //TODO :
            nsp->setVisible(false);
           //break;
        }
        else
        {
            nsp->setVisible(true);
            nsp->f_ShowNumber(num);
        }

       

    }
    
}





//判断输入数字的位数,比如:11就是2位,333就是3位
int ShowNumberNode::f_NumberLength(int number)
{
    if(number == 0 )
        return  1;
    int flag = 0;
    while (number)
    {
        number /= 10;
        flag++;
    }
    return flag;

}

//返回num从右边开始第k位数字的值
int ShowNumberNode::f_GetNumber(int num, int k)
{
    while (k > 1) //我们计数是从1开始的,电脑是从0开始的。当k=1时,依然大于0,还要执行一次循环,那样就多减了一位,所以到1就结束

    {
        num = num / 10;
        k--;

    }
    return num % 10 ; //返回数位的值
}

4.测试一下

在helloworld中添加一个函数

void HelloWorld::addNumberNode()
{
    ShowNumberNode * snn = ShowNumberNode::CreateShowNumberNode("menu_num.png", 923, 22, 30 );
    snn->f_ShowNumber(testnum);
    snn->setPosition(ccp(100,100));
    this->addChild(snn,0,0);
 schedule(schedule_selector(HelloWorld::logic), 2.0f);

}


之后再编写logic函数,让他自动的变一下数字

 void HelloWorld::logic(float dt)
{
    ShowNumberNode * snn = (ShowNumberNode *)this->getChildByTag(0);
    snn->f_ShowNumber(testnum );
    testnum = testnum +10;
    
    
}

这样运行一下就会是上面效果图的样子了

这几个文件的代码大家进入下载页去下载吧,不要资源分啊

http://download.csdn.net/detail/u011405562/5804571



你可能感兴趣的:(cocos2d-x小代码)