ページ 11

マウスの入力状態取得について

Posted: 2012年7月16日(月) 04:40
by 総統
現在,DXライブラリで15パズルを制作しています.

マウスで左クリックされたところのピースを動かすという処理を行いたいのですが,
左クリックをするとチャタリング?が発生し,一回クリックしたつもりでも10回クリックしたことになってしまいます.
このため,ピースの交換が高速で何回も行われ,ちらつきが起きます.
左クリックがされたら一回だけカウントしたいのですがどうすればよいでしょうか.
宜しくお願いします.
以下はマウスの入力チェックを行い,15枚のピースのどこが選択されたかを調べる関数です.

コード:

int MousePointCheck(void){
	int MouseX,MouseY;
	static int MouseXbuf,MouseYbuf;
	static int MousePlace;

	//マウスの座標取得
	GetMousePoint(&MouseX,&MouseY);

	//左ボタンが押されたら
	if( GetMouseInput() && MOUSE_INPUT_LEFT){

		//どこの列か X
		if(MouseX>0 && MouseX<=120) MouseXbuf=0;
		if(MouseX>120 && MouseX<=240) MouseXbuf=1;
		if(MouseX>240 && MouseX<=360) MouseXbuf=2;
		if(MouseX>360 && MouseX<=480) MouseXbuf=3;

		//どこの行か Y
		if(MouseY>0 && MouseY<=120) MouseYbuf=0;
		if(MouseY>120 && MouseY<=240) MouseYbuf=1;
		if(MouseY>240 && MouseY<=360) MouseYbuf=2;
		if(MouseY>360 && MouseY<=480) MouseYbuf=3;

		//上記からどのピースがクリックされたか判断
		MousePlace=MouseXbuf+4*MouseYbuf;

		//クリックされたピース番号を返す
		return MousePlace;

	}

	//クリックされなかった場合
	else return -1;

}


Re: マウスの入力状態取得について

Posted: 2012年7月16日(月) 07:38
by h2so5
GetMouseInput()はクリックされたかどうかではなくボタンが押されているかどうかの状態を返すので、
前回の入力状態を記録しておいて、クリックされたのかずっと押し続けているのか判断する必要があります。
チャタリングではありません。

Re: マウスの入力状態取得について

Posted: 2012年7月16日(月) 08:07
by nil

コード:

        if(MouseX>0 && MouseX<=120) MouseXbuf=0;
        if(MouseX>120 && MouseX<=240) MouseXbuf=1;
        if(MouseX>240 && MouseX<=360) MouseXbuf=2;
        if(MouseX>360 && MouseX<=480) MouseXbuf=3;
 
        //どこの行か Y
        if(MouseY>0 && MouseY<=120) MouseYbuf=0;
        if(MouseY>120 && MouseY<=240) MouseYbuf=1;
        if(MouseY>240 && MouseY<=360) MouseYbuf=2;
        if(MouseY>360 && MouseY<=480) MouseYbuf=3;
これらは
MouseXbuf = MouseX/120;
で簡略化できますね。

マウスの入力についてはここを参考になさると良いです。

Re: マウスの入力状態取得について

Posted: 2012年7月16日(月) 13:28
by 総統
ありがとうございました.
解決できました.

Re: マウスの入力状態取得について

Posted: 2012年7月17日(火) 16:44
by asd
総統 さんが書きました:ありがとうございました.
解決できました.
どうやって解決したのか、解決後のソースを提示していただけないでしょうか?
このフォーラムではフォーラムルールにあるとおり、解決後にはどのように解決したかを明示することになっています。

http://dixq.net/board/board.html
---以下、フォーラムルールから引用
また、解決した時は、「解決しました」とだけ言って去らず、ソースコードや解決した方法を明記して下さい。

同じ事で困っている人の為に過去ログに有用な情報を残すようお願いします。