素人プログラマーの日常

効率の良いコード、美しいコードなんて書けません。

クォータービューワ完成

さあ!待ちに待ったお披露目です!

って、誰も待ってませんよね…。
そう!作った本人も使うかわからないツール。クォータービューワ!

好いんです。これは自己満足です。私の微妙なスキルアップと達成感のために作ったものです。それは自覚しているので、このツールに過度な期待は更々ありません。なのでサンプルの地形画像もかなり手を抜いてます。

とは言いつつ、作りたかったものでもあります。古い話になりますが、私はスーファミタクティクスオウガというゲームが好きです。このゲーム、私の中では今でも1番といっていいくらい良く出来ています。シナリオ・グラフィック・サウンド・バトルシステム・詳細設定などなど、すべてが当時の最高クオリティで、今も尚(私の中では)色褪せていません。ちょっとタクティクスオウガのディープな話をしたくなってきましたが、長くなりそうなので控えておきます(笑)。そのタクティクスオウガがクォータービューだったんです。それまでにもクォータービューはありましたが、しっかりと地形の高さが表現されて立体的な造型として描画されているものはなかっただけに、衝撃的でしたね。コナミスクウェアもこのタクティクスオウガを真似てシミュレーションRPGを作ったくらいです。

こんなことからクォータービューを一度作っておきたかった。それだけです。今回はゲームとしてではなくツールなので、物足りないといえば物足りないですが、一応願望のひとつを達成ということにしておきます。

↓こちらのページからダウンロードできます。
http://tenkomorituuhan2.com/products/isometricviewer/top.html



さて、ソースコードですが、今回も公開しますよ。慣れた人なら2~3日で書けるようなコードですが、1ヶ月かかりました。もっとスピードアップしないとですね。ところどころ意味不明なことをしているかもしれませんが、ツッコミは優しくお願いします。

※素人の書いたコードです。無闇にコピペして実行すると、PCが踊り狂うこともあるかもしれません。知識のある人が確認した上で使用してください。
※配列定義の空(から)のカッコがhtmlを通すと何故か消えます。<pre>タグで表示できますが、それだとサイドバーを侵食するので、苦肉の策としてスペースを挿入。[ ]←このカッコ。はてな記法とかで使用してるんですかね~。

 

#include <string.h>
#include "DxLib.h"

const int wX = 640;        //ウインドウサイズ
const int wY = 480;


int landD[20][20];        //地形データ種類
int landH[20][20];        //地形データ高さ
int landO[20][20];        //地形データオブジェ種類

int Gland[64];        //地形画像読込み用ハンドル
int Gobje[64];        //オブジェ画像読込み用ハンドル

char landPath[ MAX_PATH ] = "img/land.png";    //地形画像パス
char objePath[ MAX_PATH ] = "img/obje.png";        //オブジェ画像パス
char crDir[ MAX_PATH ];    //作業フォルダパス

//地形編集時
int key[26];                //各キー
int keyinput[26];            //各キーの押下状態
int para[ ] = { 50,50,50,50,10,50,50,50,0,0,0,0,0 };            //各パラメータ
int paramax[ ] = { 100,100,100,100,100,100,200,200,9,30,9,9,9 }; //パラメータ最大値

//初期化時
int key2[30];
int keyinput2[30];
int para2[ ] = { 10,10,1,64,256,10,10,1,64,64,10,10,64,224,255 };
int paramax2[ ] = { 64,64,64,128,256,64,64,64,128,256,20,20,255,255,255 };
int paramin2[ ] = { 1,1,1,16,16,1,1,1,16,16,2,2,0,0,0 };    //パラメータ最小値

int totalFlag;
int drawparaflag;        //パラメータ描画フラグ

//プロトタイプ宣言

void Edit();            //地形編集
void Initialize();        //初期化
void DrawLand();    //地形描画
void DrawInit();    //初期化画面描画
void ImageFile( int IFlag );    //画像読込
void Save();            //データ書込み
void Load();            //データ読込み


