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 动画 - 这是一个错误吗?的主要内容,如果未能解决你的问题,请参考以下文章

点击注销时 SwiftUI 将应用程序重置为登录屏幕

在 SwiftUI 中重置绑定变量

SwiftUI 确认按钮 - 在任何其他视图交互时重置状态

SwiftUI List 在任何视图更改时重置滚动

添加框阴影错误 - 无法点击我的按钮 - SpriteKit

从 SpriteKit 场景移动到 SwiftUI 视图