如何在我的 Swift 游戏中对事件进行排队

How to queue events in my Swift game

我花了一些时间研究排队的各种方法,甚至阅读了这个 http://www.raywenderlich.com/79149/grand-central-dispatch-tutorial-swift-part-1 这很有帮助,但我觉得随着我对 GCD 的阅读越多,我对自己变得越困惑和不确定正确的方法。有人可以给我推荐吗?

我的目标是:我正在制作一款玩家可能会因某些游戏事件而失去健康的游戏。玩家在顶部有一个健康栏(心),每次他们被击中时,我都会设置一颗心在 0.1 时间间隔内向上飞。我正在探索某种队列的原因是,在某些情况下,玩家可能会如此迅速地失去健康,以至于事件比动画触发得更快。结果,它有时会 "skips" 心,因为它跟不上健康损失。这仅在某些水平上受到的伤害高于平时。即使没有动画,它仍然偶尔会发生,虽然我认为有点少。

所以我在想我能做的是将每个健康损失事件排队,这样它会强制事件按顺序进行,但我没有成功(它仍然非常快并且跳过了心,移除第 10 颗心、第 8 颗心和第 5 颗心,然后它说游戏结束。我想放慢速度并按顺序移除红心,这样你就可以看到它们消失了)。

这是我尝试的代码:

       dispatch_async(dispatch_get_main_queue(), {
            heartToRemove!.runAction(
                SKAction.sequence([SKAction.moveByX(0, y:50, duration:0.1),
                    SKAction.runBlock
                    {
                        heartToRemove!.removeFromParent()
                        self.hearts.removeLast()
                    }]))
                })

所以想法是 运行 队列上的 3 个操作: 第一,把心向上。接下来,在视觉上从父项中移除(因此它从游戏中消失,而不仅仅是位于上方),最后将其从 SKNodes(红心)数组中移除,以便下一次移除一颗红心时,它会转到下一个如果有意义的话,行不一样。

我也试过 dispatch_sync 但这只是冻结了我的游戏所以我认为这是错误的。还有其他推荐吗?

非常感谢您的宝贵时间!

您可以使用 hearths 数组中的项目数来偏移动画时间

类似于:

    let wait   = SKAction.waitForDuration(0.1 * NSTimeInterval(hearts.count-1))
    let move   = SKAction.moveByX(0, y:50, duration:0.1)
    let remove = SKAction.runBlock()
                 {
                    heartToRemove!.removeFromParent()
                    self.hearts.removeLast()
                 }        
    heartToRemove!.runAction(SKAction.sequence([ wait, move, remove ]))

这样你就不用担心排队的问题了。