//WinMain
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        LPSTR lpCmdLine, int nCmdShow )
{
    SetOutApplicationLogValidFlag( FALSE );    //ログ出力しない
    SetMainWindowText( "Isometric Viewer" );        //ウインドウタイトル指定
    SetGraphMode( wX , wY , 32 );            //ウインドウの大きさとカラービット数指定
    ChangeWindowMode( TRUE );                //ウインドウで表示
    SetDrawScreen( DX_SCREEN_BACK );    //ちらつき防止設定
    SetWaitVSyncFlag( TRUE );                    //フレーム同期
    SetMouseDispFlag( TRUE );                    //マウスカーソル表示
    SetWindowUserCloseEnableFlag( FALSE );    //×ボタンで終了しない

    if( DxLib_Init() == -1 ) return -1;

    GetCurrentDirectory( MAX_PATH , crDir );

    //初期設定
    //キーの割り当て(地形編集時)
    key[0] = KEY_INPUT_Q;    //X軸増加時のXピクセルズレ+
    key[1] = KEY_INPUT_W;    //X軸増加時のYピクセルズレ+
    key[2] = KEY_INPUT_E;    //Y軸増加時のYピクセルズレ+
    key[3] = KEY_INPUT_R;    //Y軸増加時のXピクセルズレ+
    key[4] = KEY_INPUT_U;    //地形一段の高さ+
    key[5] = KEY_INPUT_I;    //地形に対してのオブジェ高さ+
    key[6] = KEY_INPUT_O;    //描画基準位置X+
    key[7] = KEY_INPUT_P;    //描画基準位置Y+
    key[8] = KEY_INPUT_Z;    //地形種類+
    key[9] = KEY_INPUT_C;    //地形高さ+
    key[10] = KEY_INPUT_M;    //地形オブジェ+
    key[11] = KEY_INPUT_RIGHT;    //カーソルキーX軸+
    key[12] = KEY_INPUT_DOWN;    //カーソルキーY軸+

    key[13] = KEY_INPUT_A;    //X軸増加時のXピクセルズレー
    key[14] = KEY_INPUT_S;    //X軸増加時のYピクセルズレー
    key[15] = KEY_INPUT_D;    //Y軸増加時のYピクセルズレー
    key[16] = KEY_INPUT_F;    //Y軸増加時のXピクセルズレー
    key[17] = KEY_INPUT_J;    //地形一段の高さー
    key[18] = KEY_INPUT_K;    //地形に対してのオブジェ高さー
    key[19] = KEY_INPUT_L;    //描画基準位置Xー
    key[20] = KEY_INPUT_SEMICOLON;    //描画基準位置Yー
    key[21] = KEY_INPUT_X;    //地形種類ー
    key[22] = KEY_INPUT_V;    //地形高さー
    key[23] = KEY_INPUT_COMMA;    //地形オブジェー
    key[24] = KEY_INPUT_LEFT;    //カーソルキーX軸ー
    key[25] = KEY_INPUT_UP;    //カーソルキーY軸ー

    //キーの割り当て(初期化時)
    key2[0] = KEY_INPUT_Q;    //地形画像全数+
    key2[1] = KEY_INPUT_W;    //1つの画像の地形の数X+
    key2[2] = KEY_INPUT_E;    //1つの画像の地形の数Y+
    key2[3] = KEY_INPUT_R;    //地形画像1つのサイズX+
    key2[4] = KEY_INPUT_T;    //地形画像1つのサイズY+
    key2[5] = KEY_INPUT_Y;    //オブジェ画像全数
    key2[6] = KEY_INPUT_U;    //1つの画像のオブジェの数X+
    key2[7] = KEY_INPUT_I;    //1つの画像のオブジェの数Y+
    key2[8] = KEY_INPUT_O;    //オブジェ画像1つのサイズX+
    key2[9] = KEY_INPUT_P;    //オブジェ画像1つのサイズY+
    key2[10] = KEY_INPUT_RIGHT;    //マップの大きさX+
    key2[11] = KEY_INPUT_DOWN;    //マップの大きさY+
    key2[12] = KEY_INPUT_Z;    //背景色R+
    key2[13] = KEY_INPUT_C;    //背景色G+
    key2[14] = KEY_INPUT_M;    //背景色B+

    key2[15] = KEY_INPUT_A;    //地形画像全数ー
    key2[16] = KEY_INPUT_S;    //1つの画像の地形の数X-
    key2[17] = KEY_INPUT_D;    //1つの画像の地形の数Y-
    key2[18] = KEY_INPUT_F;    //地形画像1つのサイズX-
    key2[19] = KEY_INPUT_G;    //地形画像1つのサイズY-
    key2[20] = KEY_INPUT_H;    //オブジェ画像全数
    key2[21] = KEY_INPUT_J;    //1つの画像のオブジェの数X-
    key2[22] = KEY_INPUT_K;    //1つの画像のオブジェの数Y-
    key2[23] = KEY_INPUT_L;    //オブジェ画像1つのサイズX-
    key2[24] = KEY_INPUT_SEMICOLON;    //オブジェ画像1つのサイズY-
    key2[25] = KEY_INPUT_LEFT;    //マップの大きさX-
    key2[26] = KEY_INPUT_UP;    //マップの大きさY-
    key2[27] = KEY_INPUT_X;    //背景色R-
    key2[28] = KEY_INPUT_V;    //背景色G-
    key2[29] = KEY_INPUT_COMMA;    //背景色B-

    //デフォルト画像読込
    LoadDivGraph( landPath , 10 , 10 , 1 , 64 , 256 , Gland );
    LoadDivGraph( objePath , 10 , 10 , 1 , 64 , 64 , Gobje );

    //メインループ
    while( totalFlag > -1 ){

        Edit();            //地形編集
        while( CheckHitKey( KEY_INPUT_TAB ) == 1 ) WaitVSync( 1 );
        Initialize();    //初期化
        while( CheckHitKey( KEY_INPUT_TAB ) == 1 ) WaitVSync( 1 );

    }
    DxLib_End() ;                // DXライブラリ使用の終了処理

    return 0 ;                // ソフトの終了
}

    //地形の編集/////////////////////////////
