2015-07-30 3 views
0

В моей игре у меня есть узел внизу экрана, который id любит перемещаться вдоль оси x, используя touch. Я бы хотел, чтобы мой узел двигался влево или вправо в зависимости от направления перетаскивания, а также перемещался на том же расстоянии, что и перетаскивание. Поэтому, если пользователь перетащит слева направо (CGPoint(x: 200, y: 500) на CGPoint(x:300, y: 500)), узел переместит 100 вправо. Это то, что я пытался сделать, но это не сработало. Если у кого есть способ исправить это я действительно ценю этодвижущийся спрайт, основанный на длине/направлении перетаскивания

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) { 

     let touch = touches.first as! UITouch 
     let touchLocation = touch.locationInNode(self) 
     firstTouch = touchLocation 

override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) { 
     let touch = touches.first as! UITouch 
     let touchLocation = touch.locationInNode(self) 
     secondTouch = touchLocation 

     if gameStarted { 

      let change = secondTouch.x - firstTouch.x 
      let move = SKAction.moveToX(greenGuy.position.x + change, duration: 0.1) 

      greenGuy.runAction(move)  
    } 
} 
+0

вместо 'moveToX' использовать' moveByX' – aramusss

ответ

1

Обновление touchesMoved со следующим кодом:

let touch = touches.first as! UITouch 
let touchLocation = touch.locationInNode(self) 
secondTouch = touchLocation 

if gameStarted { 
    let change = secondTouch.x - firstTouch.x 
    //Update greenGuys position 
    greenGuy.position = CGPoint(x: greenGuy.position.x + change, y:greenGuy.position.y) 
    //Update the firstTouch 
    firstTouch = secondTouch 
} 

Причина не используется SKAction, как я заметил, прежде чем потому, что мы не Не знаю, сколько времени пройдет между двумя вызовами метода touchesMoved, поэтому мы точно не знаем, какое время ввести в SKAction duration.

+0

да это сработало спасибо! –

0

У вас очень хорошее начало. Во-первых, изменение:

let move = SKAction.moveToX(greenGuy.position.x + change, duration: 0.1) 

к:

let move = SKAction.moveByX(greenGuy.position.x + changeInX, duration: moveDuration) 

Если вы хотите 2-мерное движение, используйте SKActionmoveByX:ChangeInX y:ChangeInY duration:moveDuration вместо этого. Теперь у вас есть еще несколько переменных, которые основаны на длительности/расстоянии от салфетки. Продолжительность, которую вы выберете для moveDuration, будет зависеть от вас, и это будет продукт некоторого коэффициента и расстояния прохождения.

Чтобы получить расстояние между проходами: Идентификатор советует вам использовать метод касания и использовать UIGestureRecognizer. Тот, который вам нужен, - UIPanGestureRecognizer. Вот полезная ссылка с описанием ее использования: UISwipeGestureRecognizer Swipe length. По существу он имеет разные состояния, которые устанавливаются, когда пользователь запускает или завершает движение салфетки/перетаскивания. Затем вы можете взять locationInView в эти моменты и рассчитать расстояние между ними: D

Надеюсь, я помог. Я знаю, что touchsMoved - это также способ сделать это, но у меня были проблемы с ним в прошлом (ненужное отставание и неопределенность), а распознаватели жеста гораздо более интуитивно понятны и понятны в использовании.

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