SwiftUI 按钮点击重置 SpriteKit 动画 - 这是一个错误吗?
Posted
技术标签:
【中文标题】SwiftUI 按钮点击重置 SpriteKit 动画 - 这是一个错误吗?【英文标题】:SwiftUI button taps reset SpriteKit animations - is this a bug? 【发布时间】:2021-07-26 17:48:56 【问题描述】:我想在我的 SwiftUI 应用中添加动画背景。我通过使用 SpriteKit GameScene 作为背景,并使用 SKActions 逐渐淡入和淡出不同的图像来实现这一点。
但是,我注意到当我点击 SwiftUI 应用中的任何按钮时,它会完全重置动画。
这是一个错误吗?有谁知道解决这个问题的方法吗?
这是我的 SwiftUI ContentView.swift 的简化版本:
struct ContentView: View
var scene: SKScene
let scene = GameScene()
scene.size = CGSize(width: 1125, height: 2436)
scene.scaleMode = .fill
return scene
var body: some View
SpriteView(scene: scene)
.frame(width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height)
.ignoresSafeArea()
这是我用来为背景设置动画的代码:
// Animations
let fadeOutAnimation: SKAction = SKAction.fadeOut(withDuration: 5)
let fadeInAnimation: SKAction = SKAction.fadeIn(withDuration: 5)
let wait5Animation: SKAction = SKAction.wait(forDuration: 5)
let wait10Animation:SKAction = SKAction.wait(forDuration: 10)
let wait20Animation:SKAction = SKAction.wait(forDuration: 20)
// Repeating Background Actions
let firstRepeatingSequence = SKAction.repeatForever(SKAction.sequence([fadeOutAnimation, wait20Animation, fadeInAnimation]))
let secondRepeatingSequence = SKAction.repeatForever(SKAction.sequence([fadeOutAnimation, wait10Animation, fadeInAnimation, wait10Animation]))
let thirdRepeatingSequence = SKAction.repeatForever(SKAction.sequence([fadeOutAnimation, fadeInAnimation, wait20Animation]))
//Access bg sprites
let bg1 = SKSpriteNode(imageNamed: "blue1")
bg1.anchorPoint = CGPoint(x: 0, y: 0)
let bg2 = SKSpriteNode(imageNamed: "red1")
bg2.anchorPoint = CGPoint(x: 0, y: 0)
let bg3 = SKSpriteNode(imageNamed: "green1")
bg3.anchorPoint = CGPoint(x: 0, y: 0)
self.addChild(bg1)
self.addChild(bg2)
self.addChild(bg3)
// Run Background forever
bg3.run(firstRepeatingSequence)
bg2.run(SKAction.sequence([wait5Animation, secondRepeatingSequence]))
bg1.run(SKAction.sequence([wait10Animation, thirdRepeatingSequence]))
【问题讨论】:
每次视图主体更新时整个 SpriteKit 场景都会重置吗? 是的,我认为这就是正在发生的事情。这很奇怪——按钮与 SpriteKit 场景无关。该应用程序基本上是一个具有漂亮背景的计算器。这些按钮不会以任何方式绑定到 SpriteKit 场景中。 一个最小的例子将有助于调试它,例如一个非常基本的场景,只有一个正方形,可能会旋转或改变不透明度。如果我可以把它粘贴进去调试它,我会尝试解决这个问题。 需要看 SwiftUI 部分。每当界面状态发生变化时,您可能正在制作一个新场景。 感谢您提供帮助,@George_E。我编辑了代码以添加用于将 spriteKit 代码嵌入到我的 SwiftUI contentView 中的 SwiftUI 代码。 【参考方案1】:我相信它正在重绘视图,并且当它这样做时,它正在重新初始化您的场景。将您的场景设为 @State 变量并在 init 方法中对其进行初始化。
struct ContentView: View
@State var scene = GameScene()
init()
scene.size = CGSize(width: 1125, height: 2436)
scene.scaleMode = .fill
var body: some View
SpriteView(scene: scene)
.frame(width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height)
.ignoresSafeArea()
【讨论】:
以上是关于SwiftUI 按钮点击重置 SpriteKit 动画 - 这是一个错误吗?的主要内容,如果未能解决你的问题,请参考以下文章