void Edit(){

    DrawLand();

    while( 1 ){
        WaitVSync( 1 );

        //キーの取得
        int f = 0;
        for( int i=0 ; i<26 ; i++ ){
            if( CheckHitKey( key[i] ) == 1 ){
                keyinput[i] = ( keyinput[i]+1 )%10;    //押し続けると10フレームごとに反応
                f = 1;
            } else {
                keyinput[i] = 0;
            }
        }
        if( f == 1 ){        //キー押下時
            for( int i=0 ; i<13 ; i++ ){
                if( keyinput[i] == 1 ){        //プラス処理
                    para[i] = ( para[i]+1 > paramax[i] ) ? 0 : para[i]+1;
                    switch( i ){        //地形編集
                        case 8:
                            landD[para[11]][para[12]] = ( landD[para[11]][para[12]]+1 )%( paramax[i]+1 );
                            break;
                        case 9:
                            landH[para[11]][para[12]] = ( landH[para[11]][para[12]]+1 )%paramax[i];
                            break;
                        case 10:
                            landO[para[11]][para[12]] = ( landO[para[11]][para[12]]+1 )%( paramax[i]+1 );
                    }
                    f = 2;
                }
                if( keyinput[i+13] == 1 ){    //マイナス処理
                    para[i] = ( para[i]-1 < 0 ) ? paramax[i] :  para[i]-1;
                    switch( i ){        //地形編集
                        case 8:
                            landD[para[11]][para[12]] = ( landD[para[11]][para[12]]-1 < 0 )? paramax[i] : landD[para[11]][para[12]]-1;
                            break;
                        case 9:
                            landH[para[11]][para[12]] = ( landH[para[11]][para[12]]-1 < 0 )? paramax[i] : landH[para[11]][para[12]]-1;
                            break;
                        case 10:
                            landO[para[11]][para[12]] = ( landO[para[11]][para[12]]-1 < 0 )? paramax[i] : landO[para[11]][para[12]]-1;
                    }
                    f = 2;
                }
            }
            if( f == 2 ) DrawLand();
        }

        //数値意外のキーの処理
        if( CheckHitKey( KEY_INPUT_TAB ) == 1 ) break;
        if( CheckHitKey( KEY_INPUT_F1 ) == 1 ) Save();
        if( CheckHitKey( KEY_INPUT_F2 ) == 1 ) Load();
        if( CheckHitKey( KEY_INPUT_SPACE ) == 1 ){
            drawparaflag = ( drawparaflag+1 )%2;
            DrawLand();
            while( CheckHitKey( KEY_INPUT_SPACE ) == 1) WaitVSync( 1 );
        }
        if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 ) totalFlag = -1;

        if( totalFlag == -1 ) break;
    }
}

    //初期化//////////////////////////////////
