微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SwiftUI + SpriteView = 灰屏

如何解决SwiftUI + SpriteView = 灰屏

Xcode 13 测试版 2、iOS 15 测试版 2。

以下代码产生灰屏:
SKScene GameScene.didMove(to:) 永远不会被调用

import SwiftUI
import SpriteKit

// A simple game scene with falling Boxes
class GameScene: SKScene {
    override func didMove(to view: SKView) {
        physicsBody = SKPhysicsBody(edgeLoopFrom: frame)
    }

    override func touchesBegan(_ touches: Set<UITouch>,with event: UIEvent?) {
        guard let touch = touches.first else { return }
        let location = touch.location(in: self)
        let Box = SKSpriteNode(color: SKColor.red,size: CGSize(width: 50,height: 50))
        Box.position = location
        Box.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: 50,height: 50))
        addChild(Box)
    }
}

// A sample SwiftUI creating a GameScene and sizing it at 300x400 points
struct ContentView: View {
    var scene: SKScene {
        let scene = GameScene()
        scene.size = CGSize(width: 300,height: 400)
        scene.scaleMode = .fill
        return scene
    }

    var body: some View {
        SpriteView(scene: scene)
            .frame(width: 300,height: 400)
            .ignoresSafeArea()
    }
}

我不知道如何解决/解决此问题。
有什么想法吗?

(适用于以前的 Xcode / Swift 版本)

解决方法

此问题已在 Xcode 13 beta 5 / iOS 15 beta 5 中修复。

,

这可能是因为场景是一个计算变量。因此,每次重绘视图或访问场景时,都会重新计算它,从而创建并初始化一个新的 GameScene 对象。尝试更像这样的事情,其中​​ GameModelGameScene 只创建一次。 (您可能可以改进它并删除必须设置两次大小):

class GameScene: SKScene { // keep the same }

class GameModel: ObservableObject {
  let scene: SKScene = {
    let scene = GameScene()
    scene.size = CGSize(width: 300,height: 400)
    scene.scaleMode = .fill
    return scene
  }()
}

struct ContentView: View {
    @StateObject var model = GameModel()
    var body: some View {
      SpriteView(scene: model.scene)
        .frame(width: 300,height: 400)
            .ignoresSafeArea()
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。