2015-09-20 5 views
0

Я хочу перемещать 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 
} 

ответ

1

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

let targetNode = self.nodeAtPoint(touchLocation) 

Для этого:

let targetNode = self.nodeAtPoint(touch) 

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

+0

Это не работает - «Невозможно преобразовать значение типа« UITouch »в ожидаемый тип аргумента« CGPoint »» – Pete

1

Благодаря 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 
     } 
    } 

Я только определить

targetNode

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

Смежные вопросы