如果使用编辑器中的场景加载,如何在 SpriteKit 中检测触摸

Posted

技术标签:

【中文标题】如果使用编辑器中的场景加载,如何在 SpriteKit 中检测触摸【英文标题】:How to detect touch in SpriteKit if using a scene load from editor 【发布时间】:2021-10-17 16:02:44 【问题描述】:

我创建了 SKScene 的 2 个子类,分别称为 FirstScene 和 SecondScene,FirstScene 从 sks 文件加载场景并呈现,第二个通过红色背景代码创建场景。

class FirstScene: SKScene, ObservableObject 
    let firstScene = SKScene(fileNamed: "FirstScene")
    override func didMove(to view: SKView) 
        scene?.view?.presentScene(firstScene)
        scene?.scaleMode = .resizeFill
        isUserInteractionEnabled = true
    
    
    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) 
        print("touch")
    
    


class SecondScene: SKScene, ObservableObject 
    override func didMove(to view: SKView) 
        backgroundColor = .black
        self.size = CGSize(width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height)
        scene?.scaleMode = .fill
    
    
    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) 
        print("touch")
        
    

我不知道为什么我无法检测到来自 FirstScene 的触摸...为什么 touchesMoved 仅在 secondScene 中有效?我错过了什么?

谢谢

【问题讨论】:

'scene?.view?.presentScene(firstScene)' 有什么作用? 'isUserInteractionEnabled = true' 有什么用? 将 sks 文件中的场景呈现到加载的场景中,没有那行代码场景是一个白色的空场景 SKScene 而言,您尝试做的事情没有意义。您没有将 firstScene 添加到 FirstScene。你正在用它覆盖SKView 对不起,我刚刚开始了解 SpriteKit,我正在尝试使用按钮从 sks 文件更改场景加载,并检测每个场景中的触摸。这是我之前的问题,我在哪里发布了我用来加载到 sks 文件的代码,我错了吗? ***.com/questions/68784060/… 如何将 sks 文件加载到自定义类中?在 swiftUI 中,我可以直接在视图中加载 let customScene = SKScene(fileNamed: "FirstScene") 并使用 SpriteView(scene: firstscene) 呈现它,但我想使用自定义类加载它以便使用它 【参考方案1】:

ios 14、斯威夫特 5

除了我在 medium 上发布的一篇文章之外,这定义了两个场景并允许您在它们之间切换。这会做你想做的事吗?

https://betterprogramming.pub/build-a-game-of-chess-with-spritekit-3229c23bdba0

import SwiftUI
import SpriteKit

struct ContentView: View 

@State var switcher = false

var scene: SKScene 
    let scene = GameScene.shared
    scene.size = CGSize(width: 256, height: 512)
    scene.scaleMode = .fill
    scene.backgroundColor = .red
    scene.name = "red"

    return scene


var scene2: SKScene 
    let scene2 = GameScene2.shared
    scene2.size = CGSize(width: 256, height: 512)
    scene2.scaleMode = .fill
    scene2.backgroundColor = .blue
    scene2.name = "blue"
    
    return scene2


var body: some View 
  if switcher 
    SpriteView(scene: scene)
        .frame(width: 256, height: 512)
        .ignoresSafeArea()
        .background(Color.red)
        .onAppear 
          scene2.isPaused = true
        
        .onDisappear 
          scene2.isPaused = false
        
        
   else 
    SpriteView(scene: scene2)
        .frame(width: 256, height: 512)
        .ignoresSafeArea()
        .background(Color.blue)
        .onAppear 
          scene.isPaused = true
          
        
        .onDisappear 
          scene.isPaused = false
        
        
  
  Button 
    withAnimation(.easeInOut(duration: 1.0)) 
      switcher.toggle()
    
   label: 
    Text("play")
  
  


【讨论】:

以上是关于如果使用编辑器中的场景加载,如何在 SpriteKit 中检测触摸的主要内容,如果未能解决你的问题,请参考以下文章

如何在网页3D编辑器Stone中引入平面多边形模型

(统一)销毁当前场景中的游戏对象并在加载当前场景后使其永久销毁?

如何访问 SpriteKit 场景编辑器参考节点上自定义类中包含的 Swift 中的变量?

unity实用技能unity编辑器工具之加载预制(Prefab)和场景(Scene)

如何将 Ace 编辑器中的所有文本保存在 WT 中?

如何在 SpriteKit 场景编辑器中访问导航图的对象