ページ 11

キーコンフィグ

Posted: 2012年5月24日(木) 02:02
by 01uNLUCKy
龍神録の館 8章のものを少しいじりました。
現在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
}//関数

※LoadGraphの引数はけしてあります。中身は背景画像です。

Re: キーコンフィグ

Posted: 2012年5月24日(木) 11:24
by softya(ソフト屋)
01uNLUCKy さんが書きました:今回、教えていただきたいのは、この画面で、なにかキーが押されたら、画面を切り替え、変更したいキーをとって、かぶっていなければ、置き換えるという方法です。
具体的に状態の遷移を説明してもらえますか、今の説明だとよく分かりませんので。

あと、ProcessMessage()が何箇所もある良くないプログラムの作りはされていませんよね?
「補足資料.11章 書いてはいけない4つの処理」
http://dixq.net/g/h_11.html

Re: キーコンフィグ

Posted: 2012年5月24日(木) 16:42
by 01uNLUCKy
DXライブラリ3大処理が複数回あって、よくないプログラムでした。ご指摘ありがとうございました。

本題ですが、例えば、
現在の「↑」が押されたら、”「↑」に変更したいボタンを押してください”などと文字を表示します。
ボタンが押されるのを待ちます。
ボタンを押されたらそのボタンがほかで使われていないかを調べます。
使われていなかったら、押されたボタンの値を「↑」のconfigpad.upに代入する方法が知りたいです。

説明がうまくできなくてすいません。

Re: キーコンフィグ

Posted: 2012年5月24日(木) 16:56
by softya(ソフト屋)
01uNLUCKy さんが書きました:DXライブラリ3大処理が複数回あって、よくないプログラムでした。ご指摘ありがとうございました。

本題ですが、例えば、
(1)現在の「↑」が押されたら、”「↑」に変更したいボタンを押してください”などと文字を表示します。
(2)ボタンが押されるのを待ちます。
ボタンを押されたらそのボタンがほかで使われていないかを調べます。
(3)使われていなかったら、押されたボタンの値を「↑」のconfigpad.upに代入する方法が知りたいです。

説明がうまくできなくてすいません。
(1)に関しては、専用のcongi開始のstateとどのキーをcnifigするかの情報を持てば制御できます。
(2)に関しては、CheckHitKeyAll()とGetJoypadInputState()で押されたかが分かるので待てば良いでしょう(ただし、(1)のキーが離されるのは待つ)。
(3)に関しては、そのまま(2)で調べた値を代入すれば良いのでは?

Re: キーコンフィグ

Posted: 2012年5月24日(木) 21:24
by 01uNLUCKy
softyaさんのやつを参考に考えたらできました。
softyaさんありがとうございました。

Re: キーコンフィグ

Posted: 2012年5月24日(木) 21:26
by softya(ソフト屋)
01uNLUCKy さんが書きました:softyaさんのやつを参考に考えたらできました。
softyaさんありがとうございました。
それは良かったです。
ただ、フォーラムルールにあります通り相互援助が主旨ですのでソースコードを貼っていただけると助かります。