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 -