ドラクエ風の黒い窓を作る処理で困っています

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ti

ドラクエ風の黒い窓を作る処理で困っています

#1

投稿記事 by ti » 15年前

昔のドラクエ風のゲームを作っていて
Xボタンを(Aボタン)
Zボタンを(Bボタン)
のような処理をすると考えて作っています
Xボタンを1度押すと窓1が表示されて

Zボタンを1度押すと窓を閉じて前の処理へ戻るまではできました

しかしXボタンを押して窓1が表示されているときにもう一度Xボタンを押すと窓2が表示されるようにしたいのですが二つの窓が同時に表示されてうまくいきません
int Make_CmdWindow(int cr__x,int cr__y,int i,int j,char bname[50])//座標、座標、座標、座標、bmp名
{
    CmdFlg=1;
    //image = LoadGraph( "BMP/1138--.bmp" ) ;
    DrawRectGraph( 0, 0, i, j, 640, 640, image, TRUE, FALSE ) ;
    int cr1 = LoadGraph( "BMP/cr.bmp" );
    DrawRectGraph( 320, 320, 0, 0, 32, 48, cr1, TRUE, FALSE ) ;
    DrawGraph( 50 , 50 ,cmdwindow, false ) ;
    SetTransColor( 255 , 0 , 255 ) ;
    cmdwindow = LoadGraph( "BMP/cmd-win1.bmp") ;//左上にでる話すから調べるなどの窓(窓1)
    int SPEAKwindow = LoadGraph( "BMP/cmd-win2.bmp") ;//下にでる会話窓(窓2)
    int Cr = GetColor( 255 , 255 , 255 ) ;
    DrawString( cmd_x, cmd_y , "⇒" , Cr );
    ScreenFlip();
    
    while(ProcessMessage()==0  && GetHitKeyStateAll(Key)==0 && Key[KEY_INPUT_ESCAPE]==0 && CmdFlg==1){

    
          //↑メッセージ処理         ↑画面をクリア         ↑入力状態を保存       ↑ESCが押されていない
 
        
        DrawRectGraph( 0, 0, i, j, 640, 640, image, TRUE, FALSE ) ;
        
        DrawRectGraph( 320, 320, 0, 0, 32, 48, cr1, TRUE, FALSE ) ;
        DrawGraph( 0 , 0 ,cmdwindow, true ) ;
        int Cr = GetColor( 255 , 255 , 255 ) ;
        DrawString( cmd_x, cmd_y , "⇒" , Cr );
        ScreenFlip();
        if( Key[KEY_INPUT_DOWN]==1 ||( Key[KEY_INPUT_DOWN]%5==0 && Key[KEY_INPUT_DOWN]>30) ){
        // たった今押したか、30カウンター以上押しっぱなしかつ5回に一度
            if(cmd_y != 130){
                DrawGraph( 0 , 0 ,cmdwindow, true ) ;
                cmd_y=cmd_y+30;
                DrawString( cmd_x, cmd_y , "⇒" , Cr );
                

                
                
            }    
        }
        if( Key[KEY_INPUT_UP]==1 ||( Key[KEY_INPUT_DOWN]%5==0 && Key[KEY_INPUT_DOWN]>30) ){
            if(cmd_y != 70){
                DrawGraph( 0 , 0 ,cmdwindow, true ) ;
                cmd_y=cmd_y-30;
                DrawString( cmd_x, cmd_y , "⇒" , Cr );
            }
        }
        if(Key[ KEY_INPUT_Z ]  == 1){
            CmdFlg=0;
        }
        if((Key[ KEY_INPUT_X ]  == 1) && CmdFlg==1){
            CmdFlg2=1;
        }
        while(!ProcessMessage() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE] && CmdFlg2==1){
        
                DrawGraph( 0 , 0 ,SPEAKwindow, true ) ;

                if(Key[ KEY_INPUT_Z ]  == 1 ){
                        CmdFlg2=0;
                }
                ScreenFlip();//裏画面反映
                
        }

        
        
        ScreenFlip();//裏画面反映
        
    }
    
 
    return 0;
}
よろしくお願いします

