選択画面

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

選択画面

#1

投稿記事 by エメ » 14年前

今回は選択画面のことでまた躓いてしまいました。
前回の質問は理解できたのですが、また1から組みなおしてみると
if( Key[KEY_INPUT_DOWN]==1 ||( Key[KEY_INPUT_DOWN]%5==0 && Key[KEY_INPUT_DOWN]>30)){
// たった今押したか、30カウンター以上押しっぱなしかつ5回に一度
y++;
if(y==N) // y座標がNなら(選択が一番下なら)
y=0; // 選択座標を一番上に
}
このような形が使えなくて困っています。
なので試行錯誤で
   if(KeyBuf[KEY_INPUT_DOWN]==1){
y++;
if(y==N) // y座標がNなら(選択が一番下なら)
y=0; // 選択座標を一番上に

}
のような形にしたのですがそうすると凄い速度で選択画面の■が動いてしまうので困っています。

#include "DxLib.h"


//グローバル変数の宣言と初期化
int counter = 0;
int color_white; //どこかで使っているのか?
int y = 0;
int White; //色とy座標の宣言
int count = 0;
int FontHandle;
int image = 0; //ハンドルを受け取るためのint型変数を宣言
int image2 = 0; //ハンドルを受け取るためのint型変数を宣言
int image3 = 0; //ハンドルを受け取るためのint型変数を宣言
int Sound; //音楽データへのハンドル
int MenuExec;
int OptionExec;
int function_status = 0;
char KeyBuf[ 256 ] ;
char Key[256];
#define DISPLAY_POS_X 500
#define DISPLAY_POS_Y(i) (200 + 50 * (i))
#define N 5 // 項目数
#define M -1


void message_box(){ //スクリーン設定
int flag;
flag=MessageBox(
NULL ,
TEXT("Yでフルスクリーン、Nでウィンドウモードです。") ,
TEXT("スクリーン設定") ,
MB_YESNO | MB_ICONQUESTION );
if(flag==IDNO)
ChangeWindowMode( TRUE );
}


void SetColor(){
color_white = GetColor(255,255,255); //白色ハンドルを取得
}

void char_disp(int White,int y){
DrawString( DISPLAY_POS_X - 20 , DISPLAY_POS_Y(y) , "■" , White );
DrawString( DISPLAY_POS_X , DISPLAY_POS_Y(0) , "SHOOTING" , White );
DrawString( DISPLAY_POS_X , DISPLAY_POS_Y(1) , "MUSICROOM" , White );
DrawString( DISPLAY_POS_X , DISPLAY_POS_Y(2) , "OPTION" , White );
DrawString( DISPLAY_POS_X , DISPLAY_POS_Y(3) , "MANUAL" , White );
DrawString( DISPLAY_POS_X , DISPLAY_POS_Y(4) , "QUIT" , White );
}


void Backmusic(){
Sound = LoadSoundMem( "music/harutoman.wav" ); //wavファイルを読み込み、ハンドルをint型変数へ格納
PlaySoundMem( Sound , DX_PLAYTYPE_BACK );//バックグラウンド再生
}

void wait_fanc(){
int term;
static int t=0;
term = GetNowCount()-t;
if(16-term>0)
Sleep(16-term);
t=GetNowCount();
return;
}

void fps(){
int i;
static int t=0,ave=0,f[60];

f[count%60]=GetNowCount()-t;
t=GetNowCount();
if(count%60==59){
ave=0;
for(i=0;i<60;i++)
ave+=f;
ave/=60;
}
if(ave!=0){
DrawFormatString(0, 0,GetColor(255,255,255),"%.1fFPS",1000.0/(double)ave);
DrawFormatString(0,20,GetColor(255,255,255),"%dms" ,ave);
}
return;
}




int GetHitKeyStateAll_2(int KeyStateBuf[]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key==1) KeyStateBuf++;
else KeyStateBuf=0;
}
return 0;
}



