トップページ > 記事閲覧
マウスクリックで次の処理へ
名前:あき 日時: 2014/08/15 16:43

ひどく初歩的で申し訳ないのですが、ボタンとして表示してある画像をクリックすると次の処理へ、というプログラムについて聞かせてください。 -------------------------------------------------------------------------------- if(画像の領域内にマウスがある){ if( ( GetMouseInput() & MOUSE_INPUT_LEFT ) != 0 ){ x = 1;         処理; } } if(画像の領域内にマウスがある && x == 1){ if( ( GetMouseInput() & MOUSE_INPUT_LEFT ) != 0 ){ x = 2;         処理; } } if(画像の領域内にマウスがある && x == 2){ if( ( GetMouseInput() & MOUSE_INPUT_LEFT ) != 0 ){ x = 3;         処理; } } -------------------------------------------------------------------------------- 画像の領域をクリックすると次の処理へ、もう一度同じ画像の領域をクリックすると次の処理へ…と繰り返したくてこの通りに書いてみたのですが、一度その画像をクリックしただけで全てをすっ飛ばして最後の処理を行ってしまいます。 もちろんこの書き方ではそうなってしまうとは分かっているのですが、これをどうすれば前述通りのプログラムに出来るのかが分からずに困っています。 本当に初歩的な質問で申し訳ありませんが、ご意見をいただけると幸いです。
メンテ

Page: 1 |

Re: マウスクリックで次の処理へ ( No.1 )
名前:ろぜ 日時:2014/08/15 17:40

ifを三つ連続でかくと、それぞれ判定してしまうと思うのですが・・ if(画像の領域内にマウスがある){ if( ( GetMouseInput() & MOUSE_INPUT_LEFT ) != 0 ){ x = 1;         処理; } } でxが1になったあと if(画像の領域内にマウスがある && x == 1){ の処理に連続して入ってしまいます。 elseを付けるか、switchでxの値でケースを別けるかすれば期待する動作になると思います
メンテ
Re: マウスクリックで次の処理へ ( No.2 )
名前:あき 日時:2014/08/16 21:24

ご意見本当にありがとうございます。 確かにifを三つ書くとそれぞれ判定しちゃいますよね…そんな簡単なことにも気づきませんでした。 ご指摘通り、 -------------------------------------------------------------------------------- if(画像の領域内にマウスがある){ if( ( GetMouseInput() & MOUSE_INPUT_LEFT ) != 0 ){ x = 1;         処理; } }else if(画像の領域内にマウスがある && x == 1){ if( ( GetMouseInput() & MOUSE_INPUT_LEFT ) != 0 ){ x = 2;         処理; } }else if(画像の領域内にマウスがある && x == 2){ if( ( GetMouseInput() & MOUSE_INPUT_LEFT ) != 0 ){ x = 3;         処理; } } -------------------------------------------------------------------------------- にしてみたり、switch文を書くのは初めてだったのですが調べてみて上記のあとに -------------------------------------------------------------------------------- switch(x){ case 1:  処理;  break; case 2:  処理;  break; case 3:  処理; break; } -------------------------------------------------------------------------------- という風にも記述してみたのですが、やっぱり画像をクリックすると一番最後の処理(これで言うとxが3の時の処理)まで飛んでしまいました…。ううん、私の書き方が悪いのでしょうか…。
メンテ
Re: マウスクリックで次の処理へ ( No.3 )
名前:ろぜ 日時:2014/08/16 22:03

あきさんがどのような状況を「全てをすっ飛ばして」というのか、そしてどのようにその処理を呼んでいるのかが分からないのでちょっとズレてるかもですが・・ 例えば次のように書いてみると、左クリック一回でxが3まですぐに増えてしまいます。 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { // ウインドウモードで起動 ChangeWindowMode( TRUE ) ; // ライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; int x = 0 ; // ESCキーが押されるか、ウインドウが閉じられるまでループ while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { // 画面をクリア ClearDrawScreen() ; if(x == 0) { if( ( GetMouseInput() & MOUSE_INPUT_LEFT ) != 0 ) { x = 1; } } else if(x == 1) { if( ( GetMouseInput() & MOUSE_INPUT_LEFT ) != 0 ) { x = 2; } } else if(x == 2) { if( ( GetMouseInput() & MOUSE_INPUT_LEFT ) != 0 ) { x = 3; } } DrawFormatString( 0, 0, GetColor(255,255,255), "x = %d", x ) ; // 裏画面の内容を表画面に反映 ScreenFlip() ; } // ライブラリの後始末 DxLib_End() ; // ソフト終了 return 0 ; } ただこれはこの処理が毎フレーム高速で呼ばれているからであって、例えばfps60で動作しているのなら、0.016秒以内に左クリックを離さないと、次のフレームでも if( ( GetMouseInput() & MOUSE_INPUT_LEFT ) != 0 )でクリック有効と判断されて、結局高速でxが3まで増えます。 そのために int input_LEFT = 0; // ESCキーが押されるか、ウインドウが閉じられるまでループ while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { // 画面をクリア ClearDrawScreen() ; //クリックされ続けていれば、値を増やしていく if( ( GetMouseInput() & MOUSE_INPUT_LEFT ) != 0 ) { //入力あり input_LEFT ++ ; } //クリックが一瞬でも離れれば else { //入力は0になる input_LEFT = 0 ; } if(x == 0){ if( input_LEFT == 1 ) { x = 1; } } else if(x == 1){ if( input_LEFT == 1 ) { x = 2; } } else if(x == 2){ if( input_LEFT == 1 ) { x = 3; } } やっつけなのでスマートじゃないですが、このようにしてあげると押し続けられているか、押した瞬間なのかで別けることができます。 0なら入力なし、1なら押したその瞬間、1以上なら押し続けですね。 この場合だと、マウスを三回カチカチやらないとxは3まで増えません。
メンテ
Re: マウスクリックで次の処理へ ( No.4 )
名前:あき(解決) 日時:2014/08/17 14:33

ろぜさんのソースを参考に作り直してみたところ、無事に理想通りの動きをしてくれるようになりました。 解説などもとても分かりやすく丁寧に教えていただき、本当にありがとうございました!
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存