在这个例子中,我们的显示代码只需要选手的名字以及对应的成绩.根据选手名字取对应的成绩可以用前面实现的playerRecord:方法,我们只需要将按照成绩排序后的选手名字返回就可以了.

我只需要再实现一个函数,就是返回已经排好序选手的姓名数组,在GameState.h接口文件中添加allSortedPlayers方法:

-(NSArray*)allSortedPlayers;

接下来在GameState.m中实现它:

-(NSArray*)allSortedPlayers{
    NSArray *keys = _playerRecords.allKeys;
    NSArray *sortArray = [keys sortedArrayUsingComparator:^NSComparisonResult(id obj1,id obj2){
        NSNumber *val1 = _playerRecords[obj1];
        NSNumber *val2 = _playerRecords[obj2];
        return [val1 compare:val2];
    }];
    return sortArray;
}

方法中我们首先取得所有选手名字,然后建立一个排序block用来回调每次排序:直接比较2个选手的成绩.

接下来打开PopupLayer.m,在didLoadFromCCB最后添加如下代码:

if (_recordsLabel) {
        [self initRecordsLabel];
    }

新建initRecordsLabel方法如下:

static NSString *recFormat = @"%d\t\t%@\t\t\t%.5f\n";

-(void)initRecordsLabel{
    GameState *gameState = [GameState sharedInstance];
    NSMutableString *recordsString = [NSMutableString string];
    NSArray *allPlayers = [gameState allSortedPlayers];
    NSInteger i = 0;
    for (NSString *playerName in allPlayers) {
        CCTime record = [gameState playerRecord:playerName];
        //CCLOG(@"%d : %@ %.5f",++i,playerName,record);
        [recordsString appendFormat:recFormat,++i,playerName,record];
    }

    _recordsLabel.string = recordsString;
}

比较简单,就是按照排序后选手来依次取对应的成绩,然后按照特定格式生成字符串,最后将字符串附加到_recordsLabel节点上.

打开GameScene.m我们需要在选手到达终点时更新成绩:

-(void)matchRun{
//...
block {
                [gameState updatePlayerRecord:player.playerName withRecord:player.elapsedTime];

}
//...

编译运行App,界面显示如下:

到这里本猫第一个原创App : SpeedBoy Lite基本告一段落了,其实还有完善的地方,比如以下几个方面:

1.游戏Main界面还可以美化,加上一些动画效果

2.游戏完全没有背景音乐和音效

3.游戏没有设置界面

4.游戏记录无法冷保存,退出App下次开始记录会丢失.

但是在这里我们暂且打住,回味片刻,准备开始下一个App吧 ;)

