0

経過時間をカウントし、一定の時間が経過したときにアプリケーションに時間ベースのイベントを強制的に実行させるコンソールアプリケーション用の「エンジン」を作成したいと思います。教育目的で (宿題ではなく、私のためだけに) シンプルなテキストベースの戦略ゲームを作成することを考えています。

エンジンを作成しようとしましたが、あまりうまくいきませんでした。アプリケーションなどで現在保留中のアクションを中断する時間ベースのイベントを適用する方法がわかりません。まず、これを作成した方法を次に示します。

#include <stdio.h>
#include <conio.h>
#include <Windows.h>
void _sleep(int t);
int main()
{
int seconds_passed = 0; //counts how much time passed since application started
while(1)
{
    //if(seconds_passed == 100) ... time based action
_sleep(1000);
printf("test");
seconds_passed += 1;
}

return 0;
}


void _sleep(int t) 
{ 
    int i;
    for (i = 0; i < (t/100); i++) 
    { 
        Sleep(100); 
    if (kbhit()!= 0)
        {
            getch();
            break; 
    }
    }
}

私はwindows.hからSleep()に似た関数を作ろうとしましたが、キーが押されたときに遅延を打破する機能を備えていました(私が正しい方法で進んでいるかどうかはわかりません) - ループでは「時間経過」を開始します。しかし、コードの残りの部分から独立させたいので、静かに動作し、コードの残りの部分のアクションを制御します。次のいずれかについて助けが必要です。

-キーボードを使用して_sleep()関数を中断しても、「経過秒数」が自動的に増加しないはずです

-コードで起こっているアクションからタイマーを独立させる方法は? while(1) ループ全体を毎秒中断できるものを作成することを考えました (おそらく、変更された _sleep 関数である可能性があります)。カウンターを増やして、中断したコード部分に戻ります (アプリケーションで scanf() アクションを悪用します)。でも今のところ問題なし)

- select() 関数について聞いたことがありますが、ここで役立つ可能性があります。誰か経験があり、詳細を教えてもらえますか?

4

1 に答える 1

0

これが有用な答えであるかどうかはわかりませんが、基本的なゲームを作成したときに、次のようにマルチスレッド化しました。

  1. ユーザーが何かを行うと、イベントスレッドはメッセージをスレッドセーフなメッセージキューにプッシュします。
  2. 「ゲーム」スレッドは、メッセージキューを読み取り、データを処理し、出力を画面にレンダリングしてから、一定時間スリープします。

このようにして、ゲームロジックと入出力が単純な同期方法で実行されている間にユーザー入力が発生するまで、イベントスレッドはブロックされたままになります。Windowsには、使用できるスレッドライブラリがあります(Linuxでは常にブーストスレッドまたはPOSIXスレッドを使用しているため、まだ使用していません)。

于 2013-01-19T16:01:41.593 に答える