您的位置:首页 > 移动开发 > Cocos引擎

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

2013-07-24 00:39 309 查看
作用: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.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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