DXによるマウス操作について

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

DXによるマウス操作について

#1

投稿記事 by C.P.P » 18年前

こちらのページではいつも丁寧に教えていただいて、大変助かっております。
以前は構造体の質問をさせていただいたのですが、大変親切にご指導いただきましてありがとうございました。

さて、今回はマウスを使った関数についての質問です。

現在、Borland C++とBCCデベロッパーを用いて、簡単なアプリケーションソフトを作成しております。
自分自身で組んだプログラムを実行しますと、左上にDrawBoxで描いた画像が出てきます。その画像をマウスでクリックするとDrawLine,DrawBox,DrawTriangleで描いた家の画像が出てきます。
その画像をマウスによって動かしたいのですが、何かいい関数や、他の関数の応用などはありませんでしょうか?

出来るだけ自分自身で、組んでみたのですが、どう頑張っても出来ませんでした・・・
ヒントやコツ等でもぜんぜん助かりますので、どなたか教えていただけないでしょうか??

宜しくお願いいたしますm(v_v)m

\n

Re:毎度お世話になっております。

#2

投稿記事 by \n » 18年前

回答ではないです。

質問に関係あるタイトルをつけれませんか?

お世話になっているとか、わからないとかは本文に書けばいいです。
もっと重要な「なにについての質問なのか」ということが分かるようにタイトルをつけましょう。

C.P.P

Re:毎度お世話になっております。

#3

投稿記事 by C.P.P » 18年前

分かりました。
こちらの不手際で気分を害してしまいまして申し訳ございません。
これから気をつけます。

また、タイトル変更までしていただきましてありがとうございました。

回答ではありませんでしたが、今後為になる指摘でした。
ありがとうございました☆

tk-xleader

Re:毎度お世話になっております。

#4

投稿記事 by tk-xleader » 18年前

マウスによってグラフィックを動かしたいのですよね?
見当違いかもしれませんが、マウスに四角形がついていくプログラムのサンプルコードを載せます。
#include"DxLib.h"

int WINAPI WinMain(HINSTANCE hInstance,
		   HINSTANCE hPrevInstance,
		   LPSTR lpCmdLine,
		   int nCmdShow)
{
	int x=320-16,y=240-16;
	int moux,mouy;
	
	ChangeWindowMode(TRUE);
	SetMainWindowText("sample");
	SetOutApplicationLogValidFlag(FALSE);
	if(DxLib_Init()==-1)return -1;
	SetDrawScreen(DX_SCREEN_BACK);
	
	while(ProcessMessage()!=-1&&CheckHitKey(KEY_INPUT_I)==0){
		
		DrawBox(x,y,x+32,y+32,GetColor(0,0,255),FALSE);
		
		ScreenFlip();
		ClearDrawScreen();
		
		GetMousePoint(&moux,&mouy);
		x=moux;
		y=mouy;
		
	}
	DxLib_End();
	return 0;
}
プログラム実行中にキーを押すと終了します。

Justy

Re:毎度お世話になっております。

#5

投稿記事 by Justy » 18年前

 マウスによるドラッグ処理ですね。
 やらなければならない要素はいくつもあり、ちょっと大変です。

 一応前回投稿されていたときには、オブジェクト(箱状)とマウスのクリックが
接触した状態の検出までは出来ていました。


 ここから、そのまま押しっぱなしになっている状態でマウスが移動したら、
それに合わせてオブジェクトを移動させ、マウスを離したらそこでオブジェクトの
移動を止める、という処理を加えます。

 つまり、マウスがどういう状態にあるかを毎フレームチェックして、
状態が変化したことを検出する必要があります。

 これには家の情報に「今オブジェクトがドラッグされているかどうか」のフラグを
追加して下さい。
 ドラッグされていない状態で、マウスのクリックがオブジェクトに接触していたら
ドラッグ開始なので、そのフラグを立てます。
 反対にドラッグされているフラグがついているのに、マウスが押されていなければ
そこでドラッグ終了ということで、フラグを下ろします。

 ドラッグされているフラグが立っているなら、マウスの動きに追わせて、
オブジェクトの位置を変更します。


 ここで注意が必要なのですが、マウスの位置とオブジェクトの位置を同じに
してしまうと、マウスを押した瞬間にオブジェクトが移動してしまいます。

 接触の判定を点と点でやっているわけでなく箱と点でやっている為、
