问题描述
情况:
在 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 (将#修改为@)