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

本文详细解析了在GameScene.m中如何实现matchRun功能,包括比赛的开始、结束逻辑,选手的比赛动作模拟及成绩记录等关键步骤。

在GameScene.m中添加matchRun的实现:

-(void)matchRun{
    CCLOG(@"%@ invoke!",NSStringFromSelector(_cmd));
    //如果比赛还未结束,啥都不做直接退出.
    if (_matching) {
        return;
    }

    //重置比赛设置
    [self matchReset];
    _matching = YES;

    for (Player *player in _players) {
        CCTime duration = (CCRANDOM_0_1() * 500.0/100) + 5.0;
        CCActionMoveBy *moveBy = [CCActionMoveBy actionWithDuration:duration position:ccp(0.9f, 0)];

        CCActionJumpBy *jump = [CCActionJumpBy actionWithDuration:duration position:ccp(0, 0) height:0.05 jumps:20];

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

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

            //如果所有选手都完成比赛则复位比赛参数        
            if (_finishedCount == PlayerCount) {
                _finishedCount = 0;
                _matching = NO;
            }
        }];
        CCActionSequence *seq = [CCActionSequence actionWithArray:@[moveBy,blk]];

        [player runAction:seq];
        [player runAction:jump];

        [player startMatch];
    }
}

代码比较多,下面简单讲解一下.首先如果前面的比赛未结束则直接退出方法.重置比赛参数.

创建2个动作,一个是玩家从起点到终点的移动动作.为了使得比赛过程活泼一点,还是用了另一个动作,模拟玩家跳跃着移动 ;)

因为要在玩家到达终点时触发回调,所以这里还需要一个回调action,在回调中完成:确定玩家名次,执行玩家到终点时的方法(下面自会道来),记录最好成绩以及复位比赛参数等功能.

然后用一个序列动作串联移动好回调动作,最后同时执行序列和跳跃动作.

打开Player.h文件添加一个新的属性:

@property (nonatomic,assign) NSTimeInterval elapsedTime;

最后打开Player.m文件,补全matchRun所需的方法:

-(void)startMatch{
    _now = [NSDate new];
    self.elapsedTime = 0;
}

-(void)endMatch{
    self.elapsedTime = -1*[_now timeIntervalSinceNow];
}

执行效果如下:

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值