マウスの位置と箱の(管理上の)位置にはずれがあります。
 そのずれを無視して、位置を同じにしてしまうと瞬時にズレが発生するというわけです。

 そこで、そのずれがどれだけあるかをクリックされた時に調べて、オブジェクトを
移動させるときにそのずれの分だけずらして、オブジェクトの位置を設定しなければ
なりません。

 ここまでやって、普通のドラッグ処理は完成します。


 サンプルを添付しました。

・ drag_test1.cpp
 C.P.Pさんのコードの改良版
 マウス中央ボタンで表示・非表示の切り替え

・ drag_test2.cpp
 クラス版
 左ドラッグで複数のオブジェクトをドラッグ
 右ドラッグで1つのオブジェクトをドラッグ

C.P.P

ご指導ありがとうございます。

#6

投稿記事 by C.P.P » 18年前

tkmakwins15さん、Justy さん本当に助かりました☆
丁寧にサンプルプログラムまで書いていただき、ありがとうございます。

> tkmakwins15さん
全くもって見当外れなんかではありません☆
今まで全くもってマウスを用いた座標移動上手く行かなかった私に大変助かる助け舟です☆
大変参考にさせていただきました♪ありがとうございます。

>Justy さん
またまた、丁寧なサンプルプログラムありがとうございます☆
しかも私が以前載せさせていただいたプログラムから、サンプルを作っていただけるなんて♪
ちょっと感動してしまいました☆
現在、そのプログラムの中身を理解しようと必死です。
本当にありがとうございます。

さて、Justy さんのサンプルプログラムを勉強してる中で、家を描写するプログラム

DrawBox
(
home->disp_pos.x+home->scale*1, home->disp_pos.y+home->scale*3,
home->disp_pos.x+home->scale*9, home->disp_pos.y+home->scale*11,
home->is_dragging? Yellow: White, TRUE
);

(これは、白い四角い四角形の塗りつぶしの描写)
というのがあるんですけど、今まで私がやってきました描写関数では全く理解が出来ませんでした↓

まだ、たいしたプログラム能力もありませんで申し訳ございません↓
お手数おかけしますが説明、ご指導お願いします・・・

よろしくお願いします☆

管理人

Re:ご指導ありがとうございます。

#7

投稿記事 by 管理人 » 18年前

中身のプログラムは見ていないのですが、
いつも使っていらっしゃるドローボックス関数と同じです。
引数の描き方がちょっと特殊なだけで。
第四引数までの理解はOKでしょうか?第五引数は三項演算子が使われているようです。
こちらで勉強してみてください。

http://www5c.biglobe.ne.jp/~ecb/java/05_08.html
(条件式) ? ① : ②
 

とかく事で、if文を使わずに条件分岐させる事が出来ます。
具体的には
home->is_dragging
の値によって黄色にするか白にするか決めているようです。
条件式 にあたる部分はべつに式でなくてもよく、

if(1){
①;
}

if(0){
②;
}

でどのような処理が行われるかと考えたらわかるとおり、真か偽かを示せばOKです。

C.P.P

ありがとうございます。

#8

投稿記事 by C.P.P » 18年前

返信ありがとうございます。
さっそくURL内で勉強させていただきました。

if文の他にもこんな関数があるとは・・・
まだまだ勉強が全然足りないみたいですね↓すいません。

しかし、おかげさまで描写関数のほう理解できました☆ありがとうございます♪

まだまだ分からないところが多すぎて、質問ばかりしてしまいます。
本当にご迷惑かけまして申し訳ございません。

また分からないとき質問させてください。どうぞよろしくお願いします☆

今回は、tkmakwins15さん、Justyさん、管理人さん、本当にありがとうございました♪

Justy

Re:ありがとうございます。

#9

投稿記事 by Justy » 18年前

現在、そのプログラムの中身を理解しようと必死です
 実は微妙に挙動がおかしいのですが、まぁそこは中身が出来次第修正してみて下さい。


DrawBox
 基本的に管理人さんが書かれている通りです。
 少しだけ補足すると、第1~第4引数が複雑になっているのは、
