cocos2d-x 3.4之排行榜的实现

***************************************转载请注明出处:http://blog.csdn.net/lttree********************************************

~~~~五一假期啊~~~~

这个排行榜,我搜过很多,

但至今都没找到。。。

我就自己研究了下,

用TableView+UserDefault来实现,

其中还用到了 输入文本框 CCTextFieldTTF,

可以实现存储。

应该算是首发了~.~

先看一下,实际效果吧:

试验品,所以界面有点渣渣。。。

现在来说下实现方法,

首先,要会用 UserDefault(不会的话,传送门:  点我    )

然后,要会用TableView(不会的话,传送门: click me  )

好了,废话说了一堆 o(╯□╰)o

对排行榜的实现,主要分为三部分:初始化、显示、更新

***************************************************************转载请注明出处:http://blog.csdn.net/lttree************************************************************************

1.初始化

先弄两个文本框,作为输入,

一个按钮,作为提交成绩,

一个TableView,展示排行榜,

对于TableView那些摆放神马的,就不多说,在源码中看吧;

这里,我用了一个结构体来存储成绩:

struct Player
{
	std::string name;
	int score;
};

刚开始,先判断有没有XML,

方法就是,从XML读取一个BOOL(当然别的类型也行),

如果不存在,就新建XML,存在就直接获取:

// 获取数据
	if(!UD_getBool("isExist", false))	{
        UD_setBool("isExist",true);

		for( int i=1 ; i <= max_range ; i++ )	{
			// 给 XML 相应内容赋值
			UD_setString(StringUtils::format("p%d_name",i).c_str(),"name");
			UD_setInt(StringUtils::format("p%d_score",i).c_str(),0);

			// 给数组相应内容赋值
			p[i-1].name = "name";
			p[i-1].score = 0;
		}

    }
	else  {
		for( int i=1 ; i <= max_range ; i++ )	{
			// 获取 XML 内容
			p[i-1].name = UD_getString(StringUtils::format("p%d_name",i).c_str());
			p[i-1].score = UD_getInt(StringUtils::format("p%d_score",i).c_str());
		}
	}

这是初始化部分的内容。

***************************************************************转载请注明出处:http://blog.csdn.net/lttree************************************************************************

2.显示

所有数据,在数组内是根据分数排好序的(从高到低),

对于TableView的 cell 设定部分,根据每个cell的idx,来获取相应结构体数组内容,

然后生成一个CCString,显示出来:

//由于tableview是动态获取数据的,该方法在初始化时会被调用一次,之后在每个隐藏的cell显示出来的时候都会调用
TableViewCell* RankList::tableCellAtIndex(TableView *table, ssize_t idx)
{
	CCString *string = CCString::create(p[idx].name+":"+StringUtils::format("%d",p[idx].score));

    // 在重用队列中获取一个cell 然后判断cell是否为空 不为空则创建一个新的
    TableViewCell *cell = table->dequeueCell();

    if (!cell) {
		//创建一个新的cell
        cell = new TableViewCell();
		//加入到自动释放池中
        cell->autorelease();

		// 名称
		LabelTTF *label = LabelTTF::create(string->getCString(), "Arial", 20.0);
		label->setPosition(Vec2::ZERO);
		label->setAnchorPoint(Vec2::ZERO);
        label->setTag(100);
        cell->addChild(label);
    }
    else
    {
        // 如果cell不为空,则根据tag获取到之前cell中存放的元素,并将元素信息重置
		//获取当前cell中的label
        LabelTTF *label = (LabelTTF*)cell->getChildByTag(100);
		//重置label的相关信息
		label->setString(string->getCString());
    }

    return cell;
}

***************************************************************转载请注明出处:http://blog.csdn.net/lttree************************************************************************

3.更新

更新这里,因为没有游戏来弄(太大),

所以就用 文本框输入名称与成绩,然后按钮提交进行刷新来小小模拟一下。

逻辑是酱紫的

> 先把文本框的内容添加到数组末尾

> 进行判断,这个玩家是否已经在排行榜中(避免一个玩家多个排名),如果在,并且成绩高于之前成绩,则刷新成绩;如果在,但成绩低于之前成绩,就不管了,也不会再占一个名额,将其他玩家刷下去。

> 如果玩家不在排行榜中,我们就进行一个排序(这里数据量小,排序算法任意,我用了最简单的小冒泡)

> 存储到XML中

就是这样了:

