2015-05-19 3 views
0

У меня есть узел в SKScene, который я перемещаю в соответствии с прикосновением пользователей. В принципе, этот персонаж должен также пытаться следить за пальцем пользователя (предполагая, что палец на экране). Я в настоящее время она реализована в виде так, что работает отлично:Обнаружение длинного касания в наборе спрайтов

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) { 
    let touch = touches.first as! UITouch 
    player.runAction(SKAction.moveTo(touch.locationInNode(self), duration: 1)) 
} 

override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) { 
    let touch = touches.first as! UITouch 
    player.runAction(SKAction.moveTo(touch.locationInNode(self), duration: 1)) 
} 

override func touchesCancelled(touches: Set<NSObject>!, withEvent event: UIEvent!) { 
    player.removeAllActions() 
} 

override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) { 
    player.removeAllActions() 
} 

Однако, проблема заключается в том, что если пользователь держит его/ее палец по телефону. ПрикосновенияBegan вызывается только один раз, и именно тогда начинается крана, а не когда он удерживается. Я хочу, чтобы персонаж персонажа постоянно пытался достичь пальца.

Я сосредотачиваю камеру на узле, так что единственный раз, когда узел должен касаться пальца, - это если пользователь поместил свой палец в/в узле (на той же позиции, что и узел). Из-за этого, после того, как я запустил SKAction для перемещения узла, сенсорный экран недействителен, так как он находится в старой позиции.

Как мне это сделать?

ответ

0

Добавьте две переменные экземпляра в вашем SKScene, BOOL fingerIsTouching и CGPoint touchLocation.

Внутри -touchesBegan:, установите fingerIsTouching в положение «ДА» и обновите touchLocation в правильном месте. В вашем методе SKScene -update: проверьте, есть ли fingerIsTouching ДА и переместите персонаж в соответствии с touchLocation. Я рекомендую использовать -update:, потому что он вызывается один раз за кадр, которого достаточно. Возможно, вам придется использовать какой-либо другой способ перемещения персонажа, чем SKAction.

Не забудьте обновить touchLocation в -touchesMoved: и сброс fingerIsTouching внутри -touchesCancelled: и -touchesEnded: :)

Извините за Obj-C, надеюсь, что это иллюстрирует точку.

+0

Это то, что я закончил делать, хотя немного больше работы, чем я хотел, он отлично работает. – Aaron

3

Вы можете зарегистрировать длинный сенсорный событие так:

let longPressRecognizer = UILongPressGestureRecognizer(target: self, action: "longPressed:") 
self.view.addGestureRecognizer(longPressRecognizer) 

func longPressed(sender: UILongPressGestureRecognizer) { 
    // your code 
} 
+0

Я думал, что это сработает, однако я столкнулся с той же проблемой, что и раньше.Функция действия, вызываемая жестом, вызывается только один раз при каждом перемещении пальца. Поскольку я центрирую узел и перемещая его, до положения касания, изменяется текущая позиция. Поэтому из-за этого узел перестанет следовать за пальцем, потому что он думает, что он достиг положения пальцев, когда на самом деле положение пальцев только что изменилось из-за движения с узла. – Aaron

+0

Хорошая идея того, что я ищу, - это то, как движение работает в приключенческой игре Apples SpriteKit. Я собирался взглянуть на это позже сегодня вечером. – Aaron

1

Для Swift 4:

Вы первый хотите сделать GameSceneUIGestureRecognizerDelegate:

class GameScene: SKScene, UIGestureRecognizerDelegate { 

И поэтому вам также необходимо добавить метод делегата к GameScene класс:

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {   
     return true 
} 

Тогда внутри GameScene «s override func didMove(to view: SKView) { добавить следующее:

let pressed:UILongPressGestureRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(longPress(sender:))) 
pressed.delegate = self 
pressed.minimumPressDuration = 0.1 
view.addGestureRecognizer(pressed) 

Наконец внутри GameScene добавить функцию для обработки длительного нажатия (в течение которого вы можете распознать состояние длительного нажатия слишком):

func longPress(sender: UILongPressGestureRecognizer) { 

    if sender.state == .began { print("LongPress BEGAN detected") }    
    if sender.state == .ended { print("LongPress ENDED detected") } 

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