動的に表示位置などを決めなければならない(直接数値を埋め込んでしまうと
移動できない!)からです。

 加えて、実はマウスのホイールを回すと「家」のスケールが変わるようになっています。
 その為、[color=#d0d0ff" face="monospace]home->disp_pos.x+home->scale*3[/color]のような複雑な式になっています。

C.P.P

マウスクリックによる処理について・・・

#10

投稿記事 by C.P.P » 18年前

ありがとうございます☆

確かに、ホイールを回すと大きさが変わりました♪
凄いですね!いつか私も自身でこんなプログラム作れるように勉強頑張ります!

さて、またまた質問なんですが申し訳ございません・・・
WinMain関数の中の部分

for(;;)
{
// 画面を消す
if(ProcessMessage()== -1) break;

// マウス情報更新
MouseInfo_Update(&mouseInfo);

haikei ();

if((0<=MouseX && MouseX<32) && (0<=MouseY && MouseY<32) && (( MouseInput &&
     MOUSE_INPUT_LEFT ) != 0)){

// ホーム情報更新・描画
React_Update(&react, &mouseInfo);
React_Draw(&react);

}

// 位置情報表示
DrawStatus_String(&mouseInfo, &react);

// フレーム更新
FrameUpdate();
}

Destroy();
return 0;
}

でマウスによってクリックした際に、家の画像が出てその画像をマウスによって移動する(このマウスによって移動する処理は教えていただきました部分です)処理を付け加えたいので、

if((0<=MouseX && MouseX<32) && (0<=MouseY && MouseY<32) &&
               (( MouseInput && MOUSE_INPUT_LEFT ) != 0)){ホーム情報更新・描画  }

という処理を付け加えたのですが、クリックしても画像が出てきません・・・

以前マウス移動処理が分からない時に、上記処理を使っていましたら画像は出てきたのですが・・・
なにか、マウス移動処理を行うことによって、違う処理方法でなければ処理できなくなってしまったのでしょうか?

ご教授お願いいたしますm(v_v)m

Justy

Re:マウスクリックによる処理について・・・

#11

投稿記事 by Justy » 18年前

以前マウス移動処理が分からない時に、上記処理を使っていましたら画像は出てきたのですが

 前のプログラムとの大きな違いは毎フレーム全画面消去を行っているかどうか、です。
 今回の私のサンプルでは毎回ループを繰り返す度に全画面を消しています。

 つまり、条件を満たしたときだけ処理をしたのでは、その時の一瞬しか表示されません。

 なので、Home_Update()/Home_Draw()は if文の中から外し、通常通りの処理に戻して下さい。

 その上で、Home構造体の表示の状態を表すメンバ is_displayのデフォルトを FALSEにし、
起動時には非表示になるようにします。
 で、特定の場所で条件を満たしたら、is_displayを TRUEにして下さい。
 これで表示されます。

 つまり、処理の流れとしては

if(条件)
{
 表示するようリクエストする(フラグを立てる)
}

if(表示フラグが立っているなら)
{
 表示
}

 という流れになります。

 この中で、「if((表示フラグが立っているなら)~表示」の処理は Home_Draw()で
既に行っているので、実際には条件に応じて「表示するようリクエストする」だけで
いいと思います。

C.P.P

ありがとうございます。

#12

投稿記事 by C.P.P » 18年前

返信遅くなりまして大変申し訳ございません・・・
ここ2~3日風邪ひいてまして、なかなかPCに触れ合う機会がありませんで↓

Justy さん返信ありがとうございます。
今日から復活しましたので早速書き換えて実行してみたところ巧くいきました☆

大変助かりましたありがとうございます☆

さて、またまた質問です。
何度も質問して申し訳ないのですが・・・

// 家を囲む箱の一片の半分の長さ
const int rangeX = home->scale * 10 / 2, rangeY = home->scale * 11 / 2;

と、いう部分があるではないですか?この部分の10/2みたいな数値は何を表しているのですか?
大きさですか?それとも座標でしょうか?

ご教授お願いいたしますm(>_<)m

C.P.P

Re:ありがとうございます。

#13

投稿記事 by C.P.P » 18年前

申し訳ございません・・・
なんとか自主解決いたしました☆おそらく・・・

今までたくさんのアドバイスをくれた方々、本当にありがとうございました♪

また、何か分からなくて質問すると思います(^o^;
その際には宜しくお願いいたします!

本当にありがとうございました☆

閉鎖

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