2016-06-17 8 views
1

Ich versuche, 2d - Top-Down-Spiel zu bauen, und ich habe Spieler (Skspritenode) und ich möchte ihn bewegen, wenn ich den Daumen drücken. Ich benutze diesen Code:Moving skspritenode mit Game Controller (ThumbStick) Swift

Gamepad seine 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 - Funktion

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

Aber, wenn der Spieler bewegt sich durch diagonale, seine Geschwindigkeit schneller als die normale Geschwindigkeit. Kann mir jemand helfen?

Antwort

1

Ich bin sicher, dass Ihre trigonometrischen Funktionen rückwärts

Hier sind Code-Snippet ich in einem Spiel verwenden diagonal zu bewegen.

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

Der y-Wert kommt, bevor der X-Wert

von Raywenderlich.com Zitiert

Für dieses spezifische Problem, anstelle der Verwendung von atan(), ist es die Funktion simplier atan2() zu verwenden , die die x- und y-Komponenten als separate Parameter verwendet und den gesamten Drehwinkel korrekt bestimmt.

Beachten Sie, dass die Y-Koordinate zuerst geht. Ein häufiger Fehler ist, atan (x, y) zu schreiben, aber das ist falsch herum. Denken Sie daran, dass der erste Parameter die entgegengesetzte Seite ist. In diesem Fall liegt die Y-Koordinate dem Winkel gegenüber, den Sie messen möchten.

neue konnte ich das Problem neu erstellen, sondern durch den Code der unten Ändern konnte ich diagonal bewegen eine der gleichen Geschwindigkeit haben, wie oben und unten

if ((! IsDPad & & dirPad.up.value> 0,2) || (isDPad & & dirPad.up.pressed == true)) { self.upValue = 1 // aufzuwerten = 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) 
+0

Vielen Dank für diese Information! Aber, ich frage, wie man meinen Spieler mit der gleichen Geschwindigkeit bewegt :) – DonMugad

+0

überprüfen Sie meine Bearbeitungen –

+0

Vielen Dank! – DonMugad