增加 Sprite Kit 游戏的难度

Posted

技术标签:

【中文标题】增加 Sprite Kit 游戏的难度【英文标题】:Increasing difficulty of a Sprite Kit game 【发布时间】:2015-03-18 21:59:58 【问题描述】:

我有一个用 Sprite Kit 制作的游戏,它有一个 SKAction,它执行一个方法并以一定的时间间隔永远重复它:

 _action = [SKAction sequence:@[
                                          [SKAction waitForDuration:difficulty],
                                          [SKAction performSelector:@selector(addPlayer) onTarget:self]]];

    [self runAction:[SKAction repeatActionForever:_action] withKey:playerKey];

但我希望时间间隔每秒减少 0.01 秒,为此我使用了计时器:

difficultyTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(decrease) userInfo:nil repeats:YES];

重复这个方法:

- (void)decrease 
difficulty -= 0.01;
NSLog(@"Difficulty: %.2f", difficulty);

我尝试将 difficulty 设置为浮点数和 NSTimeInterval,但计时器不会影响 SKAction -waitForDuration

【问题讨论】:

【参考方案1】:

您可以使用SKSceneupdate 功能添加更改waitDuration 的玩家。每一帧都会调用update 方法,并使用currentTimeInterval 作为参数。我们可以使用计算最后一次addPlayer 调用和当前帧之间经过的时间。如果它大于difficulty 等待时间,那么我们将再次更新它。

首先像这样创建一个property

@property (nonatomic) NSTimeInterval lastAddPlayerTime;

然后在update函数中

-(void)update:(NSTimeInterval)currentTime

    if (currentTime - self.lastAddPlayerTime >= difficulty) 
        self.lastAddPlayerTime = currentTime;
        [self addPlayer];
    

您还可以创建一个重复的SKAction 以每秒减少difficulty variable

SKAction *increaseDifficultyAction = [SKAction
                                      sequence:@[[SKAction waitForDuration:1.0],
                                                 [SKAction runBlock:^
    difficulty -= 0.01;
]]];

[self runAction:[SKAction repeatActionForever:increaseDifficultyAction]];

【讨论】:

谢谢,它运行良好,但我想让difficulty 变量在游戏结束时重新启动。我试过这段代码,但它不起作用:SKAction *increaseDifficultyAction = [SKAction sequence:@[[SKAction waitForDuration:1.0], [SKAction runBlock:^ if (gameover == NO) difficulty -= 0.01; else difficulty = 1.0; ]]]; [self runAction:[SKAction repeatActionForever:increaseDifficultyAction]]; gameover是一个布尔值,用于检查游戏是否结束【参考方案2】:

您应该创建一个更新操作,它会每隔一段时间调用一个更新方法,然后在该函数内部有添加玩家的逻辑,而不是向 addPlayer 操作添加时间间隔。

例如,如果您将计时器设置为每 0.1 秒运行一次,您可以创建一个计数器变量来查看有多少“更新”已经过去,然后有一个“难度”变量来确定您想要更新多少次添加播放器。

伪代码:

-(void)update
  counter+=1;
   if(counter%difficulty == 0)  
   
    addPlayer();
   

通过这种方式,您可以将所有逻辑集中在一个地方,并基于相同的“更新”时间表。您可以在 3 次更新后添加敌人,在 5 次更新后更改背景等等。

【讨论】:

以上是关于增加 Sprite Kit 游戏的难度的主要内容,如果未能解决你的问题,请参考以下文章

在 Sprite Kit 游戏中重置 SKScene

意见汇总

Swift Sprite Kit 中的游戏中心

游戏中的三角学——Sprite Kit 和 Swift 教程

游戏中的三角学——Sprite Kit 和 Swift 教程

在 sprite-kit 中画绳子的最佳方法是啥?