私は最初のxna 2dゲームで重力をシミュレートしようとしています。私はelapsedAirTime < maxAirTime は、しかし、私のコードは一度だけではなく、複数のスプライトを上に移動すると思われるいくつかの問題がある一方で2dスプライトに重力を追加するXna
//Used for Jumping
double elapsedAirTime = 0.0;
double maxAirTime = 8.35;
//End Jumping
を以下にだから私は一定量でスプライトを上に移動しようとしています持っています時間のこの部分の間に。ここに私の "player.cs"クラスのコード、またはクラスの更新メソッドがあります。
if (newState.IsKeyDown(Keys.Space))
{
if(oldState.IsKeyUp(Keys.Space))
{
//if we are standing or jumping then change the velocity
if (playerState == PlayerStates.Standing)
{
playerState = PlayerStates.Jumping;
this.position.Y -= (float)(30.0 + ((1.2)*elapsedAirTime)*elapsedAirTime);
}
}
}
//if we are jumping give it some time
if (playerState == PlayerStates.Jumping)
{
if ((elapsedAirTime < maxAirTime) && position.Y < 3)
{
this.position.Y -= (float)(30.0 + ((1.2) * elapsedAirTime)*elapsedAirTime);
elapsedAirTime += gameTime.ElapsedGameTime.TotalSeconds;
}
//otherwise time to fall
else
{
playerState = PlayerStates.Falling;
}
}
//add gravity to falling objects
if (playerState == PlayerStates.Falling || playerState == PlayerStates.Standing)
{
//if we are above the ground
if (this.position.Y < windowBot - 110)
{
//chnage state to falling
playerState = PlayerStates.Falling;
this.position.Y += 3.0f + ((float)(gameTime.ElapsedGameTime.TotalSeconds));
}
else
{
playerState = PlayerStates.Standing;
elapsedAirTime = 0.0f;
}
}
ご協力いただきありがとうございます。
なぜtimeScalarを計算して古いゲーム時間を保存するのですか?この更新機能がすべてのゲームループ(それがそうであるべきである)と呼ばれる場合、gt.ElapsedGameTimeはあなたのためにすべての重労働を既にしています。 –
timeScalarを使用する理由は、a)デフォルトのフレームレートを変更する場合、またはb)コンピュータが遅すぎてデフォルトの60 UPS/FPSを使用できない場合です。どちらの場合でも、目標更新レートを下回ると、timeScalarコードなしで遅れているように見えます。 – Darkhydro