2012-04-18 9 views
2

私のゲームでは、毎秒フレームを無制限にしています。フレームレートを無制限にしたあと、スプライトの動きが速すぎる

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つをタップするだけで、彼は画面から離れる。

何かすべてのヘルプは高く評価されます。

+3

フレームレート独立コード – bkconrad

+0

@bkconradを書く魅力的な理由:OPが一度も試みたことがない、おそらく概念を聞いたことがないことは明らかです。 –

+0

-1このようなことを尋ねる前に、基本的なチュートリアルを完了して理解してください。また、簡単な検索で回答とその他の追加情報が提供されていました。 – Elideb

答えて

4

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

だけではなくSPDを使用して、

SPDは、経過時間によってスケーリングされるように変更されます
spd * (gameTime.ElapsedGameTime.Milliseconds/16); 

に変更。 16は、現在のspd値で動作している60 fps(約)で更新がかかるミリ秒数です。

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

持っているあなたが移動することに興味がある(イム船、それを呼び出すために行くが、それはあなたが望む何でもかまいません)

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は、移動したいスプライトのクラスの変数であること。ノート更新は基本メソッドをオーバーライドしなくなりました。したがって、base.Updateへの呼び出しもなくなりました。

+0

エラーが発生します。 'int'と 'System.TimeSpan'のオペランドに演算子 '/'を適用することはできません –

+0

私が考える前に書いたものは何ですか?申し訳ありませんが、次のようになります: spd *(gameTime.ElapsedGameTime.Milliseconds/16); – Venatu

+1

ven、代わりに:) [編集] – sarnold

4

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

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

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

+0

'spd'に' TotalSeconds'を掛け合わせると、整数ラップアラウンドのリスクはありますか? – sarnold

+0

@sarnold:なしあなたは 'ダブル 'を得る。 –

+0

優秀!ありがとう。 – sarnold

関連する問題