ちょこちょこと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:タイトル画面で一考
プログラムを見ると、ボタンを押している間は毎フレームGAMESTARTを増減するようですね。
キーを押した最初の1フレームだけ増減するようにしてはいかがでしょうか。
http://dixq.net/g/41.html
キーを押した最初の1フレームだけ増減するようにしてはいかがでしょうか。
http://dixq.net/g/41.html
Re:タイトル画面で一考
すいません。以下のように書き換えました。(一部関数を追加しています。)
でも↑入力はうまくいきますが、↓入力はやはり同じ状況になってしまいます。
どこかまずい部分があるでしょうか?
----------------
#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] ) ;
}
でも↑入力はうまくいきますが、↓入力はやはり同じ状況になってしまいます。
どこかまずい部分があるでしょうか?
----------------
#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:タイトル画面で一考
if(GAMESTART==2){
:
}
if(GAMESTART==3){
:
}
if(GAMESTART==4){
:
}
の、if を else if にしてはいかがでしょうか。
あとまぁ、書き方のスタイルは人それぞれなんでいいですが、whileループの中に複数ScreenFlipがあるのは違和感ありませんか?
:
}
if(GAMESTART==3){
:
}
if(GAMESTART==4){
:
}
の、if を else if にしてはいかがでしょうか。
あとまぁ、書き方のスタイルは人それぞれなんでいいですが、whileループの中に複数ScreenFlipがあるのは違和感ありませんか?