右ドラッグで図形を描画。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
田中中田

右ドラッグで図形を描画。

#1

投稿記事 by 田中中田 » 8年前

はじめまして。ゲームプログラミングの館などで勉強させていただいてます。

自分は、マウスの右ボタンでドラッグしている間、四角形を描画し、
右ボタンを離すと四角形が消えるプログラムを作りたいです。

左ボタンでは上手くできたのですが、
MOUSE_INPUT_LEFTの部分をMOUSE_INPUT_RIGHTに変えたら
始点が(x,y)=(0,0)で固定されてしまいます。

何がいけないのか解りませんが、この機能を右ボタンで動くようにしたいです。

Cの知識は初心者です。

OSはWindowsXP、
コンパイラはVisual C++ 2010 Expless、
ライブラリはDXライブラリ です。
宜しくお願いします。

コード:

 #include "DxLib.h"

typedef struct{
    int x;
    int y;          //座標
}start_t,end_t;

	start_t start;
	end_t end;

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更,初期化,裏画面設定

	int x,y,Mouse,White;
	White   = GetColor( 255 , 255 , 255 ) ; // 白色の値を取得

	// while( 裏画面を表画面に反映, メッセージ処理, 画面クリア )
	while( !ScreenFlip() && !ProcessMessage() && !ClearDrawScreen() ){
			Mouse = GetMouseInput();                //マウスの入力状態取得
			GetMousePoint( &x, &y );                //マウスの座標取得
			if( (Mouse & MOUSE_INPUT_LEFT) == 1 ){ //マウスの左ボタンが押されたら
            // マウスカーソルの位置を取得して、始点として保存しておく
			start.x = x;
			start.y = y;
            }
			else if( (Mouse & MOUSE_INPUT_LEFT) == 0 ){	//マウスの左ボタンが離されたなら
			end.x = x;
			end.y = y;
			continue;
			}
			DrawBox   (  start.x, start.y, end.x, end.y , White , FALSE) ;   // 四角形を描画
		}
        DxLib_End();
        return 0;
} 

アバター
h2so5
副管理人
記事: 2212
登録日時: 9年前
住所: 東京
連絡を取る:

Re: 右ドラッグで図形を描画。

#2

投稿記事 by h2so5 » 8年前

始点が(x,y)=(0,0)で固定されてしまう場合のプログラムも書いてください。

田中中田

Re: 右ドラッグで図形を描画。

#3

投稿記事 by 田中中田 » 8年前

>h2so5さん
すみません、見てくれる人に対して配慮が足りませんでした。

コード:

 #include "DxLib.h"

typedef struct{
    int x;
    int y;          //座標
}start_t,end_t;

	start_t start;
	end_t end;

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更,初期化,裏画面設定

	int x,y,Mouse,White;
	White   = GetColor( 255 , 255 , 255 ) ; // 白色の値を取得

	// while( 裏画面を表画面に反映, メッセージ処理, 画面クリア )
	while( !ScreenFlip() && !ProcessMessage() && !ClearDrawScreen() ){
			Mouse = GetMouseInput();                //マウスの入力状態取得
			GetMousePoint( &x, &y );                //マウスの座標取得
			if( (Mouse & MOUSE_INPUT_RIGHT) == 1 ){ //マウスの右ボタンが押されたら
            // マウスカーソルの位置を取得して、始点として保存しておく
			start.x = x;
			start.y = y;
            }
			else if( (Mouse & MOUSE_INPUT_RIGHT) == 0 ){	//マウスの右ボタンが離されたなら
			end.x = x;
			end.y = y;
			continue;
			}
			DrawBox   (  start.x, start.y, end.x, end.y , White , FALSE) ;   // 四角形を描画
		}
        DxLib_End();
        return 0;
}
LEFTをRIGHTに変えただけです。

ISLe
記事: 2645
登録日時: 9年前
連絡を取る:

Re: 右ドラッグで図形を描画。

#4

投稿記事 by ISLe » 8年前

押されているかどうかは
== 1
ではなく
!= 0
で判断してください。

左ボタンのときはMOUSE_INPUT_LEFTが1なのでたまたまうまく動いていただけです。

田中中田

Re: 右ドラッグで図形を描画。

#5

投稿記事 by 田中中田 » 8年前

>ISLeさん
!=0に変えたら見事に動いてくれました。
自分は今まで、0と1で判断しているものと勘違いしていました。

解りやすく簡潔な回答ありがとうございました。

hss12
記事: 40
登録日時: 8年前

Re: 右ドラッグで図形を描画。

#6

投稿記事 by hss12 » 8年前

参考程度に調べてみたら、MOUSE_INPUT_RIGHTは2ですね。
例えば左右を同時に押した場合

コード:

 0000 0001 //左クリック (1)
 0000 0010 //右クリック (2)
-----------
 0000 0011 //左右同時押し (3)
こうなり左右同時押しは3ということですね。
ちなみに中央ボタンが4なので

コード:

 0000 0001 //左クリック (1)
 0000 0100 //中央クリック (4)
-----------
 0000 0101 //左中央同時押し (5)
左中央同時押しが5となります。
右中央同時押しが6、
左右中央同時押しが7になります。


