34. メイン関数の書き方。


メイン関数の書き方に別に決まりはありませんが、メイン関数には各種関数に渡す分配の処理だけを書くのがよいでしょう。

処理がごちゃごちゃにならないように、メイン関数はなるべくシンプルにします。

function_statusというどの関数に処理を渡せばいいかのフラグを作り、そこに整数値を代入する事で

関数へ処理を渡す判定をしましょう。function_statusが

0の時は、オープニングに関する関数へ、
1の時は、メニュー画面に関する関数へ、
2の時は、キャラがダンジョンにいるときに処理する関数へ、
3の時は、戦闘シーンを処理する関数へ、
4の時は、エンディングを処理する関数へ、

という具合にfunction_statusでどの関数に処理を渡せばいいかを判定します。

サンプルでは、各種場面で処理をする関数を多数用意し、function_statusによってメイン関数から

どの関数に渡すか判定しています。始めはfunction_statusは0で、指示に従ってキー入力するにしたがって

function_statusが変化していきます。変化するごとに、どの関数に処理を渡すかが変化していきます。


#include "DxLib.h"
 
int function_status=0,White;
char KeyBuf[ 256 ] ;
 
void Opening(){
        DrawString(100,100,"オープニング画面 (zをプッシュ)",White);
        if(KeyBuf[KEY_INPUT_Z]==1)
                function_status=1;
}
 
void Menu(){
        DrawString(100,140,"メニュー画面 (xをプッシュ)",White);
        if(KeyBuf[KEY_INPUT_X]==1)
                function_status=2;
}
 
void Danjon(){
        DrawString(100,180,"ダンジョン画面 (cをプッシュ)",White);
        if(KeyBuf[KEY_INPUT_C]==1)
                function_status=3;
}
 
void attack(){
        DrawString(100,220,"戦闘画面 (vをプッシュ)",White);
        if(KeyBuf[KEY_INPUT_V]==1)
                function_status=4;
}
 
void Ending(){
        DrawString(100,260,"エンディング画面 (bをプッシュ)",White);
        if(KeyBuf[KEY_INPUT_B]==1)
                function_status=5;
}
 
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        ChangeWindowMode( TRUE ) ;                                   //ウィンドウモードに変更
        if( DxLib_Init() == -1 ) return -1;                      // DXライブラリ初期化処理 エラーが起きたら終了 
         
        White = GetColor( 255 , 255 , 255 ) ;                    //色の取得
          
        SetDrawScreen( DX_SCREEN_BACK ) ;                                // 描画先を裏画面に設定
           
        while( 1 ){
                ClearDrawScreen();                                                               // 裏画面のデータを全て削除
                GetHitKeyStateAll( KeyBuf ) ;                                    // すべてのキーの状態を得る
 
                switch(function_status){
                        case 0:
                                Opening();
                                break;
                        case 1:
                                Menu();
                                break;
                        case 2:
                                Danjon();
                                break;
                        case 3:
                                attack();
                                break;
                        case 4:
                                Ending();
                                break;
                        default:
                                DxLib_End() ;                                // DXライブラリ使用の終了処理
                                return 0;
                                break;
                }
 
                if( ProcessMessage() == -1 ) break ;                 //エラーが起きたら終了
                
                ScreenFlip() ;                                   // 裏画面データを表画面へ反映
        }
 
        DxLib_End() ;                                            // DXライブラリ使用の終了処理
        return 0 ;                                               // ソフトの終了
}

実行結果 (例)

→掲示板で質問する



- Remical Soft -