增加 Sprite Kit 游戏的难度

Increasing difficulty of a Sprite Kit game

我有一个用 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

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

例如,如果您将计时器设置为每 0.1 秒 运行,您可以创建一个计数器变量来查看有多少 "updates" 已经过去,然后有一个 "difficulty"变量以确定您要添加玩家的更新次数。

伪代码:

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

这样您就可以将所有逻辑放在一个地方并基于相同的 "update" 时间表。 3次更新后可以添加敌人,5次更新后可以更换背景等等

您可以使用SKSceneupdate功能来添加球员waitDurationupdate 方法以 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]];