13b. ゲームプログラムの超基本骨格
「プログラムを短く判り易く書く」というのも一つのスキルであり、後から見直すにも
ダラダラ長いプログラムよりスマートなプログラムの方が見やすいですね。
「毎回決まって書くもの」は何とか短くかけないでしょうか?
ループ処理をする時にひつようなProcessMessage()、
画面に描写されたものを削除するClearDrawScreen()、
キーボードの入力状態をKey配列に格納するGetHitKeyStateAll( Key )、
描写されたものを画面に反映するScreenFlip()、
の4つの関数は毎回書く必要があります。
後、ループから抜けるために、Escが押されたらブレイクするという処理も必要です。
これらを短く書くことを試みます。
if(0){
処理1;
}
このプログラムにおいて、処理1は実行されません。
if(1){
処理2;
}
このプログラムにおいて、処理2は必ず実行されます。
一方で、反対を意味する「!」を思い出してください。
if(!0){
処理3;
}
このプログラムにおいて、処理3は必ず実行されます。ifの中の条件文は0でなければ真となります。この事を利用しましょう。
ProcessMessage()は0が返って来たとき正常です。
ClearDrawScreen()も0が返って来たとき正常です。
GetHitKeyStateAll( Key )も0が返って来たとき正常です。
Key[KEY_INPUT_ESCAPE]も0の時入力されていません。
つまりこれら全て0じゃ無いときに、終了させたらいいですね。これらを書くと
条件分(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll(
Key ) && !Key[KEY_INPUT_ESCAPE])
こうなります。これらのどれか一つでもエラーが発生したり、ESCが入力されたりすると、条件から外れます。
こうすることでループの条件がスマートになりますね。
ウィンドウモードに変更するためのChangeWindowMode(TRUE)
と
DXライブラリの初期化処理関数DxLib_Init()も毎回書くのでひとまとまりにしてしまいましょう。
ChangeWindowMode(TRUE)はDX_CHANGESCREEN_OKが返ってくると、成功ですので、
DX_CHANGESCREEN_OKが返ってこなかったらreturnすればいいですね。
つまりこういうことです。
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1
) return -1;
以上のことを纏めると以下のようなプログラムになります。
#include "DxLib.h" char Key[256]; int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){ if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //初期化処理 SetDrawScreen( DX_SCREEN_BACK ); //裏画面に設定 while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){ //↑メッセージ処理 ↑画面をクリア ↑キーボード入力状態取得 ↑ESCが押されていない //ココに処理を書いていく ScreenFlip();//裏画面を表画面に反映 } DxLib_End(); return 0; }
実行結果
省略
これはゲームプログラムの基本となるプログラムです。よく覚えておきましょう。
- Remical Soft -