void RankList::menuSubmitCallback(Ref* pSender)
{
	// 获取提交的成绩
	p[max_range].name=textEdit->getString();
	p[max_range].score=std::atoi(textEdit2->getString().c_str());

	bool isExist = false;
	// 玩家是否已经在排行榜
	for( int i = 0 ;i < max_range ; i++ )	{
		if( p[i].name == p[max_range].name )	{
			p[i].score = p[i].score>p[max_range].score?p[i].score:p[max_range].score;
			isExist = true;
			break;
		}
	}

	if( !isExist )	{
		// 排个序(冒泡)
		for(int i = 0 ; i < max_range ; i++ )	{
			for( int j = max_range-i ; j > 0 ; j-- )	{
				if( p[j].score > p[j-1].score )	{
					Player temp;
					temp = p[j];
					p[j] = p[j-1];
					p[j-1] = temp;
				}
			}
		}
	}

	// 存入XML
	for( int i=1 ; i <= max_range ; i++ )	{
		// 给 XML 相应内容赋值
		UD_setString(StringUtils::format("p%d_name",i).c_str(),p[i-1].name);
		UD_setInt(StringUtils::format("p%d_score",i).c_str(),p[i-1].score);
	}

	// 这里,是用来测试的,忽略不计吧
	CCLOG(p[0].name.c_str());
	CCLOG("score:%d",p[0].score);
	CCLOG(p[1].name.c_str());
	CCLOG("score:%d",p[1].score);
	CCLOG(p[2].name.c_str());
	CCLOG("score:%d\n",p[2].score);
}

***************************************************************转载请注明出处:http://blog.csdn.net/lttree************************************************************************

4.一些问题

? 对于存储问题

这里用UserDefault存储,是无法存储数组的,

查API也能发现,

只有6种类型—— bool、int、float、double、string、data

所以,我这里存储方式,其实是一个伪数组方式(看起来像,但其实并非是)

存储形式是这种:

key            value

p1_name   xxx

p2_name   xxx

p3_name   xxx

p1_score   ...

p2_score   ...

p3_score   ...

只是,通过一个小技巧,让存储不至于那么繁琐,

而且还有可扩展性,或许现在可以一条一条写,

但如果以后存10名玩家,那。。。

以setString来,是这样实现的:

UD_setString(StringUtils::format("p%d_name",i).c_str(),p[i-1].name);

***************************************************************转载请注明出处:http://blog.csdn.net/lttree************************************************************************

? 对于扩展问题

我这里只是展示了3个名称,

如果需要多几个,比如10个,20个,

不需要改动太多,只需要在我设置的GameDefine.h 中的 max_range 改动即可。

但是,如果执行过一次,

再改动max_range(就是XML文件已存在)

那剩下的就不会显示,应该默认显示的  name:0

而是  :0

就像这样:

如果想要改动,默认的成绩或者名称,就在判断有没有XML文件那里:

// 给 XML 相应内容赋值
UD_setString(StringUtils::format("p%d_name",i).c_str(),"name");
UD_setInt(StringUtils::format("p%d_score",i).c_str(),0);

OK,就是这样啦,

简单的小排行榜的实现,

界面太渣了,我都有些看不下去了。。。

本篇文章的代码 ->
这里

***************************************转载请注明出处:http://blog.csdn.net/lttree********************************************

时间: 2024-10-06 08:41:44

cocos2d-x 3.4之排行榜的实现的相关文章

休闲游戏中使用redis作为排行榜数据存储

1.排行榜的需求             我有做了一个网站 http://www.cgame360.com/,专门放一些简单的html5游戏.现在有2个需求,我想获得一个游戏的top 10的用户的分数,还有一个是某个用户的排名,加上前后4名的人员.上图中少了名字,那个cocos2d js输入框有点问题就没加了. 现在的问题是用什么数据库来存储比较好?我想要尽可能快的查找出数据. 我搞过mysql这种关系型的数据库,第一感觉用在这里会很慢.数据量一大就会很慢,因为它排序的时候会对所有数据进行处理.

TIOBE Index for January 2016(TIOBE 2016年1月编程语言排行榜 Java拿下2015年度编程语言)

Java has won the TIOBE Index programming language award of the year. This is because Java has the largest increase in popularity in one year time (+5.94%). Java leaves runner ups Visual Basic.NET (+1.51%) and Python (+1.24%) far behind. At first sigh

cocos2d::Vector

