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

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

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

#1

投稿記事 by コレジャナイ感 » 14年前

初めまして
ただ今SLGを自作している最中なのですが、マウスとマスの計算式でつまずいております。
現状マウスが指している地点の座標をマスの座標に変換する計算式は何とか組めているのですが、ここに段差の概念を追加する所で困っております。

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

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

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


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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#2

投稿記事 by softya(ソフト屋) » 14年前

はじめまして。
その問題の式と画像が無いのでパースも分からないですし何とも言えないですがクリックした地点に何が描画されているかは描画ルールから逆算できませんか?
この文からだと申し訳ないですが、このぐらいしか言えません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

コレジャナイ

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

#3

投稿記事 by コレジャナイ » 14年前

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

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

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

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

#4

投稿記事 by ISLe » 14年前

マウス座標(にあるピクセル)とマスの当たり判定ですね。

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#5

投稿記事 by softya(ソフト屋) » 14年前

私も計算式は諦めて座標分の配列を緑色の部分を数値で塗りつぶすとかで対処する方が簡単だと思います。
あるいは、MakeScreenして反応して欲しい緑色のところだけ塗りつぶした上でGetPixel()で色があるか判定するとか。
[追記]色を塗り分ければどのマスをクリックしたかの判定にも使えます。
あと最初と名前が変わってますが名前の統一をお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

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

#6

投稿記事 by beatle » 14年前

計算式を考えてみました。
  • 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: マウス座標とマスの座標&段差の判定

#7

投稿記事 by コレジャナイ » 14年前

その計算式では手前のマスが高度が高く、奥のマスが多少覆われてしまっている状況では奥のマスを正確に指すのは難しいのではないでしょうか?
友人とも相談してみたのですが、この覆われた奥のマスを正確に指す事がどうにも難しく・・・。


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

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

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

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

#8

投稿記事 by beatle » 14年前

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

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

コレジャナイ

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

#9

投稿記事 by コレジャナイ » 14年前

いや、そういう意味では無いですが

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

コレジャナイ

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

#10

投稿記事 by コレジャナイ » 14年前

いや、そういう意味では無いですが

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

コレジャナイ

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

#11

投稿記事 by コレジャナイ » 14年前

失礼
何故か二連続投稿となってしまいました

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

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

#12

投稿記事 by beatle » 14年前

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

コレジャナイ

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

#13

投稿記事 by コレジャナイ » 14年前

無事に実装する事が出来ました。
beatleさん有難う御座いますm(_ _)m

閉鎖

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