如何通过 SKScene 更改等待持续时间 SKAction 运行?

How to change wait for duration SKAction ran by an SKScene?

在我的 SpriteKit 项目中,我有一个 spawnEnemy 方法。我希望一遍又一遍地调用此方法,以便敌人在整个游戏过程中不断产生。

我为实现这一点所做的是将 spawnEnemy 方法放在 SKAction runBlock 中,并让我的 SKScene 运行 永远执行该操作,并在调用之间延迟(以防止应用程序过载)。

下面是相关代码的片段:

var _spawnSpeedSeconds: Double = 2.0

func startSpawning()
{
   let waitForXSeconds = SKAction.waitForDuration(self._spawnSpeedSeconds)

   let spawn = SKAction.runBlock({ () -> Void in
            self.spawnEnemy()
        })      
   self.runAction(SKAction.repeatActionForever(SKAction.sequence([spawn, waitForXSeconds])), withKey: "spawnEnemy")
}

func spawnEnemy()
{
...
}

现在在一定时间后(例如,当玩家获得 5 分或其他东西时),我会降低 _spawnSpeedSeconds 以使敌人在更短的时间内生成更多,从而增加难度。

问题是,即使我减少了 _spawnSpeedSeconds 变量,SKScene 的生成动作延迟 运行 仍然是相同的。

我能想到的解决此问题的唯一方法是删除该操作,然后以新的 delay/spawn 速率重新添加该操作。有没有更好的方法来解决这个问题?

谢谢

在这种情况下不要使用操作。它们并不是真正以动态方式工作。一旦你设置它们,它们就会卡住。只需使用您的更新方法。

我将向您展示我是如何定期发射导弹的:

首先在您的 class

中设置两个计时器
var missleTimer:NSTimeInterval = NSTimeInterval(2)
var missleInterval:NSTimeInterval = NSTimeInterval(2)

现在在我们的更新方法中我们倒计时并产生导弹

// subtract time from our timer
self.missleTimer -= self.delta

// when our timer reaches zero
if self.missleTimer <= 0 {
    // run your spawning code
    self.launchMissle()
    // reset timer
    self.missleTimer = self.missleInterval
} 

这比在这种情况下使用操作要好,因为我可以在我的代码中的任何地方设置 missleInterval,并且更改总是会反映出来。

-(void)recursiveMethod
{
    if(shouldSpawnEnemy)
    {
        _spawnSpeedSeconds -= 0.01;
        SKAction *wait = [SKAction waitForDuration: 0.5];
        SKAction *action = [SKAction performSelector:@selector(recursiveMethod) onTarget:self];
        SKAction *sequence = [SKAction sequence:@[wait,action]];
        [self repeatActionForever:sequence];
    }
}

记得在开始生成敌人时调用递归方法。 希望对您有所帮助。