【问题标题】:How do I only allow one instance of an SKSpriteNode on screen at one time?如何一次只允许屏幕上出现一个 SKSpriteNode 实例?
【发布时间】:2017-08-27 06:26:16
【问题描述】:

这是我第一次发帖-我已经搜索了很长时间,但找不到答案。

我正在使用 SpriteKit 制作游戏,并希望玩家一次只能发射一枚炸弹 - 即在前一枚炸弹爆炸或离开屏幕之前,他们无法再次发射。目前,当玩家点击屏幕时,他们可以发射任意数量的炸弹。

任何帮助将不胜感激!

谢谢, 伊恩

【问题讨论】:

  • 在播放器上保留一个Optional<SKSpriteNode> 变量,以引用播放器已发射并正在飞行的炸弹。每当炸弹发射时设置它,并在炸弹爆炸时取消它。仅当变量已经为零时才允许发射新炸弹
  • 你的游戏是基于物理还是基于动作?

标签: ios swift sprite-kit


【解决方案1】:

Steve 的想法效果很好,比我的要好,但这里有一个对新手更友好的解释 IMO...把它放在你的游戏场景中 :)

var canFireMissile = true

func fireMissile() {
  guard canFireMissile else { return }

  canFireMissile = false   // So you can't fire anymore missiles until 0.5secs later

  let wait     = SKAction.wait(forDuration: 0.5) // the duration of the missile animation (example)
  let reset    = SKAction.run { canFireMissile = true } // lets us refire the missile
  let sequence = SKAction.sequence([wait, reset])
  run(sequence)
}

override func mouseDown(with event: NSEvent) { // touchesBegan on iOS
  fireMissile()
}

【讨论】:

  • 感谢您的帮助 - 这让事情变得更加清晰!
  • 我实际上比 Steve 更喜欢这种方法,检查布尔状态比检查哈希表中是否存在键要快得多
  • 我要做的唯一改变就是将动作附加到导弹上或使用完成处理程序来避免等待
【解决方案2】:

为你的导弹创建一个 SKSpriteNode 属性。 为导弹的移动创建一个 SKAction 并为该动作指定一个键,以便您可以通过名称引用它)。 当按下触发按钮时,检查命名的动作是否已经在运行;如果是,则不执行任何操作,否则运行“fireMissile”操作。

【讨论】:

  • 我非常喜欢这个 - 会试一试!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-09
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多