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

来源:互联网 发布:java直播网站源码 编辑:程序博客网 时间:2024/04/29 14:47

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

先看看效果图:



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.2fclass 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