void Initialize(){

    DrawInit();

    para[11] = 0;    //カーソルを原点に
    para[12] = 0;

    while( 1 ){

        WaitVSync( 1 );

        //キーの取得
        int f = 0;
        for( int i=0 ; i<30 ; i++ ){
            if( CheckHitKey( key2[i] ) == 1 ){
                keyinput2[i] = ( keyinput2[i]+1 )%10;    //押し続けると10フレームごとに反応
                f = 1;
            } else {
                keyinput2[i] = 0;
            }
        }
        if( f == 1 ){        //キー押下時
            for( int i=0 ; i<15 ; i++ ){
                if( keyinput2[i] == 1 ){        //プラス処理
                    para2[i] = ( para2[i]+1 > paramax2[i] ) ? paramin2[i] : para2[i]+1;
                    f = 2;
                }
                if( keyinput2[i+15] == 1 ){    //マイナス処理
                    para2[i] = ( para2[i]-1 < paramin2[i] ) ? paramax2[i] :  para2[i]-1;
                    f = 2;
                }
            }

            if( f == 2 ) DrawInit();

        }

        //地形画像読込へ
        if( CheckHitKey( KEY_INPUT_F1 ) == 1 ){
            ImageFile( 1 );
            DrawInit();
        }

        //オブジェ画像読込へ
        if( CheckHitKey( KEY_INPUT_F2 ) == 1 ){
            ImageFile( 2 );
            DrawInit();
        }

        if( CheckHitKey( KEY_INPUT_TAB ) == 1 ) break;
        if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 ) totalFlag = -1;

        if( totalFlag == -1 ) break;
    }

    //画像枚数の最大値を設定
    paramax[8] = para2[0]-1;        //地形
    paramax[10] = para2[5]-1;    //オブジェ
}

    //地形描画//////////////////////////////
