2017-06-07 1 views
1

Ich benutze den Beschleunigungsmesser als Lenkmechanismus für mein Spiel. Es funktioniert in der Regel gut, aber gelegentlich wird es sehr merkwürdig wirken. Zufällig gibt es plötzlich eine große Menge an Eingangsverzögerung und jede Rotation, die ich mache, ist für eine Weile nicht registriert. In einigen Fällen kann es zu einer großen Verzögerung zwischen den direkt nacheinander eingegebenen Befehlen kommen, was dazu führt, dass mein Charakter viel zu lange in eine Richtung driftet. Liegt das an Spielverzögerung oder ist mein Code fehlerhaft? Mein Code unten.Korrekter Weg zur Verwendung von Beschleunigungsmesser

actionMoveLeft = SKAction.moveBy(x: -3, y: 0, duration: 0.1) 
    actionMoveRight = SKAction.moveBy(x: 3, y: 0, duration: 0.1) 
    self.addChild(ship) 
    if motionManager.isAccelerometerAvailable == true { 
     motionManager.startAccelerometerUpdates(to: OperationQueue.current!, withHandler:{ 
      data, error in 
      if (data!.acceleration.y) < -0.05 { 
       self.ship.run(self.actionMoveLeft) 
      } 

      else if data!.acceleration.y > 0.05 { 
       self.ship.run(self.actionMoveRight) 
      } 

     }) 

    } 

Antwort

1

Es ist nicht garantiert, dass das Beschleunigungsmesser Mehr regelmäßigen Abstände von 0,1 Sekunden geben wird (unter der Annahme, dass das deviceMotionUpdateInterval Eigentum Ihrer CMMotionManager Instanz auf 0,1 eingestellt ist). SKActions funktionieren gut, wenn jede Aktion in einem bestimmten Zeitintervall ausgeführt wird. Da der Beschleunigungssensor jedoch unregelmäßige Intervallaktualisierungen liefert, können Sie am Ende mehr Aktionen gleichzeitig ausführen.

Eine einfache Lösung für das wäre die vorherige Aktion jedes Mal zu entfernen:

if (data!.acceleration.y) < -0.05 { 
    self.ship.removeAction(forKey: "Move") 
    self.ship.run(self.actionMoveLeft, withKey: "Move") 
} 

Aber ich empfehle immer noch nicht, diesen Ansatz zu verwenden, da die Bewegung immer noch nicht glatt aussehen, aber es sieht aus wie Dein Schiff bewegt sich ruckartig. Ich schlage vor, eine SKPhysicsBody zu verwenden und seine Geschwindigkeit Eigenschaft direkt zu manipulieren. Etwas wie folgt aus:

// Inside the update method, assuming you have saved the acceleration vector 
// and you have a deltaTime variable that holds the difference of time 
// elapsed from the previous update 
self.ship.physicsBody.velocity = CGVector(dx: self.ship.physicsBody.velocity.dx + CGFloat(acceleration.x * deltaTime), dy: self.ship.physicsBody.velocity.dy + CGFloat(acceleration.y * deltaTime))  

Wenn Sie keine Physik Körper verwenden möchten, weil Sie nur Physik mit Ihrer benutzerdefinierten Funktionen Handhabung, dann schlage ich vor, die Position des Schiffes bei jedem Rahmen manuell zu berechnen.

Verwandte Themen