v3.0 beta加入 定义在"COCOS2DX_ROOT/cocos/base"的"CCVector.h"头文件中. template<class T>class CC_DLL Vector; cocos2d::Vector<T>是一个封装好的能动态增长顺序访问的容器. cocos2d::Vector<T>中的元素是按序存取的,它的低层实现数据结构是标准模版库中的标准顺序容器std::vector. 在Cocos2d-x v3.

Cocos2D中Action的进阶使用技巧(一)

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 假设认为写的不好请多提意见,假设认为不错请多多支持点赞.谢谢! hopy ;) 大家对Cocos2d中动作的使用大概都非常清楚了,事实上本身action的概念也不复杂. 可是在某些情况下,一般的动作不能满足我们需求的时候,我们就必须使用更高级的Action方法来解决这个问题. 比方,串行化(不是序列化哦,这是两个全然不同的概念)不同Action的执行-有些童鞋可能会说非常easy,直接用CCActionSequence不就结了,可是等等我

2015各地区顶尖中学排行榜

各地区顶尖中学排行榜 教育新闻腾讯教育[微博]2015-06-10 12:29 我要分享 3 2015中国各地区顶尖中学排行榜 1977年中国恢复高考(课程)38年来,中国各省市自治区哪所顶尖中学培养出高考状元人数最多?哪所中学是中国各地区高考状元的摇篮?哪些中学跻身2015中国顶尖中学排行榜百强? 2015年6月10日,艾瑞深中国校友会网最新发布<2015中国高考状元调查报告>,追踪调查的1952-2014年中国各省市自治区高考状元3000多人,这是艾瑞深研究院连续第9年独家发布中国高考状元

Cocos2d入门--3-- 向量的应用

 Cocos2d入门--3-- 向量的应用 小球向一个方向持续运动的Demo HelloWorldScene.h ...... //设置一个protected的属性 protected: cocos2d::Vec2 _vec; ...... HelloWorldScene.cpp //这个是通过随机数设置向量的方向 _vec.set(random(-0.1f, 1.0f), random(-1.0f, 1.0f)); //通过normalize这个标准化函数,能够使得向量的大小为1 _vec.n

Cocos2d入门--1-- 初涉相关属性或代码

 Cocos2d入门--1-- 初涉相关属性或代码 Cocos2d vision:  cocos2d-x-3.8.1 万丈高楼,起于累土.对于一个游戏框架的学习,其实在于框架功能的使用积累,学会了如何在cocos2d游戏引擎的基础上使用它提供的各种功能,并灵活运用, 以及学会查阅Cocos2d官方提供的API文档.相信自己也能开发出自己喜爱或者让别人羡慕的游戏. 目录: 1>认识origin和visibleSize以及cocos2d的基础绘画类DrawNode的简单实用 2>认识 CCLOG(

UITableViewController 滚动引起的cocos2d动画暂停问题的解决

UITableViewController 滚动引起的cocos2d动画暂停问题的解决 之前在使用UITableViewController进行滚动时,cocos2d的动画会暂停,直至滚动完毕才会继续动画. 后来发现可以这样解决,想要了解更多,请查阅NSRunLoop相关知识. // .h NSTimer* m_timer; // .m- (void)updateCCDirector { [[CCDirector sharedDirector] drawScene]; if (!self.tab

排行榜

排行榜 时间限制: 1 Sec  内存限制: 128 MB提交: 45  解决: 14[提交][状态][讨论版] 题目描述 小迈克尔住在一个小镇上,他喜欢看每周日下午发布的音乐电视评比.它每周都根据选票介绍相同的歌曲,列出这些歌曲的流行排行榜. 有一个星期日迈克尔和他的朋友在一起玩得太久了以致于未能看到新的流行榜.他非常失望,但是不久他就发现下周至少可以部分地建立出流行榜.除了每首歌曲的 位置,排行榜还根据这些歌曲上周的排行列出了它们排行变动的信息,更精确地说,从这周起,不管那首歌是继续排在原位

TIOBE编程语言排行榜:Ruby 排名创历史新高

Ruby本月Tiobe指数排名第8,这是自2008年12月以来最高的排名,本次峰值与之前的一次峰值是完全相反的.2006年Ruby布道者高喊Ruby将达到顶端,鼓吹Ruby和它的编程环境Rails即将征服世界,他们在某种程度上取得了一定的成功,梦想上市的创业公司非常喜欢使用的Ruby编程语言.Ruby在2006年年度编程语言中甚至被授予“最受欢迎编程语言”,直到2008年受欢迎程度达到顶峰,然而Ruby的可扩展性似乎是一个问题,在处理大数据时性能明显下降,这也是Twitter在2010年开始用J