void Opening(){


DrawGraph( 0 , 0 , image , FALSE ) ; //gazo/taitoru2.pngを表示
DrawGraph( 10 , 10 , image2 , TRUE ) ; //gazo/rogo.pngを表示
char_disp(White,y); // 文字を描画
DrawString(300,450, "この作品は東方を参考にした二次創作です" , White);//文字列表示
fps();
count++;


if(KeyBuf[KEY_INPUT_UP]==1 ){
y--;
if(y==M) // y座標がMなら(選択が一番上なら)
y=4; // 選択座標を一番下に

}
if(KeyBuf[KEY_INPUT_DOWN]==1 ){
y++;
if(y==N) // y座標がNなら(選択が一番下なら)
y=0; // 選択座標を一番上に

}

if(KeyBuf[KEY_INPUT_X]==1){
y=4;

}


if(KeyBuf[KEY_INPUT_Z]==1){
if(y==2){ // y座標が2なら
function_status=1;
}
}

if(KeyBuf[KEY_INPUT_P]==1){
SaveDrawScreen( 0 , 0 , 640 , 480 , "snapshot/th000.bmp" ) ; // 画面全体を snapshot/th000.bmp として保存
}

} //Opening終了



void Menu(){
DrawGraph( 0 , 0 , image3 , TRUE ) ; //gazo/rogo.pngを表示
if(KeyBuf[KEY_INPUT_X]==1)
function_status=2;
}

void Danjon(){
DrawString(100,180,"ダンジョン画面 (cをプッシュ)",White);
if(KeyBuf[KEY_INPUT_C]==1)
function_status=3;
}

void attack(){
DrawString(100,220,"戦闘画面 (vをプッシュ)",White);
if(KeyBuf[KEY_INPUT_V]==1)
function_status=4;
}

void Ending(){
DrawString(100,260,"エンディング画面 (bをプッシュ)",White);
if(KeyBuf[KEY_INPUT_B]==1)
function_status=5;
}


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){

message_box(); //ウィンドウかフルスクリーンか変更する




if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了

Backmusic(); //演奏

White = GetColor( 255 , 255 , 255 ) ; //色の取得

SetDrawScreen( DX_SCREEN_BACK ) ; // 描画先を裏画面に設定

SetMainWindowText( "時鏡 鉢帳録" ) ;// タイトルを変更
image = LoadGraph( "gazo/taitoru2.png" ); //gazo/taitoru2.pngのハンドルを代入
image2 = LoadGraph( "gazo/rogo.png" ); //gazo/rogo.pngのハンドルを代入
image3 = LoadGraph( "gazo/option.png" ); //gazo/option.pngのハンドルを代入



while( 1 ){
ClearDrawScreen(); // 裏画面のデータを全て削除
GetHitKeyStateAll( KeyBuf ) ; // すべてのキーの状態を得る

switch(function_status){
case 0:
Opening();
break;
case 1:
Menu();
break;
case 2:
Danjon();
break;
case 3:
attack();
break;
case 4:
Ending();
break;
default:
DxLib_End() ; // DXライブラリ使用の終了処理
return 0;
break;
}

if( ProcessMessage() == -1 ) break ; //エラーが起きたら終了


ScreenFlip() ; // 裏画面データを表画面へ反映
wait_fanc();
}

DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}

Rom
記事: 25
登録日時: 14年前
住所: 日本

Re: 選択画面

#2

投稿記事 by Rom » 14年前

KeyBuf[256]をint型にしたらいいんじゃないかな?→参考http://dixq.net/g/41.html

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 14年前
住所: 北海道札幌市
連絡を取る:

Re: 選択画面

#3

投稿記事 by Dixq (管理人) » 14年前

Romさんの仰るように、キーが押された瞬間だけ処理するようにすればよいと思います。
キーが押されて1カウント目だけ状態を変更すれば、一つずつしか状態が変化しません。

# 赤字で「フォーラムルール」と書いてある通り、ソースコードを投稿する時はcodeタグで囲んでくださいね。

閉鎖

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