2

私は自分のゲームで次のようなジャンプメカニズムを作成しようとしています。

//velocity.Yはジャンプしたいスプライトの速度です

 if (keystate.IsKeyDown(Keys.W))
         {
             velocity.Y = 3 - (time elapsed since start of jump);
         }

これは私のスプライトをジャンプさせるためのシンプルでエレガントな解決策かもしれないと思いましたが、このようにそれが不可能な場合は、そう言うだけで、それは製図板に戻ります。

4

3 に答える 3

1

物理をプレイヤー入力に直接接続しないことをお勧めします。これはあまり拡張可能なアーキテクチャではありません。

キャラクター オブジェクトによって実装される速度などの物理プロパティを定義するインターフェイスを用意します。プレイヤーがアップキーを押したとき、プレイヤーが地面にいるかどうか、そして上に移動するように加速度が設定されているかどうかを確認する必要があります。次に、エンティティを移動する前に、重力やその他の力を適用する物理インターフェイスを実装するすべてのオブジェクトのリストを物理システムに繰り返し処理させます。このようにして、ゲーム内のすべてのエンティティに同じ物理コードを使用できます。

また、キーボード入力をプレーヤーの動きに直接接続しないことをお勧めします。ジャンプや移動など、キャラクターが実行できるさまざまなアクションを定義する「CharacterInstructions」を返す「nextInstruction」メソッドを定義する「ICharacterController」というインターフェイスを使用できます。これは、入力クラスによって実装できます。次に、キャラクター クラスは CharacterController への参照を保持するため、nextInstruction を呼び出すだけです。このようにして、プレイヤー入力、AI、またはネットワーク通信を介してキャラクターを制御できますが、プレイヤーと同じ動作を共有できます。

Game Coding Completeは、ゲーム プログラミングに真剣に取り組んでいる場合に読むべきすばらしい本です。

Game Engine Architectureもお勧めできます

XNA を使用しているため、ゲーム コンポーネントの使用を検討する必要があります。

于 2012-11-10T21:49:36.603 に答える
0

XNA には、プレスとプレス アンド ホールドを検出する組み込みのメソッドがありません。キーが現在押されているかどうかしかわかりません。

次に、「Old」と「Current」の 2 つの KeyboardState を保存する必要があります。これがあれば、キープレスの開始時 ( old.isKeyDown == false && current.isKeyDown == true;) と終了時( ) を検出できます。old.isKeyDown == true && current.isKeyDown == false;

したがって、これを取得したら、キープレスを検出したときの GameTime に基づいて「jumpStart」変数を記録し、キーリリースを検出したときから「jumpEnd」変数を記録するのは簡単なことです。

キーを押している時間に基づいてジャンプの持続時間を決めたい場合は、上限を設定したほうがよいかもしれません。

于 2012-11-10T21:28:00.190 に答える
0

つまり、ボタンを押したまま速度関数が実行されている場合は、探しているものではありませんが、ストップワスを使用してそれを測定できます

Stopwatch stopWatch = new Stopwatch();
 if (keystate.IsKeyDown(Keys.W))
         {
             velocity.Y = 3 - (time elapsed since start of jump);
             stopWatch.Start();
         }
 if (keystate.IsKeyUp(Keys.W))
{
         stopWatch.Stop();
        TimeSpan ts = stopWatch.Elapsed;

}

詳細はこちら

http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-2

于 2012-11-10T21:28:18.037 に答える