【发布时间】:2017-05-02 21:55:57
【问题描述】:
我一直在尝试制作一个永远运行的 SKAction,我可以随时停止。我是这样做的:
override func didMove(to view: SKView) {
run(SKAction.repeatForever (
SKAction.sequence ([
SKAction.run(drawFrame),
SKAction.wait(forDuration: 0.01),
])), withKey: "frameDrawing"
)
}
然后在 drawFrame 函数中我像这样停止 SKAction:
func drawFrame() {
//(code)
if stop {
removeAction(forKey: "frameDrawing")
}
}
由于某种原因,SKAction 仅在 stop 变为 true 后运行 3 或 4 次后才停止。我希望它在 stop 设置为 true 时立即停止,而不是在 3 或 4 次重复之后。
如果有人知道如何解决此问题,请告诉我,因为我尝试了很多方法,但他们从未解决此问题。谢谢!
编辑:这是我的代码:
var drawingFrame = SKAction()
class GameScene: SKScene, SKPhysicsContactDelegate {
override func didMove(to view: SKView) {
drawingFrame = SKAction.repeatForever (
SKAction.sequence ([
SKAction.run(drawFrame),
SKAction.wait(forDuration: 0.03),
]))
run(drawingFrame)
}
func drawFrame() {
//(code)
if stop {
drawingFrame.speed = 0.0
}
}
如果您想知道为什么我在开始时将 SKAction drawingFrame 设置为一个空的 SKAction,那是因为我需要在这两个函数之前定义 SKAction。否则,不会为这两个函数定义它。
为有相同问题的任何人编辑:我已经使用自己的想法和@appzYourLife 的解决方案解决了这个问题。每次都有效的最有效方法是仅在 stop 等于 false 时运行代码。但是,请确保停止程序的 if 语句位于该括号之外,以便 SKAction 最终停止。这是工作代码:
var drawingFrame = SKAction()
class GameScene: SKScene, SKPhysicsContactDelegate {
override func didMove(to view: SKView) {
drawingFrame = SKAction.repeatForever (
SKAction.sequence ([
SKAction.run(drawFrame),
SKAction.wait(forDuration: 0.03),
]))
run(drawingFrame)
}
func drawFrame() {
if stop = false {
//(code)
}
if stop {
removeAllActions()
}
}
如果您愿意,可以使用 if else 语句作为 stop = false 语句。
【问题讨论】:
-
是的,我做了同样的顶级声明“技巧”,所以我可以访问它。我不知道这是否是最好的方法,但它确实有效。
-
按照我的阅读方式(这不是一个可信的阅读),这应该有效。动作应该停止。
-
是的,我也是这么想的。这有点奇怪。无论如何感谢您的提示。
-
@J.Treutlein 只是一个问题......你在哪里(如何)设置
stop = true?为什么不使用完全可行的示例更新您的问题,因为我认为您发布的内容实际上与您之前的示例一样,这意味着当您设置 stop = true 时,将在停止后立即执行多个 drawFrame() 调用...... -
它检查一个变量是否小于或等于一个数字。如果我发布与该变量相关的所有内容及其更改方式,我将发布我的大部分代码,大约 100 行。这就是我避免它的原因。无论如何,我的新解决方案可以完美运行,并且我希望它可以正常工作,因此不需要对我进行更改。不过感谢您的关注和帮助。
标签: swift sprite-kit skaction