Перемещение skspritenode с помощью игрового контроллера (ThumbStick) Swift

Я пытаюсь построить 2D-игру сверху вниз, и у меня есть игрок (skspritenode), и я хочу переместить его, когда использую джойстик. Я использую этот код:

геймпад его GCExtendedGamepad

if gamepad.leftThumbstick.xAxis.value > 0.1 || gamepad.leftThumbstick.xAxis.value < -0.1 || gamepad.leftThumbstick.yAxis.value > 0.1 || gamepad.leftThumbstick.yAxis.value < -0.1
{
    self.player.moveAndRotate(gamepad.leftThumbstick.xAxis.value, yValue: gamepad.leftThumbstick.yAxis.value)
}

moveAndRotate - функция

func moveAndRotate(xValue: Float, yValue: Float)
{
    zRotation = CGFloat(-atan2(xValue, yValue))

    physicsBody!.velocity = CGVectorMake(0, 0)
    physicsBody!.applyImpulse(CGVectorMake(CGFloat(xValue) * moveSpeed, CGFloat(yValue) * moveSpeed))
}

Но, когда игрок движется по диагонали, его скорость выше обычной скорости. Может кто-нибудь помочь мне?


person Sqweelow    schedule 17.06.2016    source источник


Ответы (1)


Я уверен, что ваши триггерные функции задом наперед

Вот фрагмент кода, который я использую в игре для перемещения по диагонали.

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
comment
Спасибо вам за эту информацию! Но, я спрашиваю, как двигать мой плеер с той же скоростью :) - person Sqweelow; 17.06.2016