C++ ボタンの押し離しの判定 メモ

「ボタンが押されているかどうか」だけの判定だと、

ボタンを押している間、同じ処理を何度も実行してしまう。

(Aで購入 ⇒ Aを押している間、毎秒30回購入、など)

「押した瞬間」「離した瞬間」「押しっぱなし」「離しっぱなし」

などを判定できるようにしておく。

「現在のジョイスティックのデータ」と、「1回前のジョイスティックのデータ」を

くらべる事で、判定が可能になる

押した瞬間

前回・・・離されている(0

現在・・・押されている(1

0 → 0 → 0 → 0 → 1 → 1 → 1 → 0 → 0 ・・・・・

離した瞬間

前回・・・押されている(1

現在・・・離されている(0

1 → 1 → 1 → 0 → 0 ・・・・・

押しっぱなし

前回・・・押されている(1

現在・・・押されている(1

0 → 0 → 1 → 1 → 1 → 1 → 0 ・・・・・・

離しっぱなし

前回・・・離されている(0

現在・・・離されている(0

1 → 1 → 0 → 0 → 0 → 0 → 1 ・・・・・・

後はプログラムで、「前回のジョイスティックのデータ」を保存し

現在のデータとくらべてやれば、判定できる。

前回の値を保存

joyGetPosEx()の直前に、JoyDataを保存しておけば、前回のデータとして使える。

JOYINFOEX JoyData; //現在のジョイスティックのデータ

JOYINFOEX JoyData2; //前回のジョイスティックのデータ

JoyData2 = JoyData;

joyGetPosEx(JOYSTICKID1,&JoyData) //JoyDataを更新(現在の値)

サンプル(押した瞬間を判定)

JOYINFOEX JoyData;

JOYINFOEX JoyData2; を外部変数として宣言

GameCreate()内で、JoyDataの設定をしておく

GameMain()を変更

Static int A; //Aボタンを押した瞬間に+1される。

JoyData2 = JoyData;

joyGetPosEx(JOYSTICKID1,&JoyData);

if(JoyData.dwButtons & 1) != 0 //今回押されていて

&& (JoyData2.dwButtons & 1) == 0) //かつ前回は離されていたら

{

A++; //押した瞬間の処理

}

後は、描画部分でAwsprintf(),TextOut()で表示。

同じ考え方で、十字キーも判定できる。

十字キーの場合、「押されているかどうか」だけで判定できないので、

「前回のNum(0~9)」を保存し、

「変化した瞬間かどうか」を判定する。

Num2 = Num;

JoyData2 = JoyData;

joyGetPosEx(~~~);

JoyData.dwXposdwYposを使ってNumを求める

※ボタン押した瞬間などの判定

if(Num2 != Num)

{

十字キー変化の瞬間

}

C++ ジョイスティックの使用 取得データの判定 メモ

取得したデータの判定

十字キーのデータ

dwXpos ・・・十字キーの左右を表す。

左 ⇒ 10000以下

中央⇒ 30000前後  の数が入る。

右 ⇒ 50000以上

dwYpos ・・・十字キーの上下を表す。

上 ⇒ 10000以下

中央⇒ 30000前後  の数が入る。

下 ⇒ 50000以上

ボタンのデータ

各ビットが、「ボタンが押されているかどうか」を表す。

………0000_0000

・・・・ ・・BA

0ビット目・・・Aが押されていたら1

離されていたら0

1ビット目・・・Bが押されていたら1

離されていたら0

ボタンを調べる時は、ビット操作を使って

調べたいビットのみを調べる。

Aボタン・・・JoyData.dwButtons & 1

0でなければ(押) 0001

Bボタン・・・JoyData.dwButtons & (1<<1)

0でなければ(押) 0010

サンプル

GameMain()の文字表示部分

//十字キー左右

if(JoyData.dwXposos <= 10000)

{

※「X軸 = 左」と表示

}else if(JoyData.dwXpos >= 50000)

{

※「X軸 = 右」と表示

}else

{

※「X軸 = 中央」と表示

}

//十字キー上下

if(JoyData.dwYpos <= 10000)

{

※「Y軸 = 上」と表示

}else if(JoyData.dwYpos >= 50000)

{

※「Y軸 = 下」と表示

}else

{

※「Y軸 = 中央」と表示

}

//Aボタン(ボタン0

if(JoyData.dwButtons & 1)

{

※「A = 押」と表示

}else

{

※「A = 離」と表示

}

//Bボタン(ボタン1

if(JoyData.dwButtons & (1<<1))

{

※「B = 押」と表示

}else

{

※「B = 離」と表示

}