作用: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));
}
//
// 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 ; //返回数位的值
}
在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);
}
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