「Windows のコマンドプロンプト上で動くゲーム」のC言語スケルトンコード
教育用の覚書(のつもり)。「イベントドリブン」と「(画面の再描画のための)一定間隔での動作」をやらせるための Windows 用コンソールプログラムの骨格として試作したもの。ANSI C の標準ではない関数 kbhit(), getch() と windows.h の Sleep() を利用している。
- 「迫りくるインベーダー」の描画
およそ 1000[msec] (= sleepDuration_msec × sleepEventCounterMax ) で timerEventProc() が走るので、ここで記述。 - 「ビームの発射」「ビームの軌跡」などの描画
kbhit() で keyEventProc() が走るので、ここで記述 - 時間の測定
適宜、sleepEvent()を呼ぶ。これを1回呼ぶ毎に「 10[msec] 経過」とみなす。各関数でのデータ処理、描画処理などの時間は勘定に入れてない。
#include <conio.h> #include <windows.h> int sleepDuration_msec=10 ,sleepEventCounter=0 ,sleepEventCounterMax=100 ,exitFlag=1 ; int checkExitCond (void); int checkTimer (void); void exitProc(void); void initProc (void); void keyEventProc (int keyData); void sleepEvent (void); void timerEventProc (void); int main(void) { initProc(); while ( checkExitCond() ) { if ( kbhit() ) { keyEventProc(getch()); } else { if ( checkTimer() ) { timerEventProc(); } sleepEvent(); } } exitProc(); } void initProc (void) { // プログラム開始時の処理をここに書く } int checkExitCond (void) { if ( exitFlag ) { // プログラム終了判定の処理をここに書く } // 「終了」なら exitFlag=0; とする。 return exitFlag; } void keyEventProc (int keyData) { switch ( keyData ) { case 27: // 'ESC' exitFlag= 0; // ESCが押されたら「終了」 break; //case X: // ASCIIコード X のキーが押されたときの処理をここに書く // break; default: break; } } int checkTimer (void) { int timerFlag=0; if ( sleepEventCounter > sleepEventCounterMax ) { sleepEventCounter= 1; timerFlag= 1; } return timerFlag; } void timerEventProc (void) { // 定時の処理(画面の再描画など)をここに書く } void sleepEvent (void) { Sleep(sleepDuration_msec); sleepEventCounter++; } void exitProc (void) { // プログラム終了時の処理をここに書く }