【问题标题】:How to queue events in my Swift game如何在我的 Swift 游戏中对事件进行排队
【发布时间】:2016-02-14 16:33:17
【问题描述】:

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

我的目标是:我正在制作一款玩家可能因某些游戏事件而失去生命值的游戏。玩家在顶部有一个生命条(心),每次被击中时,我都会让心在 0.1 的时间间隔内向上飞行。我正在探索某种队列的原因是玩家在某些情况下会如此迅速地失去健康,以至于事件的触发速度比动画快。结果,它有时会“跳过”心脏,因为它无法跟上健康损失。这仅在受到的伤害高于平时的某些级别上。即使没有动画,它仍然偶尔会发生,虽然我觉得少了一点。

所以我在想我能做的是将每个健康损失事件排队,这样它会强制事件按顺序进行,但我没有成功(它仍然进行得非常快并且跳过了心脏,删除了第 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,但这只是冻结了我的游戏,所以我认为这是错误的。还有其他推荐吗?

非常感谢您的宝贵时间!

【问题讨论】:

    标签: swift sprite-kit swift2 grand-central-dispatch


    【解决方案1】:

    您可以使用壁炉数组中的项目数来抵消动画时间

    类似:

        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 ]))
    

    这样您就不必担心对操作进行排队。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多