マウス座標が特定の範囲に入ったら一度だけ処理

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

マウス座標が特定の範囲に入ったら一度だけ処理

#1

投稿記事 by yskey » 16年前

こんばんは、yskeyです。
一日中考えているのですが、ドつぼにはまって解決できません。
メニュー画面などでマウス座標が画像の上に乗ったらカーソル音(カチッという)を一度だけ鳴らしたいのですが、
「一度だけ」という処理がなかなかできません。
また、画像上からマウス座標から外れて、もう一度乗るとまたなるようにしたいのですが・・・
下記のような関数でメニューの当たり判定を得ています。

if(マウスが画像上) 再生フラグ=1

else 再生フラグ=0
にしているんですがなぜかこれだとflag=0のままになります・・・
後、flag=1にできたとして一度だけ再生はどうすればいいんでしょうか?
int Grapha(int x,int y,int GraphHandle,int flag){
    int size_x,size_y,ff=0;
    GetGraphSize(GraphHandle,&size_x,&size_y);
	if(x<Mouse.x && Mouse.x<size_x+x && y<Mouse.y && Mouse.y<size_y+y){
              flag=1;
	   SetDrawBlendMode( DX_BLENDMODE_ALPHA ,128 ) ;  
           DrawGraph(x,y,GraphHandle,flag);
           SetDrawBlendMode( DX_BLENDMODE_NOBLEND , 0 ) ; 
		 if(Mouse.Button[0]==1){
		   	return 2;
		 }
		 else {
			return 1;
		 } 

	}
	else {
            flag=0;
	  DrawGraph(x,y,GraphHandle,flag);
	    return 0;
	}
}

yu

Re:マウス座標が特定の範囲に入ったら一度だけ処理

#2

投稿記事 by yu » 16年前

flag を 1 にするのではなくて
flag をインクリメント(flag++)して

if(flag == 1)

といった感じにしてみてはどうでしょうか
flagの値はどこかに保存しておかなければなりませんが

#追記
#すみませんちゃんとソース見てませんでした orz

クロウ

Re:マウス座標が特定の範囲に入ったら一度だけ処理

#3

投稿記事 by クロウ » 16年前

自分がやっているのは
bool flag = false;一回だけ音を鳴らすフラグを宣言(これはグローバル変数になってしまいますが・・・)
if(flag == false && (鳴らす条件)){
   flag = true;
}

とおいて、どこか常にループしている場所(main関数など)で常に初期化してあげることです。
このときの初期化の条件は

if((鳴らさない条件)){
   flag = false;
}//つまり鳴らす条件の否定
です。
つまり、鳴らす条件を満たせばflagはfalseなので一回だけ鳴り、二回目はflagがtrueのためならない。
そして、特定の位置に乗っている間は鳴らさない条件を満たしていないため、flagは初期化されず、鳴らさない条件を満たしたときには初期化されるので、再度鳴らす条件を満たした時は鳴るとなります。

ねこ

Re:マウス座標が特定の範囲に入ったら一度だけ処理

#4

投稿記事 by ねこ » 16年前

メニューでの操作管理ということでselect変数を使った手法はどうでしょうか。
// メニュー情報
typedef struct {
	int x;
	int y;
	int GraphHandle;
} MENU_DATA;

int g_iPrevSelect = -1;
int g_iSelect = -1;
int g_iMenuCnt = 10;
MENU_DATA g_ArrMenu[ 10 ];

// マウスがどのメニュー項目上にあるかチェック
int CheckMenuIn() {
	for( int ii = 0; ii < g_iMenuCnt; ii++ ) {
		int size_x, size_y = 0;
		GetGraphSize( g_ArrMenu[ ii ].GraphHandle, &size_x, &size_y );
		if( g_ArrMenu[ ii ].x < Mouse.x && Mouse.x < size_x + g_ArrMenu[ ii ].x &&
 		    g_ArrMenu[ ii ].y < Mouse.y && Mouse.y < size_y + g_ArrMenu[ ii ].y ) {
			// 配列インデックスを返す
			return ii;
		}
	}
	
	// どこの範囲にも無かったら-1を返す
	return -1;
}

int void main() {
	// マウスがどのメニュー項目上にあるかチェック
	g_iSelect = CheckMenuIn();
	
	if( g_iSelect != -1 ) {
		// 前回とは違う選択位置の時
		if( g_iSelect != g_iPrevSelect ) {
			// 音を鳴らす
		}
	} else {
		// どの項目の上でも無い
	}

	// 前の選択インデックスを保持
	g_iPrevSelect = g_iSelect;
}
このように最初にマウスがどのメニューアイテム上にあるか取得しておくと後からの処理が簡単に作れます。

yskey

Re:マウス座標が特定の範囲に入ったら一度だけ処理

#5

投稿記事 by yskey » 16年前

回答ありがとうございます。m(_ _)m
参考にしてなんとか解決したいと思います。

閉鎖

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