Я уверен, что ваши триггерные функции задом наперед
Вот фрагмент кода, который я использую в игре для перемещения по диагонали.
let angle: CGFloat = atan2f(dest.y - self.position.y, dest.x - self.position.x)
Значение y предшествует значению x
Цитата: Raywenderlich.com
Для этой конкретной задачи вместо использования atan() проще использовать функцию atan2(), которая принимает компоненты x и y как отдельные параметры и правильно определяет общий угол поворота.
angle = atan2(opposite, adjacent)
let angle = atan2(playerVelocity.dy, playerVelocity.dx)
playerSprite.zRotation = angle
Обратите внимание, что координата Y идет первой. Распространенной ошибкой является запись atan(x, y), но это не так. Помните, что первый параметр — это противоположная сторона, и в этом случае координата Y лежит напротив угла, который вы пытаетесь измерить.
new Я смог воссоздать вашу проблему, но, изменив код на приведенный ниже, я смог двигаться по диагонали с той же скоростью, что и вверх и вниз
if ((!isDPad && dirPad.up.value > 0.2) || (isDPad && dirPad.up.pressed == true)) { self.upValue = 1 //upValue = gamepad.leftThumbstick.up.value }
if ((!isDPad && dirPad.down.value > 0.2) || (isDPad && dirPad.down.pressed == true)) {
self.downValue = 1
}
if ((!isDPad && dirPad.right.value > 0.2) || (isDPad && dirPad.right.pressed == true)) {
self.rightValue = 1
}
if ((!isDPad && dirPad.left.value > 0.2) || (isDPad && dirPad.left.pressed == true)) {
self.leftValue = 1
}
let speed: Float = 300.0
let xValue = self.rightValue - self.leftValue
let yValue = self.upValue - self.downValue
let length = hypotf(xValue, yValue)
var moveDirection: CGVector?
if length > 0.0 {
let inverseLength = 1 / length
moveDirection = CGVector(dx: CGFloat(xValue * inverseLength * speed), dy: CGFloat(yValue * inverseLength * speed))
}
else {
moveDirection = CGVector(dx: 0, dy: 0)
}
testObject.physicsBody!.velocity = CGVectorMake(0, 0)
testObject.physicsBody!.applyImpulse(direction)
person
Ron Myschuk
schedule
17.06.2016