33. 選択画面の作り方。


文字列の左に矢印を描画し、今何を選択しているか示したい場合があります。

サンプルでは矢印の代わりに文字列の左に■を描画して現在選択している文字列の状態を表現しています。

サンプルで説明すると、最初「NEW GAME」が選択されているとします。

下キーを押すと、CONTINUE1が選択されます。もう一度下キーを入力するとCONTINUE2になります。

選択画面は、キーを押すごとに状態が変わるものですが、キーを押しっぱなしにするとオートで状態がかわりますね。

「下キーを押すごとに選択が下へ移動する」

「下キーを押しっぱなしにするとオートで選択が下へ移動する」

という2種類の処理をする必要があります。

これには40節の「キーがどれ位押されたかを監視する関数」を利用すると便利なので、まずそちらをご覧下さい。

そちらで紹介している関数がわかれば、41節も一緒にご覧下さい。

41節のプログラムに、上記の仕様を実装すると以下のようになります。


#include "DxLib.h"
 
int GetHitKeyStateAll_2(int KeyStateBuf[]){
        char GetHitKeyStateAll_Key[256];
        GetHitKeyStateAll( GetHitKeyStateAll_Key );
        for(int i=0;i<256;i++){
                if(GetHitKeyStateAll_Key[i]==1) KeyStateBuf[i]++;
                else                            KeyStateBuf[i]=0;
        }
        return 0;
}
 
void char_disp(int White,int y){
        DrawString( 150 , y   , "■"            , White );
        DrawString( 170 , 100 , "NEW GAME"  , White );
        DrawString( 170 , 120 , "CONTINUE1" , White );
        DrawString( 170 , 140 , "CONTINUE2" , White );
        DrawString( 170 , 160 , "CONTINUE3" , White );
        DrawString( 170 , 180 , "CONTINUE4" , White );
        DrawString( 170 , 200 , "CONTINUE5" , White );
        DrawString( 170 , 220 , "CONTINUE6" , White );
        DrawString( 170 , 240 , "LOG OUT"   , White );
}
 
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        
    int Key[256];
    int White , y=100;                                       //色とy座標の宣言
 
    ChangeWindowMode(TRUE);//ウィンドウモード
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
 
    White = GetColor( 255 , 255 , 255 ) ;                    //色の取得
 
 
    while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
          //↑メッセージ処理         ↑画面をクリア         ↑入力状態を保存       ↑ESCが押されていない
 
        char_disp(White,y);                              // 文字を描画
 
        if( Key[KEY_INPUT_DOWN]==1 ||( Key[KEY_INPUT_DOWN]%5==0 && Key[KEY_INPUT_DOWN]>30)){
        // たった今押したか、30カウンター以上押しっぱなしかつ5回に一度
            y+=20;                                           
            if(y==260)                            // y座標が260なら(選択が一番下なら)
                y=100;                        // 選択座標を一番上に
        }
 
        ScreenFlip();//裏画面反映
    }
 
    DxLib_End();
    return 0;
}
 

実行結果

→掲示板で質問する



- Remical Soft -