キーコンフィグ
Posted: 2012年5月24日(木) 02:02
龍神録の館 8章のものを少しいじりました。
現在keyconfig_config()をすると、それぞれのボタンに対応したキーが表示されます。
今回、教えていただきたいのは、この画面で、なにかキーが押されたら、画面を切り替え、変更したいキーをとって、かぶっていなければ、置き換えるという方法です。
※LoadGraphの引数はけしてあります。中身は背景画像です。
現在keyconfig_config()をすると、それぞれのボタンに対応したキーが表示されます。
今回、教えていただきたいのは、この画面で、なにかキーが押されたら、画面を切り替え、変更したいキーをとって、かぶっていなければ、置き換えるという方法です。
//struct.h
#include"define.h"
typedef struct{
int key[PAD_MAX];
}pad_t;//パッド関係
typedef struct{
int left,up,right,down,a,b,c,d,l1,l2,r1,r2,start,select;
}configpad_t;//キーコンフィグ関係
typedef struct {
char keyconfig[16];
}keyname_t;//キーこんふぃぐようネーム保存構造対
//key.cpp
#include"struct.h"
#include"DxLib.h"
unsigned int stateKey[256];
configpad_t configpad;
configpad_t configkey;
int GetHitKeyStateAll_2(){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key);
for(int i=0; i<256; i++){
if(GetHitKeyStateAll_Key[i] == 1) stateKey[i]++;
else stateKey[i]=0;
}
return 0;
}
//引数1と引数2のうち大きい方を引数1に代入する
int CheckStateKey(unsigned char Handle){
return stateKey[Handle];
}
pad_t pad;
void input_pad_or_key(int *p,int k){
*p = *p>k ? *p : k;
}
//パッドとキーボードの両方の入力をチェックする関数
void GetHitPadStateAll(){
int i,PadInput,mul=1;
PadInput = GetJoypadInputState( DX_INPUT_PAD1 );
for(i=0; i<PAD_MAX; i++){
if(PadInput & mul) pad.key[i]++;
else pad.key[i]=0;
mul *= 2;
}
input_pad_or_key(&pad.key[configpad.left] ,CheckStateKey(configkey.left ));
input_pad_or_key(&pad.key[configpad.up ] ,CheckStateKey(configkey.up ));
input_pad_or_key(&pad.key[configpad.right] ,CheckStateKey(configkey.right ));
input_pad_or_key(&pad.key[configpad.down] ,CheckStateKey(configkey.down ));
input_pad_or_key(&pad.key[configpad.a] ,CheckStateKey(configkey.a ));
input_pad_or_key(&pad.key[configpad.b] ,CheckStateKey(configkey.b ));
input_pad_or_key(&pad.key[configpad.c] ,CheckStateKey(configkey.c ));
input_pad_or_key(&pad.key[configpad.d] ,CheckStateKey(configkey.d ));
input_pad_or_key(&pad.key[configpad.l1] ,CheckStateKey(configkey.l1 ));
input_pad_or_key(&pad.key[configpad.l2] ,CheckStateKey(configkey.l2 ));
input_pad_or_key(&pad.key[configpad.r1] ,CheckStateKey(configkey.r1 ));
input_pad_or_key(&pad.key[configpad.r2] ,CheckStateKey(configkey.r2 ));
input_pad_or_key(&pad.key[configpad.start] ,CheckStateKey(configkey.start ));
input_pad_or_key(&pad.key[configpad.select] ,CheckStateKey(configkey.select ));
}
//渡されたパッドキー番号の入力状態を返す。返り値が-1なら不正
int CheckStatePad(unsigned int Handle){
if(0<=Handle && Handle<PAD_MAX){
return pad.key[Handle];
}
else{
printfDx("CheckStatePadに渡した値が不正です\n");
return -1;
}
}
int CrRed = GetColor(255,0,0);//赤取得
int CrWhite = GetColor(255,255,255);//白取得
keyname_t padname[PAD_MAX];//パッドネーム格納
keyname_t keyname[PAD_MAX];//キーネーム格納
void keyconfig_padname(int a,int c){
//keyname[].keyconfig二代入
if(a == 0) strcpy(padname[c].keyconfig,"↓");
if(a == 1) strcpy(padname[c].keyconfig,"←");
if(a == 2) strcpy(padname[c].keyconfig,"→");
if(a == 3) strcpy(padname[c].keyconfig,"↑");
if(a == 4) strcpy(padname[c].keyconfig,"1ボタン");
if(a == 5) strcpy(padname[c].keyconfig,"2ボタン");
if(a == 6) strcpy(padname[c].keyconfig,"3ボタン");
if(a == 7) strcpy(padname[c].keyconfig,"4ボタン");
if(a == 8) strcpy(padname[c].keyconfig,"5ボタン");
if(a == 9) strcpy(padname[c].keyconfig,"6ボタン");
if(a == 10) strcpy(padname[c].keyconfig,"7ボタン");
if(a == 11) strcpy(padname[c].keyconfig,"8ボタン");
if(a == 12) strcpy(padname[c].keyconfig,"9ボタン");
if(a == 13) strcpy(padname[c].keyconfig,"10ボタン");
if(a == 14) strcpy(padname[c].keyconfig,"11ボタン");
if(a == 15) strcpy(padname[c].keyconfig,"12ボタン");
}
void keyconfig_padname_2(){
//keyname[].keyconfig二代入
keyconfig_padname(configpad.up,0);
keyconfig_padname(configpad.left,1);
keyconfig_padname(configpad.right,2);
keyconfig_padname(configpad.down,3);
keyconfig_padname(configpad.a,4);
keyconfig_padname(configpad.b,5);
keyconfig_padname(configpad.c,6);
keyconfig_padname(configpad.d,7);
keyconfig_padname(configpad.l1,8);
keyconfig_padname(configpad.l2,9);
keyconfig_padname(configpad.r1,10);
keyconfig_padname(configpad.r2,11);
keyconfig_padname(configpad.select,12);
keyconfig_padname(configpad.start,13);
}
void keyconfig_paddraw(){
DrawFormatString(440,100,CrRed,"上 :%s",padname[0].keyconfig);
DrawFormatString(440,130,CrRed,"左 :%s",padname[1].keyconfig);
DrawFormatString(440,160,CrRed,"右 :%s",padname[2].keyconfig);
DrawFormatString(440,190,CrRed,"下 :%s",padname[3].keyconfig);
DrawFormatString(440,220,CrRed,"Aボタン :%s",padname[4].keyconfig);
DrawFormatString(440,250,CrRed,"Bボタン :%s",padname[5].keyconfig);
DrawFormatString(440,280,CrRed,"Cボタン :%s",padname[6].keyconfig);
DrawFormatString(440,310,CrRed,"Dボタン :%s",padname[7].keyconfig);
DrawFormatString(440,340,CrRed,"L1ボタン :%s",padname[8].keyconfig);
DrawFormatString(440,370,CrRed,"L2ボタン :%s",padname[9].keyconfig);
DrawFormatString(440,400,CrRed,"R1ボタン :%s",padname[10].keyconfig);
DrawFormatString(440,430,CrRed,"R2ボタン :%s",padname[11].keyconfig);
DrawFormatString(440,460,CrRed,"SELECT :%s",padname[12].keyconfig);
DrawFormatString(440,490,CrRed,"START :%s",padname[13].keyconfig);
}
void keyconfig_keyname(int a,int c){
if(a == KEY_INPUT_UP) strcpy(keyname[c].keyconfig,"↑");
if(a == KEY_INPUT_DOWN) strcpy(keyname[c].keyconfig,"↓");
if(a == KEY_INPUT_LEFT) strcpy(keyname[c].keyconfig,"←");
if(a == KEY_INPUT_RIGHT) strcpy(keyname[c].keyconfig,"→");
if(a == KEY_INPUT_Q) strcpy(keyname[c].keyconfig,"Q");
if(a == KEY_INPUT_W) strcpy(keyname[c].keyconfig,"W");
if(a == KEY_INPUT_E) strcpy(keyname[c].keyconfig,"E");
if(a == KEY_INPUT_R) strcpy(keyname[c].keyconfig,"R");
if(a == KEY_INPUT_T) strcpy(keyname[c].keyconfig,"T");
if(a == KEY_INPUT_Y) strcpy(keyname[c].keyconfig,"Y");
if(a == KEY_INPUT_U) strcpy(keyname[c].keyconfig,"U");
if(a == KEY_INPUT_I) strcpy(keyname[c].keyconfig,"I");
if(a == KEY_INPUT_O) strcpy(keyname[c].keyconfig,"O");
if(a == KEY_INPUT_P) strcpy(keyname[c].keyconfig,"P");
if(a == KEY_INPUT_A) strcpy(keyname[c].keyconfig,"A");
if(a == KEY_INPUT_S) strcpy(keyname[c].keyconfig,"S");
if(a == KEY_INPUT_D) strcpy(keyname[c].keyconfig,"D");
if(a == KEY_INPUT_F) strcpy(keyname[c].keyconfig,"F");
if(a == KEY_INPUT_G) strcpy(keyname[c].keyconfig,"G");
if(a == KEY_INPUT_H) strcpy(keyname[c].keyconfig,"H");
if(a == KEY_INPUT_J) strcpy(keyname[c].keyconfig,"J");
if(a == KEY_INPUT_K) strcpy(keyname[c].keyconfig,"K");
if(a == KEY_INPUT_L) strcpy(keyname[c].keyconfig,"L");
if(a == KEY_INPUT_Z) strcpy(keyname[c].keyconfig,"Z");
if(a == KEY_INPUT_X) strcpy(keyname[c].keyconfig,"X");
if(a == KEY_INPUT_C) strcpy(keyname[c].keyconfig,"C");
if(a == KEY_INPUT_V) strcpy(keyname[c].keyconfig,"V");
if(a == KEY_INPUT_B) strcpy(keyname[c].keyconfig,"B");
if(a == KEY_INPUT_N) strcpy(keyname[c].keyconfig,"N");
if(a == KEY_INPUT_M) strcpy(keyname[c].keyconfig,"M");
if(a == KEY_INPUT_1) strcpy(keyname[c].keyconfig,"1");
if(a == KEY_INPUT_2) strcpy(keyname[c].keyconfig,"2");
if(a == KEY_INPUT_3) strcpy(keyname[c].keyconfig,"3");
if(a == KEY_INPUT_4) strcpy(keyname[c].keyconfig,"4");
if(a == KEY_INPUT_5) strcpy(keyname[c].keyconfig,"5");
if(a == KEY_INPUT_6) strcpy(keyname[c].keyconfig,"6");
if(a == KEY_INPUT_7) strcpy(keyname[c].keyconfig,"7");
if(a == KEY_INPUT_8) strcpy(keyname[c].keyconfig,"8");
if(a == KEY_INPUT_9) strcpy(keyname[c].keyconfig,"9");
if(a == KEY_INPUT_0) strcpy(keyname[c].keyconfig,"0");
if(a == KEY_INPUT_BACK)strcpy(keyname[c].keyconfig,"BACK_SPACE");
if(a == KEY_INPUT_TAB) strcpy(keyname[c].keyconfig,"TAB");
if(a == KEY_INPUT_RETURN) strcpy(keyname[c].keyconfig,"ENTER");
if(a == KEY_INPUT_LSHIFT) strcpy(keyname[c].keyconfig,"左SHIFT");
if(a == KEY_INPUT_RSHIFT) strcpy(keyname[c].keyconfig,"右SHIFT");
if(a == KEY_INPUT_LCONTROL)strcpy(keyname[c].keyconfig,"左CONTROL");
if(a == KEY_INPUT_RCONTROL)strcpy(keyname[c].keyconfig,"右CONTROL");
if(a == KEY_INPUT_LALT) strcpy(keyname[c].keyconfig,"左ALT");
if(a == KEY_INPUT_RALT) strcpy(keyname[c].keyconfig,"右ALT");
if(a == KEY_INPUT_ESCAPE) strcpy(keyname[c].keyconfig,"ESCAPE");
if(a == KEY_INPUT_SPACE) strcpy(keyname[c].keyconfig,"SPACE");
if(a == KEY_INPUT_PGUP) strcpy(keyname[c].keyconfig,"PageUP");
if(a == KEY_INPUT_PGDN) strcpy(keyname[c].keyconfig,"PageDOWN");
}
void keyconfig_keyname_2(){
keyconfig_keyname(configkey.up,0);
keyconfig_keyname(configkey.left,1);
keyconfig_keyname(configkey.right,2);
keyconfig_keyname(configkey.down,3);
keyconfig_keyname(configkey.a,4);
keyconfig_keyname(configkey.b,5);
keyconfig_keyname(configkey.c,6);
keyconfig_keyname(configkey.d,7);
keyconfig_keyname(configkey.l1,8);
keyconfig_keyname(configkey.l2,9);
keyconfig_keyname(configkey.r1,10);
keyconfig_keyname(configkey.r2,11);
keyconfig_keyname(configkey.select,12);
keyconfig_keyname(configkey.start,13);
}
void keyconfig_keydraw(){
DrawFormatString(50,100,CrRed,"上 :%s",keyname[0].keyconfig);
DrawFormatString(50,130,CrRed,"左 :%s",keyname[1].keyconfig);
DrawFormatString(50,160,CrRed,"右 :%s",keyname[2].keyconfig);
DrawFormatString(50,190,CrRed,"下 :%s",keyname[3].keyconfig);
DrawFormatString(50,220,CrRed,"Aボタン :%s",keyname[4].keyconfig);
DrawFormatString(50,250,CrRed,"Bボタン :%s",keyname[5].keyconfig);
DrawFormatString(50,280,CrRed,"Cボタン :%s",keyname[6].keyconfig);
DrawFormatString(50,310,CrRed,"Dボタン :%s",keyname[7].keyconfig);
DrawFormatString(50,340,CrRed,"L1ボタン :%s",keyname[8].keyconfig);
DrawFormatString(50,370,CrRed,"L2ボタン :%s",keyname[9].keyconfig);
DrawFormatString(50,400,CrRed,"R1ボタン :%s",keyname[10].keyconfig);
DrawFormatString(50,430,CrRed,"R2ボタン :%s",keyname[11].keyconfig);
DrawFormatString(50,460,CrRed,"SELECT :%s",keyname[12].keyconfig);
DrawFormatString(50,490,CrRed,"START :%s",keyname[13].keyconfig);
}
void keyconfig_config(){
int img_config = LoadGraph("");
keyconfig_padname_2();
keyconfig_keyname_2();
while(ProcessMessage() == 0){
ClearDrawScreen();
DrawGraph(0,0,img_config,FALSE);//背景絵画
//現在情報絵画
keyconfig_paddraw();
keyconfig_keydraw();
ScreenFlip();
}//while
}//関数