如何在我的 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 ]))
这样你就不用担心排队的问题了。
我花了一些时间研究排队的各种方法,甚至阅读了这个 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 ]))
这样你就不用担心排队的问题了。