Я строю игру spriteKit в Xcode 10.2.1 со swift 5, где игрок должен достичь конца большого фона (избегая врагов, препятствий и т. Д.), Чтобы пройти уровень. Камера привязана к позиции игрока spriteNode.x, и игрок может перемещать spriteNode в любом направлении с помощью прокрутки.
Я использую UIPanGestureRecognizer вместе, чтобы включить это движение, и это, кажется, работает достаточно хорошо.
@objc func handlePan(recognizer: UIPanGestureRecognizer) {
let transformerX = 1024/self.view!.frame.size.width
let transformerY = 768/self.view!.frame.size.height
if recognizer.state == .began {
lastSwipeBeginningPoint = recognizer.location(in: self.view)
} else if (recognizer.state == .ended) {
if scrolling { // this is controlls whether player can be moved - scrolling is set to true once introductory elements have run
if playerDamage < 4 { //player cannot be controlled and falls off screen if it has 4 damage
let velocity = recognizer.velocity(in: self.view)
player.physicsBody?.applyImpulse(CGVector(dx: velocity.x * transformerX / 5.4, dy: velocity.y * transformerY * -1 / 5.4)) //-1 inverts y direction so it moves as expected
}
}
}
}
Это позволяет перемещаться по уровню, но не так точно и под контролем, как хотелось бы. Игрок уходит с заданной скоростью, но дальнейшие удары (для изменения направления / избежания препятствий), похоже, увеличивают скорость и, как правило, затрудняют точное управление.
Есть ли способ перекрыть скорость, чтобы она начиналась с заданной скорости, но затем начинала терять импульс, или есть ли вообще лучший способ управления многонаправленным движением?