void DrawLand(){

    //背景
    DrawBox( 0 , 0 , wX , wY , GetColor( para2[12] , para2[13] , para2[14] ) , TRUE );

    //数値調整
    int xx = para[0] - 18;        //X軸増加時のXピクセルズレ
    int xy = para[1] - 34;        //X軸増加時のYピクセルズレ
    int yy = para[2] - 34;        //Y軸増加時のYピクセルズレ
    int yx = para[3] - 82;        //Y軸増加時のXピクセルズレ
    int height = para[4];        //地形一段の高さ
    int objheight = para[5] - 18;    //地形に対してのオブジェ高さ
    int dspX = para[6]*8 - 112;        //描画基準位置X
    int dspY = para[7]*8 - 300;        //描画基準位置Y
    
    for( int x = 0 ; x < para2[10] ; x++ ){
    for( int y = 0 ; y < para2[11] ; y++ ){

        int drawX = dspX+x*xx+y*yx;
        int drawY = dspY+y*yy+x*xy-landH[x][y]*height;

        //地形描画
        DrawGraph( drawX , drawY , Gland[landD[x][y]] , TRUE );

        //カーソル描画
        if( ( x == para[11] )&&( y == para[12] ) ){
            SetDrawBlendMode( DX_BLENDMODE_ALPHA , 100 );
            DrawBox( drawX , drawY , drawX+para2[3] , drawY+32 , 0xff0000 , TRUE );
            SetDrawBlendMode( DX_BLENDMODE_NOBLEND , 0 );
        }

        //オブジェ描画
        DrawGraph( drawX , drawY-objheight , Gobje[landO[x][y]] , TRUE );

    }
    }

    if( drawparaflag == 0 ){        //パラメータ描画
        SetDrawBlendMode( DX_BLENDMODE_ALPHA , 144 );
        DrawBox( 0 , 0 , 256 , 410 , 0x666666 , TRUE );
        SetDrawBlendMode( DX_BLENDMODE_NOBLEND , 0 );

        DrawString( 10 , 20 , "[+][-] 数値" , 0xff0000 );
        DrawFormatString( 10 , 40 , 0xcccccc , "[Q][A] %d mapX:pixelX" , para[0]-18 );
        DrawFormatString( 10 , 60 , 0xcccccc , "[W][S] %d mapX:pixelY" , para[1]-34 );
        DrawFormatString( 10 , 80 , 0xcccccc , "[E][D] %d mapY:pixelY" , para[2]-34 );
        DrawFormatString( 10 , 100 , 0xcccccc , "[R][F] %d mapY:pixelX" , para[3]-82 );
        DrawFormatString( 10 , 120 , 0xcccccc , "[U][J] %d 地形1段のpixel" , para[4] );
        DrawFormatString( 10 , 140 , 0xcccccc , "[I][K] %d オブジェ高さpixel" , para[5] );
        DrawFormatString( 10 , 160 , 0xcccccc , "[O][L] %d 描画基準X" , para[6]*8-112 );
        DrawFormatString( 10 , 180 , 0xcccccc , "[P][;] %d 描画基準Y" , para[7]*8-300 );
        DrawFormatString( 10 , 200 , 0xcccccc , "[Z][X] %d 地形種類" , landD[para[11]][para[12]] );
        DrawFormatString( 10 , 220 , 0xcccccc , "[C][V] %d 地形高さ" , landH[para[11]][para[12]] );
        DrawFormatString( 10 , 240 , 0xcccccc , "[M][,] %d 地形オブジェ" , landO[para[11]][para[12]] );
        DrawFormatString( 10 , 260 , 0xcccccc , "[←][→] %d mapX" , para[11] );
        DrawFormatString( 10 , 280 , 0xcccccc , "[↑][↓] %d mapY" , para[12] );
        DrawString( 10 , 300 , "[F1] データ保存" , 0xcccccc );
        DrawString( 10 , 320 , "[F2] データ読込" , 0xcccccc );
        DrawString( 10 , 340 , "[tab] 画像読込等初期化" , 0xcccccc );
        DrawString( 10 , 360 , "[space] 表示切替" , 0xcccccc );
        DrawString( 10 , 380 , "[esc] 終了" , 0xcccccc );
    }

    ScreenFlip();

}

    //初期化画面描画///////////////////////
