7

私は単純なコンソール ゲームを構築しています。キーを押したときに移動するプレーヤーがあり、自動的に移動する敵があり、各タイプの敵は X ミリ秒で 1 回移動します

私が理解したように、 を使用する必要timerがありますが、ゲームループでそれを行う方法がよくわかりません (タイマーの使用方法がわからないため、まだ構築されていませんが、そうする必要があるwhile loopと思います)。敵がプレイヤーに「触れる」とゲームは終了します (同じ x と y)。

1 つの重要な点: でのこの演習ではできませんがThread、使用する代わりに他の提案があればTimer大歓迎です。

ありがとうございました。

4

2 に答える 2

19

通常、ゲームでは従来のタイマーを使用しません。ゲームには、ロジックと経過時間を処理するための非常に異なるメカニズムがあります。通常、ゲームはタイマーで動作しないか、期待どおりに動作しません。

ゲームには通常、ゲームループと呼ばれるものがあります。一般的に言えば、ループ内で次々に呼び出されるのは 3 つの主要な関数です。

while(running)
{
    HandleUserInput();
    ChangeWorld();
    Render();
}

ユーザー入力を取得し、それに応じてゲームの世界を変更し、それを画面に描画します。コンピューターが高速であるほど、このループの実行速度も速くなります。これはグラフィックス (FPS を考えてください) には適していますが、ゲームには良くありません。フレームごとにブロックが動くテトリスを想像してみてください。より高速なコンピューターを購入したくはありません。そのようにすると、ゲームはより難しくなります。

そのため、コンピューターの処理能力に関係なくゲームの速度を一定に保つために、ループは経過時間を考慮します。

while(running)
{
    var timePassedSinceLastLoop = CalculateTimeDelta();

    HandleUserInput();
    ChangeWorld(timePassedSinceLastLoop);
    Render();
}

ゲーム内の何かのクールダウンを想像してみてください。プレーヤーが「a」を押すと、いくつかのクールなアクションが発生し、再び「a」を押すことはできますが、次の 5 秒間は何も起こりません。ただし、ゲームは引き続き実行され、ゲーム内で発生する可能性のある他のすべてのことを行います。これは従来のタイマーではありません。これは変数で、ActionCooldown と呼びましょう。プレイヤーがアクションをトリガーすると、5 秒に設定されます。世界が変化するたびに、timePassed がゼロになるまでその数値から差し引かれます。ゲームは常に実行され、入力とレンダリングを処理しています。ただし、ActionCooldown がゼロになると、もう一度「a」を押すと、そのアクションが再びトリガーされます。

ChangeWorld メソッドには、ワールドに対するすべての自動変更が含まれます。敵、ミサイル、プレイヤーの介入なしに動くものは何でも。そして、それは時間に基づいて移動します。敵が 1 秒間に 1 マス移動する場合、敵の座標を float にして、ループを実行するたびに 1 分の 1 のマスを追加する必要があります。

30 fps の場合、ループは 1 秒間に 30 回実行されます。敵はループごとに 1/30 の正方形を移動する必要があります。その後、最終的には 1 秒間に 1 マス移動することになります。

于 2013-07-03T06:06:02.623 に答える
1

タイマーの背後にある一般的な前提は、n ごとにコードを繰り返すことです。

タイマーを作成するには、これを使用します。

 System.Timers.Timer aTimer = new System.Timers.Timer();
         aTimer.Elapsed+=new ElapsedEventHandler(OnTimedEvent);
         // Set the Interval to 1 millisecond.  Note: Time is set in Milliseconds
         aTimer.Interval=1;
         aTimer.Enabled=true;

次に、このメソッドを実装します。

private static void OnTimedEvent(object source, ElapsedEventArgs e)
     {
        //Whatever you need repeated
     }

完全な例は、http: //msdn.microsoft.com/en-us/library/system.timers.timer (v=vs.71).aspx にあります。

于 2013-07-03T05:53:16.333 に答える