ページ 11

ゲームのタイトル画面

Posted: 2011年10月21日(金) 00:14
by aegisl1
DXライブラリを使ってゲームのタイトル画面を作りたいのですが、
タイトル画面の画像をロードすると、ゲームスタート、おまけ、ヘルプ、ゲーム終了
の部分が消えてしまうのですが、消えないようにするにはどうすればいいでしょうか?
DXライブラリは使ったことがないので教えてくれると助かります。

コード:

#include "DxLib.h"

int Key[256]; // キーが押されているフレーム数を格納する

// キーの入力状態を更新する
int gpUpdateKey(){
        char tmpKey[256]; // 現在のキーの入力状態を格納する
        GetHitKeyStateAll( tmpKey ); // 全てのキーの入力状態を得る
        for( int i=0; i<256; i++ ){ 
                if( tmpKey[i] != 0 ){ // i番のキーコードに対応するキーが押されていたら
                        Key[i]++;     // 加算
                } else {              // 押されていなければ
                        Key[i] = 0;   // 0にする
                }
        }
        return 0;
}

// メニュー項目の表示に必要な構造体を用意する
typedef struct{
        int x, y;       // 座標格納用変数
        char name[128]; // 項目名格納用変数
} MenuElement_t ;

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
        ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
		DxLib_Init();   // DXライブラリ初期化処理

        int Handle;     // データハンドル格納用変数
    

        // メニュー項目要素を4つ作る
        MenuElement_t MenuElement[4]={
                { 480, 300, "ゲームスタート" }, // タグの中身の順番で格納される。xに80が、yに100が、nameに"ゲームスタート"が
                { 500, 350, "おまけ" },
                { 500, 400, "ヘルプ" },
                { 500, 450, "ゲーム終了" },
        };
        int SelectNum = 0; // 現在の選択番号

        // while(裏画面を表画面に反映, メッセージ処理, 画面クリア, キー更新)
        while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && gpUpdateKey()==0 ){

                // 計算フェーズ 

                if( Key[ KEY_INPUT_DOWN ] == 1 ){ // 下キーが押された瞬間だけ処理

                        SelectNum = ( SelectNum + 1 ) % 4; // 現在の選択項目を一つ下にずらす(ループする)

                        for( int i=0; i<4; i++ ){              // メニュー項目数である4個ループ処理
                                if( i == SelectNum ){          // 今処理しているのが、選択番号と同じ要素なら
                                        MenuElement[i].x = 480; // 座標を480にする
                                } else {                       // 今処理しているのが、選択番号以外なら
                                        MenuElement[i].x = 500;// 座標を500にする
                                }
                        }
                }
				 //上方向への移動
                if( Key[ KEY_INPUT_UP ] == 1 ){        // 上キーが押された瞬間だけ処理
                    SelectNum = ( SelectNum + 3 ) % 4; // 現在の選択項目を一つ上にずらす(逆ループする)
                    for( int i=0; i<4; i++ ){          // メニュー項目数である個ループ処理
                        if( i == SelectNum ){          // 今処理しているのが、選択番号と同じ要素なら
                            MenuElement[i].x = 480;     // 座標をにする
                        } else {                       // 今処理しているのが、選択番号以外なら
                            MenuElement[i].x = 500;    // 座標をにする
                        }
                    }
                }


                // 描画フェーズ

                for( int i=0; i<5; i++ ){ // メニュー項目を描画
                        DrawFormatString( MenuElement[i].x, MenuElement[i].y, GetColor(255,255,255), MenuElement[i].name );
						   Handle = LoadGraph( "画像/タイトル画面.png" ); // 画像をロード
        DrawGraph( 0, 0, Handle, TRUE ); // データハンドルを使って画像を描
                }   
        }

        DxLib_End(); // DXライブラリ終了処理
        return 0;
}

Re: ゲームのタイトル画面

Posted: 2011年10月21日(金) 00:32
by softya(ソフト屋)
codeタグを使ってくださいね。今回は修正しておきました。
http://dixq.net/board/board.html

描画順番が文字→画像だから画像で上書きされます。
見かけ下にしたいものを先に描画するようにしてください。

あと、LoadGraphは毎回ループする所に置いてはいけません。
while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && gpUpdateKey()==0 ){
の前とか、1回しかロードしないように制御するとかしないとメモリを徐々に食いつぶしてやがて落ちます。

Re: ゲームのタイトル画面

Posted: 2011年10月21日(金) 19:36
by aegisl1
ありがとうございます。