2015-11-22 5 views
1

Im программирование игры на основе SpriteKit в Swift. SKScene содержит SKSpriteNode, который содержит SKShapeNodes. Одна из этих фигур - «игрок». Пользователь должен уметь перетащить плеер. Я реализовал различные методы, чтобы получить этого рабочего пользователя. touchesBegan, touchsMoved, touchsCanceled и касается Ended. В принципе, все работает нормально, пока пользователь перетаскивает «плеер» с нормальной скоростью. Но если пользователь перетаскивает «плеер» действительно быстро touchsMoved метод не вызывается достаточно часто. Я подумал, что это возможно из-за того, что я использую SKShapeNodes, но на основе вывода (ниже), который, похоже, не так.SpriteKit - touchsMoved не называется достаточно часто - быстрое движение

Код:

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

let touchLocation = touches.first!.locationInNode(self) 
if(self.player.containsPoint(touchLocation)){ 
    self.startedTouchingPlayer() 
} 
super.touchesBegan(touches, withEvent: event) 
print("TOUCHES BEGAN") 

} 

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

let touchLocation = touches.first!.locationInNode(self) 
if(self.player.containsPoint(touchLocation)){ 
    self.isTouchingPlayer(touchLocation) 
    print("TOUCHES MOVED \(touchLocation)") 
} 
super.touchesMoved(touches, withEvent: event) 

} 

override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) { 

self.endedTouchingHelper() 
super.touchesEnded(touches, withEvent: event) 
print("TOUCHES ENDED") 

} 

override func touchesCancelled(touches: Set<UITouch>?, withEvent event: UIEvent?) { 

print("TOUCHES CANCELED") 
self.endedTouchingHelper() 
super.touchesCancelled(touches, withEvent: event) 

} 

Печать заявления:

Нормальное движение:

TOUCHES BEGAN 
TOUCHES MOVED (-4.0, -241.499984741211) 
TOUCHES MOVED (0.500015258789062, -239.0) 
TOUCHES MOVED (4.0, -237.000015258789) 
TOUCHES MOVED (11.0, -234.0) 
TOUCHES MOVED (19.5, -229.499984741211) 
TOUCHES MOVED (27.0000152587891, -225.499984741211) 
TOUCHES MOVED (34.0, -221.499984741211) 
TOUCHES MOVED (41.0, -217.499984741211) 
TOUCHES MOVED (48.0, -213.499984741211) 
TOUCHES MOVED (53.4999847412109, -210.0) 
... 
TOUCHES MOVED (77.5, -177.000015258789) 
TOUCHES MOVED (77.5, -178.0) 
TOUCHES ENDED 

Быстрое движение:

TOUCHES BEGAN 
TOUCHES MOVED (6.5, -277.5) 
TOUCHES MOVED (3.0, -261.000030517578) 
[*** at this point the finger is at a different position as the "player" ***] TOUCHES ENDED 

Любой вид помощи ценится. Благодарю.

ответ

2

Darvydas указал мне в правильном направлении, и я смог решить эту проблему:

Проблема заключалась не в том, как я переехал игрока вокруг него была эта линия в touchesMoved:

if(self.player.containsPoint(touchLocation)) 

Когда пользователь перемещает действительно быстро touchLocation не внутри плеера (потому что позиция не может быть обновлен что быстро). Я изменил условие в инструкции, чтобы он просто проверял, перетаскивается ли игрок (или его можно перетащить).

  1. touchesBegan устанавливает логическое значение истина, чтобы указать, что игрок получил прикоснулся
  2. touchesMoved всегда обновляет позиции игроков (независимо от того, где произошло прикосновение) до тех пор, как BOOL истинно
  3. touchesEnded задает логическое значение to false

Спасибо.

+0

Мне нужно подождать два дня, чтобы принять мой ответ .... – eaglelynxbeaver

3

Вы не указали, как вы перемещаете свой плеер, поэтому я предполагаю, что вы просто изменили положение своего игрока. Я бы рекомендовал вам использовать SKAction s для перемещения вашего плеера.

func moveToPosition(oldPosition: CGPoint, newPosition: CGPoint) { 

    let xDistance = fabs(oldPosition.x - newPosition.x) 
    let yDistance = fabs(oldPosition.y - newPosition.y) 
    let distance = sqrt(xDistance * xDistance + yDistance * yDistance) 
    let sceneDiagonal = sqrt(world.frame.size.width * world.frame.size.width + world.frame.size.height * world.frame.size.height) 

    self.runAction(SKAction.moveTo(newPosition, duration: Double(distance/sceneDiagonal/2))) 
} 

мир - SKNode точно, такого же размера, как ваш SKScene

И использовать его как это: touchesMoved:

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

let touchLocation = touches.first!.locationInNode(self) 
if(self.player.containsPoint(touchLocation)){ 
    moveToPosition(self.player.position, newPosition: touchLocation) 
} 
+0

Я меняю положение узлов вручную. Попробуй свой подход. Благодарю. – eaglelynxbeaver