2017-06-07 6 views
1

私のゲームのステアリング機構として加速度計を使用しています。それは通常正常に動作しますが、ときどき非常に奇妙に動作します。突然大量の入力遅延があり、しばらくの間は1回転ごとに登録されません。いくつかのケースでは、お互いの直後に入力されたコマンドの間に多くの遅延があり、私のキャラクターが一方向にあまりに長くずれることにつながります。これはゲームの遅れに起因するのですか、または私のコードが間違っていますか?下の私のコード。加速度計を使用する正しい方法

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

     }) 

    } 

答えて

1

加速度計を使用して、0.1秒(あなたCMMotionManagerインスタンスのdeviceMotionUpdateIntervalプロパティが0.1に設定されていると仮定して)の定期的な間隔で更新されます与えることを保証していません。離散的な時間間隔ですべてのアクションが実行されると、SKActionsは正常に動作します。しかし、加速度計は不規則な間隔の更新を提供するので、同時に多くのアクションを実行することになります。そのため

簡単な修正は前のアクション毎回削除するには、次のようになります。

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

をしかし、動きはまだスムーズに見ていないので、私はまだ、このアプローチを使用することをお勧めしませんが、それがどのように見えますあなたの船は不気味に動いています。 SKPhysicsBodyを使用し、そのの速度プロパティを直接操作することをお勧めします。このような何か:

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

あなたは自分のカスタム関数を使用して物理学を扱うているので、あなたが物理学のボディを使用したくない場合は、私はすべてのフレームで、手動で船の位置を計算することをお勧めします。

関連する問題