ios14 Xcode 12 - 触摸 SwiftUI 对象时精灵不显示,但触摸 SKScene 时工作

Posted

技术标签:

【中文标题】ios14 Xcode 12 - 触摸 SwiftUI 对象时精灵不显示,但触摸 SKScene 时工作【英文标题】:ios14 Xcode 12 - Sprites do not show when touching SwiftUI objects but work when touching SKScene 【发布时间】:2020-08-01 17:13:59 【问题描述】:

我正在开发一个简单的游戏,以在 Xcode 12 中使用 SpriteKit 学习 SwiftUI 的新功能。当用户触摸 SKScene touchesBegan() 时,一切都按预期工作。当用户触摸 Circle() gesture(DragGesture()) 时,我调用了相同的函数,但没有显示任何内容。我可以从日志中得知函数 showFragments(location:) 正在被调用,但屏幕上没有显示任何内容。有什么想法吗?

代码如下:

import SpriteKit
import SwiftUI


struct ContentView: View 
    
    var scene: GameScene 
        let scene = GameScene()
        scene.size = CGSize(width: 350, height: 600)
        scene.scaleMode = .fill
        scene.backgroundColor = .white
        return scene
    
    var body: some View 
        ZStack 
            SpriteView(scene: scene)
                .frame(width: 350, height: 600)
                .edgesIgnoringSafeArea(.all)
            
            Circle()
                .fill(Color.blue)
                .frame(width: 50, height: 50)
                .gesture(
                    DragGesture(minimumDistance: 0.0)
                        .onChanged( _ in
                            self.scene.showFragments(location: CGPoint(x: 150, y: 300))
                        )
                )
        
    


class GameScene: SKScene 
    override func didMove(to view: SKView) 
        physicsBody = SKPhysicsBody(edgeLoopFrom: frame)
    
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) 
        self.showFragments(location: CGPoint(x: 150, y: 300))
    
    
    public func showFragments(location: CGPoint) 
        
        var i: Int = 0
        while i <= 3 
            i += 1
            let fragment = SKSpriteNode(texture: SKTexture(imageNamed: "Brown Armor Fragment"))
            fragment.position = location
            print ("fragment \(i): \(fragment.position)")
            let wait = SKAction.wait(forDuration: 1)
            let remove = SKAction.run(() in fragment.removeFromParent() )
            
            
            fragment.physicsBody = SKPhysicsBody(texture: SKTexture(imageNamed: "Brown Armor Fragment"), alphaThreshold: 0.1, size: CGSize(width: 8, height: 6.5))
            self.addChild(fragment)
            let vx = Double.random(in: -1...1)
            fragment.physicsBody?.applyImpulse(CGVector(dx: vx, dy: 0))
            fragment.run(SKAction.sequence([wait, remove]))
        
    


【问题讨论】:

【参考方案1】:

您为场景定义了可计算属性,因此它为圆圈手势创建了不同的场景。

解决方案是使用一次定义的场景(使用 Xcode 12 / ios 14 测试)。对场景使用以下表达式:

struct ContentView: View 

    let scene: GameScene = 
        let scene = GameScene()
        scene.size = CGSize(width: 350, height: 600)
        scene.scaleMode = .fill
        scene.backgroundColor = .white
        return scene
    ()

    // ... other code


【讨论】:

@Dopp,我知道))。欢迎来到SO。 What should I do when someone answers my question?

以上是关于ios14 Xcode 12 - 触摸 SwiftUI 对象时精灵不显示,但触摸 SKScene 时工作的主要内容,如果未能解决你的问题,请参考以下文章

为啥触摸 SCNView 顶部的滑块会在 iOS 8/Swift 上将相机移动到下方?

Xcode Swift - 检测屏幕上颜色的触摸

触摸手势在 Scrollview(Xcode、Swift)中不起作用

Xcode 10, Swift 4.2及iOS 12升级适配

Xcode 12 和 iOS 14 中的手势问题

如何通过 UI 测试(Xcode 12、iOS14)访问推送通知?