「ボタンが押されているかどうか」だけの判定だと、
ボタンを押している間、同じ処理を何度も実行してしまう。
(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++; //押した瞬間の処理
}
※後は、描画部分でAをwsprintf(),TextOut()で表示。
※同じ考え方で、十字キーも判定できる。
十字キーの場合、「押されているかどうか」だけで判定できないので、
「前回のNum(0~9)」を保存し、
「変化した瞬間かどうか」を判定する。
Num2 = Num;
JoyData2 = JoyData;
joyGetPosEx(~~~);
※JoyData.dwXpos、dwYposを使ってNumを求める
※ボタン押した瞬間などの判定
if(Num2 != Num)
{
十字キー変化の瞬間
}