如何改变等待SKScene运行SKAction的持续时间?

时间:2015-02-04 19:33:12

标签: ios swift sprite-kit

在我的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运行的spawn动作的延迟仍然是相同的。

我能想到解决此问题的唯一方法是删除操作,然后使用新的延迟/生成率重新添加操作。有没有更好的方法来解决这个问题?

由于

2 个答案:

答案 0 :(得分:3)

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

我会告诉你我是如何定期发射导弹的:

首先在班上设置两个计时器

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,并且始终会反映更改。

答案 1 :(得分:1)

-(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];
    }
}

当你想要开始产生敌人时,请记得调用recursiveMethod。 希望有所帮助。