如何解决是否可以将 SpriteKit 节点从一个 SKScene 拖放到另一个 SKScene?
情况:
在 SpriteView()
中有两个 vstack
视图的 SwiftUI 应用。每个 SpriteView()
代表不同的 SKScene
。底部视图有一个 SKSpriteNode
,可以在其场景中拖放。
问题:
是否可以将节点拖到当前底部场景之外并将其放入顶部场景?然后最终让它与顶部场景中的节点交互?基本上使它成为顶级场景的一部分。
我的想法:
我能想到的唯一方法是,一旦触摸在顶部场景上,就从头开始创建拖动节点,同时从底部场景中删除节点。我什至不能 100% 确定这是否可行,而触摸仍然被底部场景阻挡。我希望有一些更简单的方法,也许 SpriteKit 有一些我不知道的功能。
示例代码:
import SwiftUI
import SpriteKit
//MARK: - Content and Setup
struct ContentView: View {
var body: some View {
vstack {
TopView()
BottomView()
}
}
}
//MARK: - Top View
class TopScene: SKScene {
override func didMove(to view: SKView) {
}
}
struct TopView: View {
var scene: SKScene {
let scene = TopScene()
scene.size = CGSize(width: 300,height: 300)
scene.scaleMode = .fill
return scene
}
var body: some View {
SpriteView(scene: scene)
.frame(width: 300,height: 300)
}
}
//MARK: - Bottom View
class BottomScene: SKScene {
var currentNode: SKNode?
override func didMove(to view: SKView) {
physicsBody = SKPhysicsBody(edgeLoopFrom: frame)
let Box = SKSpriteNode(color: .red,size: CGSize(width: 50,height: 50))
Box.position = CGPoint(x: 100,y: 100)
Box.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: 50,height: 50))
addChild(Box)
}
override func touchesBegan(_ touches: Set<UITouch>,with event: UIEvent?) {
if let touch = touches.first {
let location = touch.location(in: self)
let touchednodes = self.nodes(at: location)
for node in touchednodes.reversed() {
self.currentNode = node
}
}
}
override func touchesMoved(_ touches: Set<UITouch>,with event: UIEvent?) {
if let touch = touches.first,let node = self.currentNode {
let touchLocation = touch.location(in: self)
node.position = touchLocation
}
}
override func touchesEnded(_ touches: Set<UITouch>,with event: UIEvent?) {
self.currentNode = nil
}
override func touchesCancelled(_ touches: Set<UITouch>,with event: UIEvent?) {
self.currentNode = nil
}
}
struct BottomView: View {
var scene: SKScene {
let scene = BottomScene()
scene.size = CGSize(width: 300,height: 300)
}
}
//MARK: - Preview
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。