void DrawInit(){

    ClearDrawScreen();

    DrawString( 10 , 20 , "[+][-] 数値" , 0xff0000 );
    DrawFormatString( 10 , 40 , 0xcccccc , "[Q][A] %d 地形画像全数" , para2[0] );
    DrawFormatString( 10 , 60 , 0xcccccc , "[W][S] %d 地形画像分割数「横」" , para2[1] );
    DrawFormatString( 10 , 80 , 0xcccccc , "[E][D] %d 地形画像分割数「縦」" , para2[2] );
    DrawFormatString( 10 , 100 , 0xcccccc , "[R][F] %d 地形1つのサイズXpixel" , para2[3] );
    DrawFormatString( 10 , 120 , 0xcccccc , "[T][G] %d 地形1つのサイズYpixel" , para2[4] );
    DrawFormatString( 10 , 140 , 0xcccccc , "[Y][H] %d オブジェ画像全数" , para2[5] );
    DrawFormatString( 10 , 160 , 0xcccccc , "[U][J] %d オブジェ画像分割数「横」" , para2[6] );
    DrawFormatString( 10 , 180 , 0xcccccc , "[I][K] %d オブジェ画像分割数「縦」" , para2[7] );
    DrawFormatString( 10 , 200 , 0xcccccc , "[O][L] %d オブジェ1つのサイズXpixel" , para2[8] );
    DrawFormatString( 10 , 220 , 0xcccccc , "[P][;] %d オブジェ1つのサイズYpixel" , para2[9] );
    DrawFormatString( 10 , 240 , 0xcccccc , "[←][→] %d マップの大きさX" , para2[10] );
    DrawFormatString( 10 , 260 , 0xcccccc , "[↑][↓] %d マップの大きさY" , para2[11] );
    DrawFormatString( 10 , 280 , 0xcccccc , "[Z][X] %d 背景色R" , para2[12] );
    DrawFormatString( 10 , 300 , 0xcccccc , "[C][V] %d 背景色G" , para2[13] );
    DrawFormatString( 10 , 320 , 0xcccccc , "[M][,] %d 背景色B" , para2[14] );
    DrawString( 10 , 340 , "[F1] 地形画像読込" , 0xcccccc );
    DrawString( 10 , 360 , "[F2] オブジェ画像読込" , 0xcccccc );
    DrawString( 10 , 380 , "[tab] 地形描画" , 0xcccccc );
    DrawString( 10 , 400 , "[esc] 終了" , 0xcccccc );
    DrawString( 10 , 440 , "http://dgen.hatenablog.com/" , 0xcccccc );

    for( int i=0 ; i<4 ; i++ ){
        DrawGraph( i*( para2[3]+5 )+350 , 10 , Gland[i] , TRUE );
        DrawGraph( i*( para2[8]+5 )+350 , 300 , Gobje[i] , TRUE );
    }

    ScreenFlip();

    paramax[11] = para2[10]-1;
    paramax[12] = para2[11]-1;

}

    //画像ファイル読込み////////////////////////
void ImageFile( int flag ){

    if( totalFlag == -1 ) return;

    OPENFILENAME ofn;
    char szFile[ MAX_PATH ] = "";
    ZeroMemory( &ofn, sizeof( ofn ) );
    ofn.lStructSize = sizeof( OPENFILENAME );
    ofn.lpstrFilter = TEXT( "画像ファイル(*.png)\0*.png\0" )
        TEXT( "画像ファイル(*.bmp)\0*.bmp\0" )
        TEXT( "画像ファイル(*.jpg)\0*.jpg;*.jpeg\0\0" );
    ofn.lpstrFile = szFile;
    ofn.nMaxFile = MAX_PATH;
    ofn.Flags = OFN_FILEMUSTEXIST;
    int errflag = 0;

    if( GetOpenFileName( &ofn ) == TRUE ){        //ファイル選択
        if( flag == 1 ){
            strcpy_s( landPath , MAX_PATH , szFile );
            for( int i=0 ; i<64 ; i++ ) DeleteGraph( Gland[i] );    //画像読込
            errflag = LoadDivGraph( landPath , para2[0] , para2[1] , para2[2] , para2[3] , para2[4] , Gland );
            if( errflag == -1 ) totalFlag = -1;
        } else if( flag == 2 ){
            strcpy_s( objePath , MAX_PATH , szFile );
            for( int i=0 ; i<64 ; i++ ) DeleteGraph( Gobje[i] );
            errflag = LoadDivGraph( objePath , para2[5] , para2[6] , para2[7] , para2[8] , para2[9] , Gobje );
            if( errflag == -1 ) totalFlag = -1;
        }
    } else {
        totalFlag = -1;
    }
    if( totalFlag == -1 ){
        DrawString( 50 , 430 , "画像読込みに失敗しました 終了します" , 0xffffff );
        ScreenFlip();
        WaitVSync( 120 );
    }

    SetCurrentDirectory( crDir );

}

