检测两个独立精灵节点上的触摸

Detect touches on two separate sprite nodes

所以我在这里尝试做的是能够移动四个精灵节点中的两个,彼此独立。我使用枚举来检测触摸了哪张幻灯片,然后使用该信息移动正确的节点,我知道我可以使用节点的名称,但似乎更适合我正在尝试做的事情。到目前为止一切正常,除了我一次只能移动一个节点。我希望能够移动...例如,leftSlide 向上移动,同时 rightSlide 向下移动。

感谢您的任何建议或意见,欢迎任何反馈..

var selectedSlides: [SKSpriteNode] = []
var theSlideTouched: SlideTouched = .nothing

enum SlideTouched
{
    case left
    case right
    case bottom
    case top
    case nothing
}

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
{   
    for touch in touches
    {

        if leftSlide.contains((touch.location(in: self)))
        {
            selectedSlides.append(leftSlide)
            theSlideTouched = .left

        }

        if rightSlide.contains((touch.location(in: self)))
        {
            selectedSlides.append(rightSlide)
            theSlideTouched = .right

        }

        if bottomSlide.contains((touch.location(in: self)))
        {
            selectedSlides.append(bottomSlide)
            theSlideTouched = .bottom
        }

        if topSlide.contains((touch.location(in: self)))
        {
            selectedSlides.append(topSlide)
            theSlideTouched = .top
        }
     }
 }

 override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?)
{
    for touch in touches
    {
        let location = touch.location(in: self)

        switch theSlideTouched
        {
            case .bottom:
                if selectedSlides.contains(bottomSlide)
                {
                    bottomSlide.color = UIColor.white
                    bottomSlide.position.x = location.x
                }
            case .top:
                if selectedSlides.contains(topSlide)
                {
                    topSlide.color = UIColor.white
                    topSlide.position.x = location.x
                }
            case .left:
                if selectedSlides.contains(leftSlide)
                {
                    leftSlide.color = UIColor.white
                    leftSlide.position.y = location.y
                }
            case .right:
                if selectedSlides.contains(rightSlide)
                {
                    rightSlide.color = UIColor.white
                    rightSlide.position.y = location.y
                }
            case .nothing: break
        }
    }

}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?)
{
        switch theSlideTouched
        {
            case .bottom: bottomSlide.color = UIColor.clear
            case .top: topSlide.color = UIColor.clear
            case .left: leftSlide.color = UIColor.clear
            case .right: rightSlide.color = UIColor.clear
            case .nothing: break
        }
            theSlideTouched = .nothing
            selectedSlides.removeAll()
}

我会将滑块对象移动到它们自己的 class 中。这样您就可以独立处理它们的移动,而不会用这些对象弄乱您的 GameScene。现在,当我创建这个示例时,我将对象可视化地放置在整个场景编辑器的 GameScene.sks 文件中,因此如果您在代码中创建这些对象,我的初始化可能与您的不同。

在 GameScene 中...

var topSlide: DragObject!
var rightSlide: DragObject!
var bottomSlide: DragObject!
var leftSlide: DragObject!

override func didMove(to view: SKView) {

    self.view!.isMultipleTouchEnabled = true

    if let topSlide = self.childNode(withName: "topSlide") as? DragObject {
        self.topSlide = topSlide
        topSlide.type = .top
    }

    //if you were to create this in code you could do
    //topSlide = DragObject(color: .red, size: CGSize(width: 100, height: 100)
    //topSlide.type = .top
    //topSlide.position = CGPoint(x: 500, y: 500)
    //topSlide.zPosition = 1
    //addChild(topSlide)

    if let rightSlide = self.childNode(withName: "rightSlide") as? DragObject {
        self.rightSlide = rightSlide
        rightSlide.type = .right
    }

    if let bottomSlide = self.childNode(withName: "bottomSlide") as? DragObject {
        self.bottomSlide = bottomSlide
        bottomSlide.type = .bottom
    }

    if let leftSlide = self.childNode(withName: "leftSlide") as? DragObject {
        self.leftSlide = leftSlide
        leftSlide.type = .left
    }
}

在 DragObject 中 class...

class DragObject: SKSpriteNode {

    enum SlideType {
        case left
        case right
        case bottom
        case top
        case nothing
    }

    var type: SlideType = .nothing

    init(color: SKColor, size: CGSize) {

        super.init(texture: nil, color: color, size: size)

        setup()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)

        setup()
    }

    func setup() {
        self.isUserInteractionEnabled = true
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

    }

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {

        for touch in touches {
            let location = touch.location(in: self.parent!)

            self.color = .white
            if type == .bottom || type == .top {
                position.x = location.x
            }
            else if type == .left || type == .right {
                position.y = location.y
            }
        }
    }

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.color = .red
    }
}