kazuoni

Re:ドラクエ風の黒い窓を作る処理で困っています

#2

投稿記事 by kazuoni » 15年前

CmdFlg2が
0:X
1:z
2:x&z(x優先)
3:x&z(z優先)

みたいな感じでよいのでは?

softya

Re:ドラクエ風の黒い窓を作る処理で困っています

#3

投稿記事 by softya » 15年前

少なくとも状態遷移として書くべきで、メッセージループの中にメッセージループを書くのはやめた方が良いです。
ちゃんと管理出来るなら書いても良いですけどね。今のコードを見る限りちゃんと出来ていません。
状態遷移がどんななのかと言うと

「ゲームプログラミングの館」34. メイン関数の書き方。
http://dixq.net/g/37.html
にある様にswitch~caseで書きます。

ウィンドウの状態遷移なら、イメージ的に書くと
switch(窓の状態) {
case 閉じた状態:
Xが押されたら、[窓の状態]を窓1状態へ。
break;
case 窓1状態:
窓1の表示
Xが押されたら、[窓の状態]を窓2状態へ。
Zが押されたら、[窓の状態]を閉じた状態へ。
break;
case 窓2状態:
窓2の表示
Zが押されたら、[窓の状態]を窓1状態へ。
break;
}
となります。

ti

Re:ドラクエ風の黒い窓を作る処理で困っています

#4

投稿記事 by ti » 15年前

お久しぶりです
kazuoniさんsoftyaさん返答遅くなってしまってすいません
年末から体調を崩していてしばらく間が空いてしまいましたが
問題が発生しました
メイン関数の書き方にならって
関数を書いてみました
int function_status=888;//状態設定

int Make_CmdWindow1(int cr__x,int cr__y,int i,int j)//座標、座標、座標、座標、bmp名
{
    char Key[256];
    

    GetHitKeyStateAll( Key ) ; 
    while(1){
        //GetHitKeyStateAll(Key);
        switch(function_status){
            
            case 888:

                if(Key[KEY_INPUT_Z]==1)
                    MessageBox(NULL ,"window1" , "B" ,MB_OK);
                    function_status=999;//初期
                break;

                if(Key[KEY_INPUT_X]==1)
                    MessageBox(NULL ,"window1" , "A" ,MB_OK);
                    function_status=777;//ウィンドウ2?
                break;

            case 777:
                if(Key[KEY_INPUT_X]==1)
                    MessageBox(NULL ,"window2" , "A" ,MB_OK);
                    function_status=888;//ウィンドウ2が開いた状態?
                break;

                
                
                if(Key[KEY_INPUT_Z]==1)
                    MessageBox(NULL ,"window1" , "B" ,MB_OK);
                    function_status=888;//初期
                break;

            

            case 999:
                return 0;
                break;
                
            default:
                return 0;
                break;

        }
    }
    
 
    return 0;
}
初期で
if(Key[KEY_INPUT_Z]==1)
                    MessageBox(NULL ,"window1" , "B" ,MB_OK);
                    function_status=999;//初期
                break;

                if(Key[KEY_INPUT_X]==1)
                    MessageBox(NULL ,"window1" , "A" ,MB_OK);
                    function_status=777;//ウィンドウ2?
                break;
キーを押していなくても押している状態として認識してしまいます
原因がわからないのですがkeyの宣言の仕方を変えるべきか
ソースの書き方の問題か教えてくださいよろしくお願いします

ti

Re:ドラクエ風の黒い窓を作る処理で困っています

#5

投稿記事 by ti » 15年前

だいぶ間が空いてしまって過去ログになってしまったのでこちらは解決とさせていただきます
返事がおくれてしまって申し訳ありませんでした

閉鎖

“C言語何でも質問掲示板” へ戻る