(NO.00001)iOS游戏SpeedBoy Lite成形记(三十):增加排行榜功能3的更多相关文章

  1. (NO.00001)iOS游戏SpeedBoy Lite成形记(二十八):增加排行榜功能

    游戏大体上基本也就完成了,还差一个排行榜.否则如何激励各位选手创造新纪录呢? 排行榜功能也没什么难的,不过需要一点点排序的算法上的考虑. 这里我们把排行榜记录数据和排序都放在GameState类中,在 ...

  2. (NO.00001)iOS游戏SpeedBoy Lite成形记(二十四)

    我们回到Xcode,打开GameScene.m,首先要添加实例变量: CCNode *_trackLine; 为了根据选中的赛道更新_trackLine的位置,我们添加一个显示方法: -(void)s ...

  3. (NO.00001)iOS游戏SpeedBoy Lite成形记(二十二)

    自己的游戏自己更需要多玩,这样才能首先发现不足的地方.所以本猫到现在已经忍一个地方很久了,就是弹出moneyLayer后每次都要输入数字才能关闭,这多少让人不爽.于是本篇我们就修正这个小小的不便. 首 ...

  4. (NO.00001)iOS游戏SpeedBoy Lite成形记(二十)

    下面修改最为关键的matchRun方法里的代码: CCActionCallBlock *blk = [CCActionCallBlock actionWithBlock:^{ _finishedCou ...

  5. (NO.00001)iOS游戏SpeedBoy Lite成形记(二十九):增加排行榜功能2

    接下来回到Xcode中,首先在PopupLayer.m中添加justClose方法: -(void)justClose{ [self.gameScene removePopup]; } 然后在Game ...

  6. (NO.00001)iOS游戏SpeedBoy Lite成形记(二十六)

    到目前为止,选手跑到终点时仿佛没什么激动人心的事情发生呢?貌似需要添加一些胜利的特效啊! 前面说好的不添加特效,只完成游戏功能的诺言呢? T T 我们主要想实现这样一个特效效果: 1.胜利的玩家突出显 ...

  7. (NO.00001)iOS游戏SpeedBoy Lite成形记(二十五)

    每次压赌要打开弹出菜单还是让人略觉不爽,下面我们再添加一个随机押注的按钮:自动随机选择选手和下赌金额. 打开spriteBuilder,修改GameInterface.ccb的界面,在Run按钮旁边添 ...

  8. (NO.00001)iOS游戏SpeedBoy Lite成形记(三)

    在Xcode中建立新类Player,继承自CCSprite.因为我们之后需要方便的更换玩家的大头贴,所以需要能够以不同的大头贴参数初始化Player对象. 不过别急,想想我们还需要在Player对象初 ...

  9. (NO.00001)iOS游戏SpeedBoy Lite成形记(一)

    这是本猫第一个原创iOS游戏,留此为证!看编号貌似要写9万多个,千锤百炼还是太少吧!? ;) 这是一个赛跑游戏,几位选手从起点跑到终点看谁用的时间最少.现在需要实现的功能是: 1.8位选手从起点移动至 ...

随机推荐

  1. AIX 命令

    1,[ctrl]+h 删除命令 2, set -o emacs后: [ctrl]+p 看上条命令 [ctrl]+n 看下条命令 两次[esc] 自动补全 3, set -o vi 后,可以按照vi编辑 ...

  2. C++笔记003:从一个小程序开始

      原创笔记,转载请注明出处! 点击[关注],关注也是一种美德~ 安装好VS2010后,从第一个小程序开始. 在学习C语言时,我首先输出了一个程序员非常熟悉的对这个世界的问候:hello world! ...

  3. 码农代理免费代理ip端口字段js加密破解

    起因 之前挖过爬取免费代理ip的坑,一个比较帅的同事热心发我有免费代理ip的网站,遂研究了下:https://proxy.coderbusy.com/. 解密 因为之前爬过类似的网站有了些经验,大概知 ...

  4. ionic tab页面跳转

    要使用到Tabs,现将Tabs导入 import { NavController, ModalController, Tabs } from 'ionic-angular'; 把要选择的Tabs页面的 ...

  5. 配置 docker0 网桥

    Docker 服务默认会创建一个 docker0 网桥(其上有一个 docker0 内部接口),它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络. Docker 默认 ...

  6. 使用eclipse开发工具与hibernate开发者为开源一起做贡献

    本文作者:苏生米沿 本文地址:http://blog.csdn.net/sushengmiyan/article/details/50525363 hibernate使用的是gradle自动构建工具, ...

  7. Node.js 撸第一个Web应用

    使用Node.js 创建Web 应用与使用PHP/Java 语言创建Web应用略有不同. 使用PHP/Java 来编写后台代码时,需要Apache 或者 Nginx 的HTTP 服务器,而接受请求和提 ...

  8. ORACLE时间日期格式使用总结(参考网上资料汇总)

    Oracle时间日期操作 sysdate+(5/24/60/60) 在系统时间基础上延迟5秒 sysdate+5/24/60 在系统时间基础上延迟5分钟 sysdate+5/24 在系统时间基础上延迟 ...

  9. 为什么选择C++

    为什么选择C++,怎么不选其它语言呢? 为什么不选择C? 因为C++比C简单点~ 为什么不选择C#? 因为C++可以在所有操作系统上使用. 为什么不选择JAVA? 因为C++的性能好一点~ 还有其他的 ...

  10. 一个都不能少: DevOps的3大核心基础架构

    DevOps的涵盖面非常广,因为这个概念的火热,又有很多文章和技术都在把DevOps的帽子扣在自己头上,让很多人迷惑不解.其实,DevOps的知识体系如果从顶层上来分解,只有2块:方法论和工具链.方法 ...