void Save(){        //セーブ

    OPENFILENAME ofn;
    char szFile[ MAX_PATH ] = "landdata.dt";
    ZeroMemory( &ofn, sizeof( ofn ) );
    ofn.lStructSize = sizeof( OPENFILENAME );
    ofn.lpstrFilter = TEXT( "データファイル(*.dt)\0*.dt\0\0" );
    ofn.lpstrFile = szFile;
    ofn.nMaxFile = MAX_PATH;
    ofn.Flags = OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY;

    int errflag = 0;

    //ファイル選択
    if( GetSaveFileName( &ofn ) == TRUE ){
        FILE *fp;
        errno_t error;
        if( ( error = fopen_s( &fp , szFile , "w" )) !=0 ){    //ファイルオープン
            totalFlag = -1;
        } else {
            fwrite( landD , sizeof( int ) , 400 , fp );    //書込
            fwrite( landH , sizeof( int ) , 400 , fp );
            fwrite( landO , sizeof( int ) , 400 , fp );
            fwrite( para , sizeof( int ) , 13 , fp );
            fwrite( para2 , sizeof( int ) , 15 , fp );
            fwrite( landPath , sizeof( char ) , MAX_PATH , fp );
            fwrite( objePath , sizeof( char ) , MAX_PATH , fp );
            fclose( fp );
        }
    } else {
        totalFlag = -1;
    }

        if( totalFlag == -1 ){        //エラー処理
        DrawString( 50 , 450 , "保存に失敗しました" , 0xffff00 );
        ScreenFlip();
        WaitVSync( 60 );
    }

        SetCurrentDirectory( crDir );

}

void Load(){        //ロード

    OPENFILENAME ofn;
    char szFile[ MAX_PATH ] = "";
    ZeroMemory( &ofn, sizeof( ofn ) );
    ofn.lStructSize = sizeof( OPENFILENAME );
    ofn.lpstrFilter = TEXT( "データファイル(*.dt)\0*.dt\0\0" );
    ofn.lpstrFile = szFile;
    ofn.nMaxFile = MAX_PATH;
    ofn.Flags = OFN_FILEMUSTEXIST;

    int errflag = 0;

    //ファイル選択
    if( GetOpenFileName( &ofn ) == TRUE ){
        FILE *fp;
        errno_t error;
        if( ( error = fopen_s( &fp , szFile , "r" )) !=0 ){    //ファイルオープン
            totalFlag = -1;
        } else {
            fread( landD , sizeof( int ) , 400 , fp );    //読込み
            fread( landH , sizeof( int ) , 400 , fp );
            fread( landO , sizeof( int ) , 400 , fp );
            fread( para , sizeof( int ) , 13 , fp );
            fread( para2 , sizeof( int ) , 15 , fp );
            fread( landPath , sizeof( char ) , MAX_PATH , fp );
            fread( objePath , sizeof( char ) , MAX_PATH , fp );
            fclose( fp );

            SetCurrentDirectory( crDir );

            //読込んだファイル名で画像読込
            for( int i=0 ; i<64 ; i++ ) DeleteGraph( Gland[i] );
            errflag = LoadDivGraph( landPath , para2[0] , para2[1] , para2[2] , para2[3] , para2[4] , Gland );
            if( errflag == -1 ) totalFlag = -2;
            for( int i=0 ; i<64 ; i++ ) DeleteGraph( Gobje[i] );
            errflag = LoadDivGraph( objePath , para2[5] , para2[6] , para2[7] , para2[8] , para2[9] , Gobje );
            if( errflag == -1 ) totalFlag = -2;

            DrawLand();
        }
    } else {
        totalFlag = -1;
    }

    if( totalFlag == -1 ){        //エラー処理
        DrawString( 50 , 450 , "読込みに失敗しました" , 0xffff00 );
        ScreenFlip();
        WaitVSync( 60 );
    } else if( totalFlag == -2 ){
        DrawString( 50 , 450 , "画像を再度読込ませてください" , 0xffff00 );
        ScreenFlip();
        WaitVSync( 120 );
        totalFlag = 0;
    }

}