如果使用编辑器中的场景加载,如何在 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 中检测触摸的主要内容,如果未能解决你的问题,请参考以下文章
(统一)销毁当前场景中的游戏对象并在加载当前场景后使其永久销毁?
如何访问 SpriteKit 场景编辑器参考节点上自定义类中包含的 Swift 中的变量?