微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

是否可以将 SpriteKit 节点从一个 SKScene 拖放到另一个 SKScene?

如何解决是否可以将 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 举报,一经查实,本站将立刻删除。