0

私のコードには次の問題があります。このループはタイマーで実行されています (これは大きなタイマーで実行されているループのほんの一部です)。

その大きなタイマーの中に(彼は1秒ごとに刻みます)5秒待ってから残りのループコードを続行する必要があるメソッドが1つありますが、コードがスタックせず、タイマーが1秒ごとに実行され続けることを望みますそれらの5秒を待ちません。

私がしたこと 5秒ごとに刻む新しいタイマー(timer_deva)を追加し、その内部ですべてのチェックを行った後、タイマーが停止しました。

だから私の問題は、コードを完了するために値を取得するために5秒待つ必要があるということですが、メインタイマーが同時に実行され続ける必要があり、彼が別の時間に結果を取得したときに、彼が残したコードを完了する必要があります後ろに。

前もって感謝します、

else if (mobID.Equals(Convert.ToInt32(txtDeva)))
{
    //START CHECK WITH TIMER
    timer_deva.Start();
    //Methods inside timer_deva update the winnerNation
    //END CHECK TIMER - GET RESULT
    winner(zoneId, winnerNation, humansKills, orcKills);
}
4

1 に答える 1

4

tl;dr

従来のタイマーはゲームでは使用されません。ゲームには、ロジックと経過時間を処理するための非常に異なるメカニズムがあります。

長いバージョン:

これがあなたの質問に直接答えないかもしれないことは知っていますが、コメントに詰め込むには多くのテキストが必要です。タイマーは非常に複雑で階層的に聞こえます。変数名から、ゲームをプログラミングしていると推測できます。ゲームは通常、タイマーで動作しないか、期待どおりに動作しません。この異なるゲームのような動作は、タイマーの問題に大いに役立つだけでなく、一般的な設計にも役立つ可能性があります。

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

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

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

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

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

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

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

于 2013-05-17T10:31:10.277 に答える