繁体   English   中英

如何更改等待由 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 运行的生成动作的延迟仍然是相同的。

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

谢谢

在这种情况下,请勿使用动作。 它们实际上并不是以动态方式工作的。 一旦设置好它们,它们就会卡住。 只需使用您的更新方法。

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

首先在课堂上设置两个计时器

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

要开始生成敌人时,请记住调用recursiveMethod。 希望能有所帮助。

提供 swift 解决方案,无需计时器,使用带有断路器标志的递归:

class YourScene: SKScene {
    
    var gameOver: Bool = false

    func spawnEnemies() {
        let waitAction = SKAction.wait(forDuration: yourDynamicDurationHere)
        self.run(SKAction.sequence([SKAction.run(self.spawnEnemy), waitAction])) {
            if !gameOver {
                spawnEnemies()
            }
        }
    }
}

该解决方案利用run方法的完成处理程序递归地安排序列的另一个执行。 由于每个单独的SKSequence都是在执行之前创建的,因此我们可以为每次迭代传递不同的等待时间。

要停止递归循环,只需设置gameOver = true。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM