ページ 11

キーコンフィグについて

Posted: 2013年7月24日(水) 18:01
by 長峰
新・ゲームプログラミングの館 [http://dixq.net/g/index.html]

上記サイトを参考に、キーの入力フレームを取得するクラスを作成しました。

コード:

class Keyboard{
	static const int num=256;//有効なキーの総数
	unsigned int press[num],release[num];//フレーム数を格納する変数
	bool checkValid(int keycode){return(0<=keycode && keycode<num);}//有効なキーかチェック
public:
	Keyboard();
	void update();
	int on(int keycode);//対応するキーの押されているフレーム数を取得
	int off(int keycode);//対応するキーの離されているフレーム数を取得
};

Keyboard::Keyboard(){
	memset(press,0,sizeof(press));
	memset(release,0,sizeof(release));
}

int Keyboard::on(int keycode){
	return Keyboard::checkValid(keyCode)? press[keyCode]:-1;
}

int Keyboard::off(int keycode){
	return Keyboard::checkValid(keycode)? release[keycode]:-1;
}

void Keyboard::update(){
	char tmp[num];
	GetHitKeyStateAll(tmp);
	for(int i=0;i<num;i++){
		if(tmp[i]){
			if(release[i]>0)release[i]=0;
			press[i]++;
		}else{
			if(press[i]>0)press[i]=0;
			release[i]++;
		}
	}
}
次に、キー自体の入力を入れ替える、キーコンフィグ機能を実装しようと思ったのですが、
いまいちやり方が思いつきません。

私としては、Keyboard::onやoffに与える引数を変える方法は取りたくないので、
デフォルトのキーをそのまま引数に出来るよう、
Keyboard::onやoffのメンバ関数自体を改良していきたいと思っています。

前置きが長くなりましたが、
Keyboard::on(KEY_INPUT_RIGHT)の返却値を"KEY_INPUT_LEFT"のフレーム数に対応させるような方法を教えて下さい。

また出来れば、皆さんがどのような方法を採用しているかも知りたいです。
回答よろしくお願いします。

Re: キーコンフィグについて

Posted: 2013年7月24日(水) 18:39
by softya(ソフト屋)
> デフォルトのキーをそのまま引数に出来るよう、

それは、それでデバッグ時にややこしい気がしますが、キーの変換対応テーブルをクラス内で保持していて、変更情報を設定するメンバ関数を用意すれば良いんじゃないでしょうか?

Re: キーコンフィグについて

Posted: 2013年7月24日(水) 19:20
by 長峰
softyaさん回答ありがとうございます。
softya(ソフト屋) さんが書きました: キーの変換対応テーブルをクラス内で保持して
言葉がわからず、うまく説明出来ませんでしたが、まさにその様なことを考えていました!

追加質問になって申し訳ないですが、
変換対応テーブルというのは、どのような形で用意すればいいのでしょうか。

Re: キーコンフィグについて

Posted: 2013年7月24日(水) 19:43
by softya(ソフト屋)
KEY_INPUT_RIGHTなどはint型の数値ですから、数値→数値変換なので、int配列で良いんじゃないでしょうか。
上限も256までなので、固定の配列で良いと思います。

Re: キーコンフィグについて

Posted: 2013年7月24日(水) 20:04
by 長峰
softya(ソフト屋) さんが書きました:KEY_INPUT_RIGHTなどはint型の数値ですから、数値→数値変換なので、int配列で良いんじゃないでしょうか。
上限も256までなので、固定の配列で良いと思います。
KEY_INPUT_RIGHTは数値だったのですね、それなら出来そうな気がしてきました。

まだいくつか考慮すべきことはあると思いますが
作り方のイメージがつきましたので、解決とさせて頂きます。

softyaさん、わかりやすく教えてくださりありがとうございました。