ページ 11

タイトル画面で一考

Posted: 2010年5月30日(日) 16:03
by しろ
ちょこちょことDXライブラリについて勉強して、(おそらく)一番簡単(であろう)クイズゲームを作ってみることにしました。タイトル画面で選択肢を選ぶところで、下のようなプログラムを作成しました。

GAMESTARTの値の増減で選択肢を選ぶという流れなのですが、パソコンの処理速度のせいか、上下キーでGAMESTARTの値を変えると、いっきにGAMESTARTの値が2くらい増えたりして、うまくありません。

どんなテクニックを使えばうまくいくでしょうか?
最初は分岐をGAMESTART=1,3,5の値をとるとき、選択肢として処理をして、2,4の場合は自動的に1増やす、あるいは減らすというプログラムにしたのですが、これもいまいちな操作性で……

よろしくお願いいたします。


---------------

#include "DxLib.h"

int FontHandle[20];//FontHandle配列を宣言
char Key[256];//Key配列を宣言


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //初期化処理

int GAMESTART=1;

SetGraphMode(1024,768,32) ;// 画面モードの変更




FontHandle[0]= CreateFontToHandle("MS 明朝" , 30 , 2 , DX_FONTTYPE_NORMAL);//FontHandle[0]がフォントデータを取得
FontHandle[1]= CreateFontToHandle("MS 明朝" , 20 , 2 , DX_FONTTYPE_NORMAL);//FontHandle[0]がフォントデータを取得




while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
//↑メッセージ処理 ↑画面をクリア ↑キーボード入力状態取得 ↑ESCが押されていない

if(GAMESTART==1){

DrawStringToHandle( 290 , 150 ,"(仮名前)クイズゲーム", GetColor(255,255,255) , FontHandle[0] ) ;
DrawStringToHandle( 400 , 300 ,"ゲームを始める", GetColor(255,255,255) , FontHandle[1] ) ;
DrawStringToHandle( 400 , 350 ,"記録を見る", GetColor(0,255,255) , FontHandle[1] ) ;
DrawStringToHandle( 400 , 400 ,"ゲームを終わる", GetColor(0,255,255) , FontHandle[1] ) ;

if(Key[KEY_INPUT_DOWN]){
GAMESTART++;
}


ScreenFlip();//裏画面を表画面に反映
}


if(GAMESTART==2){

DrawStringToHandle( 290 , 150 ,"(仮名前)クイズゲーム", GetColor(255,255,255) , FontHandle[0] ) ;
DrawStringToHandle( 400 , 300 ,"ゲームを始める", GetColor(0,255,255) , FontHandle[1] ) ;
DrawStringToHandle( 400 , 350 ,"記録を見る", GetColor(255,255,255) , FontHandle[1] ) ;
DrawStringToHandle( 400 , 400 ,"ゲームを終わる", GetColor(0,255,255) , FontHandle[1] ) ;

if(Key[KEY_INPUT_DOWN]){
GAMESTART++;
}
if(Key[KEY_INPUT_UP]){
GAMESTART--;
}


ScreenFlip();//裏画面を表画面に反映

}

if(GAMESTART==3){

DrawStringToHandle( 290 , 150 ,"(仮名前)クイズゲーム", GetColor(255,255,255) , FontHandle[0] ) ;
DrawStringToHandle( 400 , 300 ,"ゲームを始める", GetColor(0,255,255) , FontHandle[1] ) ;
DrawStringToHandle( 400 , 350 ,"記録を見る", GetColor(0,255,255) , FontHandle[1] ) ;
DrawStringToHandle( 400 , 400 ,"ゲームを終わる", GetColor(255,255,255) , FontHandle[1] ) ;

if(Key[KEY_INPUT_UP]){
GAMESTART--;
}
if(Key[KEY_INPUT_RETURN]){//Enterキーを押すとゲーム終了。
break;
}

ScreenFlip();//裏画面を表画面に反映

}




}




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

return 0 ; // ソフトの終了

}

---------------------------------

Re:タイトル画面で一考

