【问题标题】:How to change wait for duration SKAction ran by an SKScene?如何更改等待由 SKScene 运行的 SKAction 持续时间?
【发布时间】:2015-02-04 19:33:12
【问题描述】:

在我的 SpriteKit 项目中,我有一个 spawnEnemy 方法。我希望这个方法被一遍又一遍地调用,以便敌人在整个游戏中继续产生。

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

下面是相关代码的sn-p:

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

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

谢谢

【问题讨论】:

  • 我目前使用 Objective-C 编码,所以我无法提供一个快速的示例。在这种情况下,我通常会创建一个递归方法。在这种方法中,我创建了一个等待动作和一个运行相同方法的动作。这样你就可以更好地控制“延迟”时间,你甚至可以在里面有你自己的条件如果不清楚,如果它有效,请告诉我。
  • @JadFeitrouni 感谢您的评论。我想我明白了,但我只是想确定一下,你能提供一个 sn-p 代码吗? Objective-C 应该没问题,因为我熟悉该语言。
  • 动作有速度属性

标签: ios swift sprite-kit


【解决方案1】:

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

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

首先在你的班级设置两个计时器

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

【讨论】:

    【解决方案2】:
    -(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。 希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-12
      • 1970-01-01
      • 2017-06-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多