if( (Mouse & MOUSE_INPUT_LEFT) == 1 ){ //マウスの左ボタンが押されたら

この場合

コード:

 0000 0001 //Mouse 左クリック (1)
&0000 0001 //MOUSE_INPUT_LEFT (1)
-----------
 0000 0001 //(1)
となり結果が1なので成立しますが
if( (Mouse & MOUSE_INPUT_RIGHT) == 1 ){ //マウスの右ボタンが押されたら
の場合は

コード:

 0000 0010 //Mouse 右クリック (2)
&0000 0010 //MOUSE_INPUT_RIGHT (2)
-----------
 0000 0010 //(2)
となり1ではなく2になってしまいます。
if( (Mouse & MOUSE_INPUT_RIGHT) == 2 ){ //マウスの右ボタンが押されたら
とすれば動くでしょう。

早い話が
if( Mouse == 2 ){ //マウスの右ボタンが押されたら

else if( Mouse == 0 ){ //マウスの右ボタンが離されたなら
で動きますよということですが、分かりにくいので

&で書いて !=0 で良いと思います。
ボタンが離されたときの処理は
if( Mouse == 0 )
で良い気もしますが。
ちなみに質問者さんのコードの場合は else if ではなく else だけで良いですね。

田中中田

Re: 右ドラッグで図形を描画。

#7

投稿記事 by 田中中田 » 8年前

>hss12さん
左が1で右が2だから中央はてっきり3だと思いましたよ、今後の為になる教えでした。

>if( Mouse == 0 )
>で良い気もしますが。

実行したら問題なく動きました。
この辺りはあまり理解してないので
短くなるよう教えて頂いて感謝します。

>else if ではなく else だけで良いですね。
ええ、そうですね。その通りでした。短いコードを書けるようになる道は通そうです。

親切で、ご丁寧な説明ありがとうございます。

ISLe
記事: 2645
登録日時: 9年前
連絡を取る:

Re: 右ドラッグで図形を描画。

#8

投稿記事 by ISLe » 8年前

コード:

Mouse = GetMouseInput();
if( Mouse == MOUSE_INPUT_RIGHT ) {
    // マウスボタンの右『だけ』が押されているとき
}
else {
    // マウスボタンの右が離されていなくても、右以外が押されたら該当する
}

コード:

Mouse = GetMouseInput();
if( Mouse == MOUSE_INPUT_RIGHT ){
    // マウスボタンの右『だけ』が押されているとき
}
else if( Mouse == 0 ){
    // マウスボタンの右を押したまま右以外を押して、右以外を押したまま右を離した場合該当しない
}
というふうになりますけど。
それが期待通りなら良いのですが。

hss12
記事: 40
登録日時: 8年前

Re: 右ドラッグで図形を描画。

#9

投稿記事 by hss12 » 8年前

田中中田 さんが書きました:>hss12さん
>if( Mouse == 0 )
>で良い気もしますが。

実行したら問題なく動きました。
この辺りはあまり理解してないので
短くなるよう教えて頂いて感謝します。

コード:

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更,初期化,裏画面設定

	int Mouse, White;
	White = GetColor( 255 , 255 , 255 ); // 白色の値を取得

	// while( 裏画面を表画面に反映, メッセージ処理, 画面クリア )
	while( !ScreenFlip() && !ProcessMessage() && !ClearDrawScreen() ){
		Mouse = GetMouseInput(); //マウスの入力状態取得

		DrawFormatString( 0,   0, White, "Mouse = %d", Mouse );
		DrawFormatString( 0,  20, White, "MOUSE_INPUT_LEFT = %d", MOUSE_INPUT_LEFT );
		DrawFormatString( 0,  40, White, "MOUSE_INPUT_RIGHT = %d", MOUSE_INPUT_RIGHT );
		DrawFormatString( 0,  60, White, "MOUSE_INPUT_MIDDLE = %d", MOUSE_INPUT_MIDDLE );
		DrawFormatString( 0,  80, White, "MOUSE_INPUT_4 = %d", MOUSE_INPUT_4 );
		DrawFormatString( 0, 100, White, "MOUSE_INPUT_5 = %d", MOUSE_INPUT_5 );
		DrawFormatString( 0, 120, White, "MOUSE_INPUT_6 = %d", MOUSE_INPUT_6 );
		DrawFormatString( 0, 140, White, "MOUSE_INPUT_7 = %d", MOUSE_INPUT_7 );
		DrawFormatString( 0, 160, White, "MOUSE_INPUT_8 = %d", MOUSE_INPUT_8 );
	}
	DxLib_End();
	return 0;
}
これを試してみてください。
GetMouseInput(); から何が返ってくるのか分かるはずです。
同時押しした場合は足した合計の数値が返ってきます。

田中中田

Re: 右ドラッグで図形を描画。

#10

投稿記事 by 田中中田 » 8年前

>ISLeさん
えーと、だ、だ、だ、大丈夫です。
期待通りの動きです!
・・・今回はたまたま(笑)
いつか使うかもしれないのでメモ帳で保存させていただきます。
else とelse if の二つの例まで説明してくださり、ありがとうございました。



>hss12さん
>GetMouseInput(); から何が返ってくるのか分かるはずです。
>同時押しした場合は足した合計の数値が返ってきます。

凄いですね、これ。
ちゃんと押したボタンと対応した数値が返ってくる。
コードまで書いてくださって、ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る