ページ 11

マウスのクリック

Posted: 2009年10月30日(金) 00:04
by cdj
すいません。わからないことがあるので質問します。
マウスをクリックしたときに敵とマウスカーソルが合ってると敵が消えて、スコアが上がるようにしたいのですが、実際コンパイルしてみると、クリックしたときに敵が消えるのまでは良いのですが、スコアの上がり方がおかしいんです。(ずっとスコアが上がったりとか)
それで、今現在マウスをクリックしてる間はずっとクリックしたことになってるのですが、それを一回クリックしたら、クリックし続けてる間でも反応?しないようにしたいんです。
なんかうまく書けないのですが、、つまり連射?をしないようにしたいのですがよくわかりません。
どうすれば良いですか?
できるだけ簡単なやり方で教えてもらえればうれしいです。

↓関数内
{
	
	if( (GetMouseInput() & MOUSE_INPUT_LEFT)!=0)
	{
		
		mouse->q_flag = true;
        for(int i = 0;i < ENEMY_MAX;i++)
		    if((enemy.x - mouse->x) * (enemy.x - mouse->x)
			    + (enemy.y - mouse->y) * (enemy.y - mouse->y)
				    <= (enemy.r + mouse->r) * (enemy.r + mouse->r))
                {       

                    enemy.flag = false;
				    mouse->q_flag = false;
					score +=5;
					break;

			}
      if((GetMouseInput() & MOUSE_INPUT_LEFT) == 0){
		mouse->q_flag = false;
         } 
	}
}

Re:マウスのクリック

Posted: 2009年10月30日(金) 01:12
by ドラ
こんな感じでどうでしょう。

if (現在マウスの左ボタンを押している && 1フレーム前にマウスの左ボタンを押していなかった)
{
  敵との当たり判定
}

Re:マウスのクリック

Posted: 2009年10月30日(金) 01:12
by Justy

>今現在マウスをクリックしてる間はずっとクリックしたことになってるのですが

 クリックですか?
 掲載されたプログラム的にはプレスしている間、のように読めます。
 
 ちなみにクリックとは、ターゲットにカーソルを合わせてマウスを押し(プレス)、
ターゲットからカーソルが外れることなくすぐに離した(リリース)状態を言うのですが、
仕様的にプレスではなく、クリックしたら敵が消えるでいいのですか?

 一応両方書いておくと
 
・ クリックした瞬間だけに反応したい場合
 前のフレームの GetMouseInput()の情報を覚えておき、前のフレームでは押されていたけど
今のフレームでは押されていないを条件にする

・ プレスした瞬間だけに反応したい場合
 前のフレームの GetMouseInput()の情報を覚えておき、前のフレームでは押されていなかったけど
今のフレームでは押されているを条件にする

で、判定すれば多分望み通りの挙動になると思います。


 尚、プレスした瞬間のほうで良ければ

C言語~ゲームプログラミングの館~
ttp://dixq.net/g/#40b

に書かれている GetHitMouseStateAll_2関数を使って、カウンタが 1であるかどうか
を調べることで押された瞬間かどうかを判別することができます。


 ちなみに内側の ifブロックの中で (GetMouseInput() & MOUSE_INPUT_LEFT) が 0であるかを
判定している if文がありますが、この if文はそもそも外側の if文で
(GetMouseInput() & MOUSE_INPUT_LEFT) が 0ではないから実行されているので、
内側の if文の条件を満たすことはまずあり得ない(理論的にはあり得るがそれは異常な状態)ので、
書く必要はありません。

Re:マウスのクリック

Posted: 2009年10月30日(金) 23:12
by cdj
>Justyさん
ありがとうございます。
自分がしたいのはプレスしたときのことです。たぶん・・

GetHitMouseStateAll_2関数のとこを見てみたのですが、どのように自分の関数に組み込むのかさっぱりわからないです。

どうやってプログラムを書けばよいかわかりません。

Re:マウスのクリック

Posted: 2009年10月30日(金) 23:34
by Justy

>どのように自分の関数に組み込むのかさっぱりわからないです

 そのサンプルは動かしてみましたか?
 画面にはメンバ Button[n]の値が表示されているので、
マウスを押したときなど、値がどう変化するか観察して仕組みを理解してください。

 そうしたらあとは、自分のソースの適当なところに Mouse_t型のオブジェクトを
生成しておいて、毎フレーム GetHitMouseStateAll_2関数を呼び出し、
あとはメンバ変数の Button[0]が 1であるかどうかを調べることで
プレスした瞬間かどうかを調べることができます。

 つまり、Mouse_t型のオブジェクトの変数名が Mouseなら
[color=#d0d0ff" face="monospace]
if(Mouse.Button[0] == 1)
[/color]

で判定することができます。

Re:マウスのクリック

Posted: 2009年11月02日(月) 22:28
by cdj
関数がどんな風に動いているのかはわかったのですが、毎フレーム呼び出す、
というのがよくわかりません。

それと、自分がやりたいのは左クリックを押したままだと連射してしまうので、
それを防止したいのですが、「プレスしたとき」の方法でだいじょうぶですか?

Re:マウスのクリック

Posted: 2009年11月03日(火) 01:06
by Justy

>毎フレーム呼び出す、というのがよくわかりません

 その 40bのサンプルでいうと、WinMain関数内の whileループで、
ループが行われる度に GetHitMouseStateAll_2が毎回呼ばれていますよね?

 これは GetHitMouseStateAll_2関数が毎フレーム呼び出され実行されるので
引数として与えた変数 Mouseの中身が更新され、そのあと Mouseの中身が
参照したときには値が変わっている、というわけです。



>「プレスしたとき」の方法でだいじょうぶですか?

 OKです。
 試しに、サンプルの方で「プレスした瞬間」に何か(例えば別の文字を出すとか
文字の色を変えるとか)して、テストしてみるとコツがつかめるかもしれません。

Re:マウスのクリック

Posted: 2009年11月04日(水) 16:51
by cdj
>Justyさん
教えてもらったやり方でちゃんとできました。

ありがとうございました。