ページ 11

マウス座標とマスの座標&段差の判定

Posted: 2011年12月12日(月) 01:43
by コレジャナイ感
初めまして
ただ今SLGを自作している最中なのですが、マウスとマスの計算式でつまずいております。
現状マウスが指している地点の座標をマスの座標に変換する計算式は何とか組めているのですが、ここに段差の概念を追加する所で困っております。

マスの形状は四角形、使用しているのはC言語にDXライブラリです。

具体的に困っているのは、段差によって高さの違いが生じる訳ですが、それによって今までの計算式では段差の断面を示しているにも関わらず、マスとして認識してしまっております。
そして肝心の段差上の四角形内をマウスで指した時はほとんどの領域が後ろのマスの座標を取得してしまっている状況です。

これでも段差が1段差しか無い状態なら何とかプレイに差し支えはないですが、段差を増やしていくとマウスが指している地点とマスの座標のズレが致命的なものとなってしまうと考え質問致しました。


このようなマス座標を取得する計算式は通常どのようになっているものなのでしょうか?

Re: マウス座標とマスの座標&段差の判定

Posted: 2011年12月12日(月) 09:32
by softya(ソフト屋)
はじめまして。
その問題の式と画像が無いのでパースも分からないですし何とも言えないですがクリックした地点に何が描画されているかは描画ルールから逆算できませんか?
この文からだと申し訳ないですが、このぐらいしか言えません。

Re: マウス座標とマスの座標&段差の判定

Posted: 2011年12月12日(月) 17:50
by コレジャナイ
mouseの値は直前取得
変数名は諸事情で簡単なものに置き換えておきました。

コード:

mouseX = mouseX-64-x_out;
		mouseY = mouseY-64-y_out;
		a = mouseY - mouseX/2;
		b = mouseY + mouseX/2;
		q = (a+16) / 32;
		p = (b+16) / 32;
		if(p < 0){
			p -= 1;
		}
		if(q < 0){
			q -= 1;
		}
		k = p;
		s = q;
		x = k - s;
		y = k + s;
現在計算式はこのようになっております。
一マスの高さは32、横幅は64です。

そして現在↓の緑色領域ではマス座標の取得は出来ているのですが
http://iup.2ch-library.com/i/i0502412-1323679589.jpg

↓の状態で赤色をマウスが差している時は何も反応せず、緑色だけ反応する計算式が上手く組めません。
http://iup.2ch-library.com/i/i0502413-1323679635.jpg

拙い絵で誠に申し訳ございませんが、これで伝わってくれれば助かります。

Re: マウス座標とマスの座標&段差の判定

Posted: 2011年12月12日(月) 17:59
by ISLe
マウス座標(にあるピクセル)とマスの当たり判定ですね。

このような場合わたしならとっとと計算式はあきらめます。

Re: マウス座標とマスの座標&段差の判定

Posted: 2011年12月12日(月) 18:08
by softya(ソフト屋)
私も計算式は諦めて座標分の配列を緑色の部分を数値で塗りつぶすとかで対処する方が簡単だと思います。
あるいは、MakeScreenして反応して欲しい緑色のところだけ塗りつぶした上でGetPixel()で色があるか判定するとか。
[追記]色を塗り分ければどのマスをクリックしたかの判定にも使えます。
あと最初と名前が変わってますが名前の統一をお願いします。

Re: マウス座標とマスの座標&段差の判定

Posted: 2011年12月12日(月) 18:27
by beatle
計算式を考えてみました。
  • i : マス番号
  • h(i) : iマスの高さ
  • x(i), y(i) : iマスの中心座標
  • a : マスの辺の傾き(絵から推測すると40度ぐらい)
  • r : マスの対角線の長さの半分
  • mx, my : マウス座標
iマスは菱形なので、その4辺の直線の式を求めて、4つの直線に囲まれる領域にマウス座標が入っているかチェックすればいいと思います。
4直線の式は
  • 左上 : f1(x) = a(x - ( x(i) - r )) + y(i) + h(i)
  • 右上 : f2(x) = -a(x - ( x(i) + r )) + y(i) + h(i)
  • 左下 : f3(x) = -a(x - ( x(i) - r )) + y(i) + h(i)
  • 右下 : f4(x) = a(x - ( x(i) + r )) + y(i) + h(i)
ですから、マウス座標mx, myが菱形に入っているかどうかは

コード:

if (my < f1(mx) && my < f2(mx) && my > f3(mx) && f4(mx))
    マウスが菱形の中に入っている
とできるはずです。

以上、未検証ですが考えてみました。

Re: マウス座標とマスの座標&段差の判定

Posted: 2011年12月12日(月) 18:59
by コレジャナイ
その計算式では手前のマスが高度が高く、奥のマスが多少覆われてしまっている状況では奥のマスを正確に指すのは難しいのではないでしょうか?
友人とも相談してみたのですが、この覆われた奥のマスを正確に指す事がどうにも難しく・・・。


自分自身まだプログラムはかなり初歩の段階という事もあり、計算式では無い方法(色を塗る?)についての知識が全くありませんでした。
これについては少々調べてみる必要がありそうです。

名前はこれで統一したいと思います、失礼しました。

Re: マウス座標とマスの座標&段差の判定

Posted: 2011年12月12日(月) 19:23
by beatle
コレジャナイ さんが書きました:その計算式では手前のマスが高度が高く、奥のマスが多少覆われてしまっている状況では奥のマスを正確に指すのは難しいのではないでしょうか?
難しい、というのは、奥のマスが手前のマスで隠れてしまって、クリックできる面積が少なくなってしまうために、クリックするのが「難しい」ということでしょうか。
だとすると、マスに高さがある時点でどの方式でやろうとも難しいと思うのですが。

それを簡単にクリックできるようにするためには、マップを回転させる機能を実装するとかしないとダメなのではないでしょうか。

Re: マウス座標とマスの座標&段差の判定

Posted: 2011年12月12日(月) 19:29
by コレジャナイ
いや、そういう意味では無いですが

言われてみると確かに面積が少なくなるという点は後々面倒になりそうなので、そこは段差マスの配置の注意を心掛けたいと思います

Re: マウス座標とマスの座標&段差の判定

Posted: 2011年12月12日(月) 19:29
by コレジャナイ
いや、そういう意味では無いですが

言われてみると確かに面積が少なくなるという点は後々面倒になりそうなので、そこは段差マスの配置の注意を心掛けたいと思います

Re: マウス座標とマスの座標&段差の判定

Posted: 2011年12月12日(月) 19:30
by コレジャナイ
失礼
何故か二連続投稿となってしまいました

Re: マウス座標とマスの座標&段差の判定

Posted: 2011年12月12日(月) 19:33
by beatle
手前のマスに反応してほしいのに、奥のマスに反応しちゃうから難しいという意味でしたか?
だとすると、多分h(i)が大きい順にクリック判定を行なって行けばいいんじゃないかと思います。

Re: マウス座標とマスの座標&段差の判定

Posted: 2011年12月15日(木) 01:38
by コレジャナイ
無事に実装する事が出来ました。
beatleさん有難う御座いますm(_ _)m