Перемещение SKSpriteNode по экрану

Я хочу перемещать SKSpriteNode по экрану касанием. У меня проблема в том, что если я фиксирую один спрайт, а затем мой палец перетаскивает его по другому спрайту, первый отпускается, и мой палец начинает перетаскивать второй. Но как только я коснусь первого спрайта, я хочу переместить только его. Должен быть простой способ решить эту проблему?

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    /* Called when a touch begins */
    let touch: UITouch = touches.first as UITouch!
    touchLocation = touch.locationInNode(self)
}

override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
    let touch: UITouch = touches.first as UITouch!
    let newTouchLocation = touch.locationInNode(self)
    let targetNode = self.nodeAtPoint(touchLocation)
    if targetNode.physicsBody!.categoryBitMask != PhysicsCategory.Ball {
    targetNode.runAction(SKAction.moveBy(CGVector(point: newTouchLocation - touchLocation), duration: 0.0))
    touchLocation = newTouchLocation
    }
}

override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
    //I don't do anything with this yet
}

person Pete    schedule 20.09.2015    source источник


Ответы (2)


Это происходит потому, что ваша функция touchesMoved запускается каждый раз, когда ваш палец перемещается, и если ваш палец перемещается по новому узлу, этот узел будет назначен targetNode. Вы можете исправить это, изменив эту строку:

let targetNode = self.nodeAtPoint(touchLocation)

К этому:

let targetNode = self.nodeAtPoint(touch)

Таким образом, узел при первом касании будет тем, который следует за вашим пальцем, а не тем, который был при последнем касании.

person TheCodeComposer    schedule 20.09.2015
comment
Это не работает — невозможно преобразовать значение типа «UITouch» в ожидаемый тип аргумента «CGPoint». - person Pete; 20.09.2015

Благодаря TheCodeComposer я нашел решение:

var targetNode: SKNode!

  override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        /* Called when a touch begins */
        let touch: UITouch = touches.first as UITouch!
        touchLocation = touch.locationInNode(self)
        targetNode = self.nodeAtPoint(touchLocation)
        objectTouched(touch.locationInNode(self))
    }

    override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
        let touch: UITouch = touches.first as UITouch!
        let newTouchLocation = touch.locationInNode(self)
//        let targetNode = self.nodeAtPoint(touchLocation)
        if targetNode.physicsBody!.categoryBitMask != PhysicsCategory.Ball {
        targetNode.runAction(SKAction.moveBy(CGVector(point: newTouchLocation - touchLocation), duration: 0.0))
        touchLocation = newTouchLocation
        }
    }

я только определяю

целевой узел

один раз, а затем продолжайте использовать его вместо переопределения в touchesMoved:

person Pete    schedule 20.09.2015