Posted: 2010年5月30日(日) 16:08
by ookami
プログラムを見ると、ボタンを押している間は毎フレームGAMESTARTを増減するようですね。
キーを押した最初の1フレームだけ増減するようにしてはいかがでしょうか。
http://dixq.net/g/41.html

Re:タイトル画面で一考

Posted: 2010年5月30日(日) 16:30
by しろ
なるほど、こんな便利な関数があったんですね。

どうもありがとうございます。 画像

Re:タイトル画面で一考

Posted: 2010年5月30日(日) 17:17
by しろ
すいません。以下のように書き換えました。(一部関数を追加しています。)

でも↑入力はうまくいきますが、↓入力はやはり同じ状況になってしまいます。

どこかまずい部分があるでしょうか?

----------------
#include "DxLib.h"

int FontHandle[20];//FontHandle配列を宣言
void Title_Quiz(int *pT);//Title_Quiz関数の宣言


int GetHitKeyStateAll_2(int Keys[/url]){
char Key1[256];
GetHitKeyStateAll(Key1);
for(int i=0;i<256;i++){
if(Key1==1)
Keys++;
else
Keys=0;
}
return 0;
}


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //初期化処理

int GAMESTART=1;
int Key[256];//Key配列を宣言


SetGraphMode(1024,768,32) ;// 画面モードの変更




FontHandle[0]= CreateFontToHandle("MS 明朝" , 30 , 2 , DX_FONTTYPE_NORMAL);//FontHandle[0]がフォントデータを取得
FontHandle[1]= CreateFontToHandle("MS 明朝" , 20 , 2 , DX_FONTTYPE_NORMAL);//FontHandle[0]がフォントデータを取得




while(ProcessMessage()==0 &&ClearDrawScreen()==0 && GetHitKeyStateAll_2( Key )==0 && Key[KEY_INPUT_ESCAPE]==0){
//↑メッセージ処理 ↑画面をクリア ↑キーボード入力状態取得 ↑ESCが押されていない

if(GAMESTART==1){

int Quiz[3]={255,0,0};

Title_Quiz(Quiz);

if(Key[KEY_INPUT_DOWN]==1){
GAMESTART=2;
}


ScreenFlip();//裏画面を表画面に反映
}


if(GAMESTART==2){

int Quiz[3]={0,255,0};

Title_Quiz(Quiz);

if(Key[KEY_INPUT_DOWN]==1){
GAMESTART=3;
}
if(Key[KEY_INPUT_UP]==1){
GAMESTART=1;
}


ScreenFlip();//裏画面を表画面に反映

}

if(GAMESTART==3){

int Quiz[3]={0,0,255};

Title_Quiz(Quiz);

if(Key[KEY_INPUT_UP]==1){
GAMESTART=2;
}

if(Key[KEY_INPUT_RETURN]==1){//Enterキーを押すとゲーム終了。
break;//whileから脱出
}

ScreenFlip();//裏画面を表画面に反映

}




}




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

return 0 ; // ソフトの終了

}



void Title_Quiz(int *pT){ //Title_Quiz関数

DrawStringToHandle( 290 , 150 ,"(仮名前)クイズゲーム", GetColor(255,255,255) , FontHandle[0] ) ;
DrawStringToHandle( 400 , 300 ,"ゲームを始める", GetColor(pT[0],255,255) , FontHandle[1] ) ;
DrawStringToHandle( 400 , 350 ,"記録を見る", GetColor(pT[1],255,255) , FontHandle[1] ) ;
DrawStringToHandle( 400 , 400 ,"ゲームを終わる", GetColor(pT[2],255,255) , FontHandle[1] ) ;

}

Re:タイトル画面で一考

Posted: 2010年5月31日(月) 22:50
by ookami
if(GAMESTART==2){
:
}
if(GAMESTART==3){
:
}
if(GAMESTART==4){
:
}
の、if を else if にしてはいかがでしょうか。

あとまぁ、書き方のスタイルは人それぞれなんでいいですが、whileループの中に複数ScreenFlipがあるのは違和感ありませんか?