使用游戏控制器(ThumbStick)Swift移动skspritenode

时间:2016-06-17 02:22:35

标签: swift sprite-kit gamecontroller

我尝试建立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 - function

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))
}

但是,当玩家按对角线移动时,他的速度比正常速度快。任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:1)

我确信你的触发功能是向后的

以下是我在游戏中使用对角线移动的代码片段。

let angle: CGFloat = atan2f(dest.y - self.position.y, dest.x - self.position.x)

y值出现在x值

之前

引自Raywenderlich.com

对于这个特定的问题,使用函数atan2()代替使用atan(),它将x和y分量作为单独的参数,并正确地确定整体旋转角度。

angle = atan2(opposite, adjacent)

let angle = atan2(playerVelocity.dy, playerVelocity.dx)
playerSprite.zRotation = angle

请注意Y坐标先行。一个常见的错误是写atan(x,y),但这是错误的方法。请记住,第一个参数是相反的一侧,在这种情况下,Y坐标与您尝试测量的角度相反。

我能够重新创建你的问题,但是通过将代码更改为下面我可以使对角线移动速度与上下相同

if((!isDPad&amp;&amp; dirPad.up.value&gt; 0.2)||(isDPad&amp;&amp; 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)