你如何让 Swift 等待 SKAction 被执行?
Posted
技术标签:
【中文标题】你如何让 Swift 等待 SKAction 被执行?【英文标题】:How do you make Swift wait for SKAction to be executed? 【发布时间】:2017-07-27 12:56:53 【问题描述】:我有以下 Swift 代码,但是,当我在 Xcode Simulator 中运行它时,它会直接跳到“我不相信我们以前见过面”。如何让 Swift 等待“欢迎”首先执行?
import SpriteKit
import GameplayKit
class GameScene: SKScene
override func didMove(to view: SKView)
// Get label node from scene and store it for use later
let animateList = SKAction.sequence([SKAction.fadeIn(withDuration: 1.0), SKAction.wait(forDuration: 2.0), SKAction.fadeOut(withDuration: 1.0)])
let startScreen = SKLabelNode(fontNamed: "Helvetica Neue UltraLight")
startScreen.text = "Welcome"
startScreen.fontSize = 100.0
startScreen.fontColor = SKColor.white
startScreen.position = CGPoint(x: self.frame.midX, y: self.frame.midY)
self.addChild(startScreen)
startScreen.alpha = 0.0
startScreen.run(animateList)
startScreen.text = "I don't belive we have met before"
startScreen.run(animateList)
【问题讨论】:
别听 J. Doe 的。使用 SpriteKit 开发游戏时应避免使用 Timer。只需将 SKAction.wait 与 SKAction.run 完成块一起使用即可。 为什么要运行两次动画列表? 啊,我想我明白发生了什么,您认为通过更改文本是您的操作序列的一部分,您想使用操作块将startScreen.text = "I don't belive we have met before"
放入您的序列并运行您的列出一次
【参考方案1】:
不要调用startScreen.run()
,而是调用startScreen.run(_:completion)
并在SKAction
s 在完成处理程序中运行之后执行您想做的事情。请参阅documentation。
startScreen.run(animateList, completion:
self.startScreen.text = "I don't belive we have met before"
self.startScreen.run(animateList)
)
【讨论】:
要么这个,要么将块附加到序列的末尾。不幸的是,你不能在运行一个动作时同时使用一个键和一个完成块(不知道为什么苹果公司的人没有想到添加这个)所以你可能需要在需要时使用追加到序列末尾的策略为操作分配一个键。 如果你有一个字符串数组怎么办?你会如何循环这个? 在完成块里面,我觉得应该是 self.startScreen.text = "I don't Belive we have met before" 还有 self.startScreen.run(animateList)。【参考方案2】:您可以使用计时器来等待您想要执行的操作,如下所示:
_ = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: false) _ in
// do whatever you want after 1 second.
【讨论】:
我不建议这样做,如果你暂停场景,你的计时器会触发导致问题。 此外,如果您更改任何SKAction
s 的持续时间,您还需要手动更改Timer
中的时间,这很容易导致问题。最好使用带有完成处理程序的run
版本。以上是关于你如何让 Swift 等待 SKAction 被执行?的主要内容,如果未能解决你的问题,请参考以下文章
iOS Swift 如何为 For 循环 SKAction 使用完成处理程序