2

することで、ゲームの 1 秒あたりのフレーム数を制限します。

graphics.SynchronizeWithVerticalRetrace = false;
IsFixedTimeStep = false;

しかし、今では私のスプライト/プレーヤーは以前よりも速く動きます。なぜこれを行うのかわかりません。修正方法もわかりません。

if (keyboard.IsKeyDown(Keys.W) || keyboard.IsKeyDown(Keys.Up))
{
    position.Y -= spd;
}
if (keyboard.IsKeyDown(Keys.A) || keyboard.IsKeyDown(Keys.Left))
{
    position.X -= spd;
}
if (keyboard.IsKeyDown(Keys.S) || keyboard.IsKeyDown(Keys.Down))
{
    position.Y += spd;
}
if (keyboard.IsKeyDown(Keys.D) || keyboard.IsKeyDown(Keys.Right))
{
    position.X += spd;
}

それが現在、スプライトを動かす方法です。spd = 4この時点で。まったく問題なく動作しましたが、今では 2000 倍の速さで動いているように見えます。キーの1つをテーピングするだけで、彼は画面から消えます。

ありとあらゆる助けをいただければ幸いです。

4

2 に答える 2

4

固定タイムステップをオフにするときは、動きを制御するために時間デルタを計算に入れる必要があります。例えば:

if (keyboard.IsKeyDown(Keys.W) || keyboard.IsKeyDown(Keys.Up))
{
    position.Y -= spd * gameTime.ElapsedGameTime.TotalSeconds;
}
...

この場合、フレームごとではなく、spdごとの距離に設定します。

于 2012-04-18T00:22:01.773 に答える
4

XNA のゲーム ループは、更新と描画に基づいています。固定時間ステップは更新も参照するため、これを false に設定することで、できるだけ頻繁に更新を呼び出すように指示します。あなたのコードは update 関数にあるため、デフォルトよりも多く呼び出され、1 秒あたり 60 回固定されています。

spd を使用するだけでなく、次のように変更します。

spd * (gameTime.ElapsedGameTime.Milliseconds / 16);

これにより、spd が経過時間によってスケーリングされるように変更されます。16 は、60 fps での更新にかかるミリ秒数 (概算) であり、現在の spd 値です。

編集: Game.cs の一部ではない場合:

移動したいクラスの最新情報を入手してください (私はこれを Ship と呼びますが、何でも構いません)

class Ship
{
  public void Update(GameTime gameTime)
  {
    ...
    position.Y += spd * (gameTime.ElapsedGameTime.Milliseconds / 16);
    ...
  }
  ..
}

次に、Game.cs ファイルで次のようにします。

public override Update(GameTime gameTime)
{
  myShip.Update(gameTime);
  ...
}

myShip は、移動するスプライトのクラスの変数です。update は base メソッドをオーバーライドしなくなったため、base.Update の呼び出しもなくなったことに注意してください。

于 2012-04-18T00:14:11.687 に答える