因为我们之前在GameScene中建立的2个数组,分别为player和label的数组.大家可以注意到其中每个元素是一一对应的.

知道了这层关系,我们尝试来更新matchRun方法:

CCActionCallBlock *blk = [CCActionCallBlock actionWithBlock:^{
            _finishedCount++;
            [player endMatch];

            if (_finishedCount == 1) {
                _bestElapsedTime = player.elapsedTime;
            }

            CCLabelTTF* label = (CCLabelTTF*)_labelArray[player.playerNumber-1];

            NSTimeInterval intervalOffset = player.elapsedTime - _bestElapsedTime;

            if (intervalOffset > 0) {
                label.string = [NSString stringWithFormat:@"NO.%d +%.4f s",_finishedCount,intervalOffset];
            }else{
                label.string = [NSString stringWithFormat:@"NO.%d %.4f s",_finishedCount,player.elapsedTime];
            }

            label.visible = YES;

            if (_finishedCount == PlayerCount) {
                _finishedCount = 0;
                _matching = NO;
            }
        }];

其实需要改动的只有回调block中的代码,主要是增加了设置标签内容以及使标签可见的功能.

首先取得与选手对应的标签,通过选手的编号:因为第1赛道的选手编号为0,以此类推.

接下来计算其他选手的成绩与最好成绩的差值,用来后面显示”+xxx秒”,当然最好选手的成绩直接显示秒数即可,其余选手显示与最好成绩差多少秒(即超过多少秒).

最后使标签可见即可.

执行效果如下:

(NO.00001)iOS游戏SpeedBoy Lite成形记(七)-LMLPHP

Ok!到这里一切都还好.

但是有一点问题.大家可以注意到现在每位选手的最终比赛结果是在比赛前就确定好的,因为在matchRun方法开头就设置了移动动作的经历时间.所以开头领先的选手最后一定是第一名!

这个和实际比赛不符.我们更希望看到某位选手开始领先后被追上,或是先是落后最后却成为NO.1的情形.所以我们必须找到一种办法来动态调整选手移动速度的方法:一会让他快一点,一会让他慢一点.

这意味着我们必须在GameScene的update方法中动点脑筋,这也是下一篇要完成的内容.

05-11 20:41