ページ 1 / 1
右ドラッグで図形を描画。
Posted: 2011年11月30日(水) 21:52
by 田中中田
はじめまして。ゲームプログラミングの館などで勉強させていただいてます。
自分は、マウスの右ボタンでドラッグしている間、四角形を描画し、
右ボタンを離すと四角形が消えるプログラムを作りたいです。
左ボタンでは上手くできたのですが、
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;
}
Re: 右ドラッグで図形を描画。
Posted: 2011年11月30日(水) 21:59
by h2so5
始点が(x,y)=(0,0)で固定されてしまう場合のプログラムも書いてください。
Re: 右ドラッグで図形を描画。
Posted: 2011年11月30日(水) 22:08
by 田中中田
>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に変えただけです。
Re: 右ドラッグで図形を描画。
Posted: 2011年11月30日(水) 23:42
by ISLe
押されているかどうかは
== 1
ではなく
!= 0
で判断してください。
左ボタンのときはMOUSE_INPUT_LEFTが1なのでたまたまうまく動いていただけです。
Re: 右ドラッグで図形を描画。
Posted: 2011年12月01日(木) 00:03
by 田中中田
>ISLeさん
!=0に変えたら見事に動いてくれました。
自分は今まで、0と1で判断しているものと勘違いしていました。
解りやすく簡潔な回答ありがとうございました。
Re: 右ドラッグで図形を描画。
Posted: 2011年12月01日(木) 01:03
by hss12
参考程度に調べてみたら、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: 右ドラッグで図形を描画。
Posted: 2011年12月01日(木) 02:03
by 田中中田
>hss12さん
左が1で右が2だから中央はてっきり3だと思いましたよ、今後の為になる教えでした。
>if( Mouse == 0 )
>で良い気もしますが。
実行したら問題なく動きました。
この辺りはあまり理解してないので
短くなるよう教えて頂いて感謝します。
>else if ではなく else だけで良いですね。
ええ、そうですね。その通りでした。短いコードを書けるようになる道は通そうです。
親切で、ご丁寧な説明ありがとうございます。
Re: 右ドラッグで図形を描画。
Posted: 2011年12月01日(木) 03:09
by ISLe
コード:
Mouse = GetMouseInput();
if( Mouse == MOUSE_INPUT_RIGHT ) {
// マウスボタンの右『だけ』が押されているとき
}
else {
// マウスボタンの右が離されていなくても、右以外が押されたら該当する
}
コード:
Mouse = GetMouseInput();
if( Mouse == MOUSE_INPUT_RIGHT ){
// マウスボタンの右『だけ』が押されているとき
}
else if( Mouse == 0 ){
// マウスボタンの右を押したまま右以外を押して、右以外を押したまま右を離した場合該当しない
}
というふうになりますけど。
それが期待通りなら良いのですが。
Re: 右ドラッグで図形を描画。
Posted: 2011年12月01日(木) 11:57
by hss12
田中中田 さんが書きました:>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: 右ドラッグで図形を描画。
Posted: 2011年12月01日(木) 23:14
by 田中中田
>ISLeさん
えーと、だ、だ、だ、大丈夫です。
期待通りの動きです!
・・・今回はたまたま(笑)
いつか使うかもしれないのでメモ帳で保存させていただきます。
else とelse if の二つの例まで説明してくださり、ありがとうございました。
>hss12さん
>GetMouseInput(); から何が返ってくるのか分かるはずです。
>同時押しした場合は足した合計の数値が返ってきます。
凄いですね、これ。
ちゃんと押したボタンと対応した数値が返ってくる。
コードまで書いてくださって、ありがとうございました。