戻る 13. 同時押しキー入力 次へ


以前にキー入力を説明しましたが
MIDPではキーを押したときと離した時しか
状態を取れないので現在押しているキーや同時押しを
検出する事は出来ません。

それをどうにかして取って見ようと思います。


まず手順をまとめます。

・キーを押すとどのキーは押されているかを保存する。
・キーを離すとどのキーは離されてるかを保存する
・取得する時にどのキーが押されてるかを保存している変数を見る

と言う事でキーが押された時にそのキーを押した時にする反応を書かないで
どのキーが押されているか?を保存しておけばいいのです。

押してるか押してないかの判断なのでビット単位でフラグをもてます。
これを利用してソースを書きます

//キーフラグ
private final static int	_UP	=1,
				_DOWN	=2,
				_LEFT	=4,
				_RIGHT	=8,
				_STAR	=16,
				_POUND	=32,
				_KEY_0	=64,
				_KEY_1	=128,
				_KEY_2	=256,
				_KEY_3	=512,
				_KEY_4	=1024,
				_KEY_5	=2048,
				_KEY_6	=4096,
				_KEY_7	=8192,
				_KEY_8	=16384,
				_KEY_9	=32768,
				_FIRE	=65536;
int _key;//キーフラグ保存用

// キーダウン状態の取得
void keyPressed(int keycode)
{
	if(keycode==0){return;}//ezplusメモクリアキー対処(J-PHONEでは要りません)
	int action = getGameAction(keycode);

	if(action	==	UP	){	_key|=_KEY_UP;}
	if(action	==	DOWN	){	_key|=_KEY_DOWN;}
	if(action	==	LEFT	){	_key|=_KEY_LEFT;}
	if(action	==	RIGHT	){	_key|=_KEY_RIGHT;}
	if(keycode	==	KEY_NUM0){	_key|=_KEY_0;}
	if(keycode	==	KEY_NUM1){	_key|=_KEY_1;}
	if(keycode	==	KEY_NUM2){	_key|=_KEY_2;}
	if(keycode	==	KEY_NUM3){	_key|=_KEY_3;}
	if(keycode	==	KEY_NUM4){	_key|=_KEY_4;}
	if(keycode	==	KEY_NUM5){	_key|=_KEY_5;}
	if(keycode	==	KEY_NUM6){	_key|=_KEY_6;}
	if(keycode	==	KEY_NUM7){	_key|=_KEY_7;}
	if(keycode	==	KEY_NUM8){	_key|=_KEY_8;}
	if(keycode	==	KEY_NUM9){	_key|=_KEY_9;}
}
// キーアップ状態の取得
void keyPressed(int keycode)
{
	int action = getGameAction(keycode);

	if(action	==	UP	){	_key^=_KEY_UP;}
	if(action	==	DOWN	){	_key^=_KEY_DOWN;}
	if(action	==	LEFT	){	_key^=_KEY_LEFT;}
	if(action	==	RIGHT	){	_key^=_KEY_RIGHT;}
	if(keycode	==	KEY_NUM0){	_key^=_KEY_0;}
	if(keycode	==	KEY_NUM1){	_key^=_KEY_1;}
	if(keycode	==	KEY_NUM2){	_key^=_KEY_2;}
	if(keycode	==	KEY_NUM3){	_key^=_KEY_3;}
	if(keycode	==	KEY_NUM4){	_key^=_KEY_4;}
	if(keycode	==	KEY_NUM5){	_key^=_KEY_5;}
	if(keycode	==	KEY_NUM6){	_key^=_KEY_6;}
	if(keycode	==	KEY_NUM7){	_key^=_KEY_7;}
	if(keycode	==	KEY_NUM8){	_key^=_KEY_8;}
	if(keycode	==	KEY_NUM9){	_key^=_KEY_9;}
}
//取得時
void mainloop()
{ 
	if(	(_key & _KEY_UP)!= 0){}   //上キーを押してる時の処理
	if(	(_key & _KEY_DOWN)!= 0){} //下キーを押してる時の処理
	if(	(_key & _KEY_LEFT)!= 0){} //左キーを押してる時の処理
	if(	(_key & _KEY_RIGHT)!= 0){}//右キーを押してる時の処理

	//同時押しも可能です
	if(	(_key & _KEY_UP)!= 0 &&
		(_key & _KEY_RIGHT)!= 0)
	{
		//右上を押した時の処理
	}
}

このようにどのキーが押されてるかを保存して
必要な時にキーフラグを見れば同時押しでも
現在押されているキーでも取得できます。

ただしキーメッセージが来た時に取得するわけですから
あまりにも連打するとキーバッファが溜まって
キーを離してからもメッセージが届いてキーを押していると判断されたりします。

処理が重いときにすると余計目立つので注意してください。