※ ChatGPTを利用し、要約された質問です(原文:高さのあるクォータービューの当り判定について)
高さのあるクォータービューの当り判定について
このQ&Aのポイント
VC++2010&DXライブラリを使用してタクティクスオウガやモナークモナークのようなSLGをふと作りたくなり、クォータービューを採用しました。
マウスカーソルの当り判定の処理は、平面な状態ではひし形の4つの座標と一次関数式を計算し、範囲内に入っているか判定する方法がうまくいきました。
しかし、マップに高さを加えると、重なり合うひし形が出てきてしまい、選択される面が変わってしまいます。このような場合、どのように当り判定を行えばよいのでしょうか?
VC++2010&DXライブラリを使用してタクティクスオウガやモナークモナークのようなSLGをふと作りたくなり、クォータービューを採用しました。
全くの平面な状態ですと、それぞれのブロックチップのひし形の4つの座標を、それぞれ通る4本の一次関数式と現在のマウスカーソル位置との範囲内計算をさせることで、カーソルがあたっている部分だけ色を変えるという処理(ゲーム内カーソルの表示)をさせる処理は上手くいきました。
また、ひし形の頂点の座標をCreatePolygonRgn();とPtInRegion();を使う処理に変えてみても大丈夫でした。
しかし添付しました画像のようにマップに高さの概念を加えていくと、ひし形が重なり合う部分が出てきてしまい、画像のように
青の部分にマウスカーソルが入るとAとBが選択されて色が変わった状態になり、
緑の部分にマウスカーソルが入るとCとBが選択されて色が変わった状態になり、
赤の部分にマウスカーソルが入るとDとBが選択されて色が変わった状態になってしまいます。
(いずれの場合も、一番手前にあるBの面だけが選択され、色が変わった状態になってほしい、
というのが理想としている動きです)
CreatePolygonRgn();も使えるので、例えばこの画像のような例ですとAは変形六角形、CとDは変形五角形として扱うこともできそうですが、常にこういった高さの違うマップだけを表示する、というわけではなく、ブロックによっては高さが任意に変わってしまうため、変形多角形のパターンも多岐になるであろうことが予測できてしまい、目の前が真っ暗になってしまっております。
こういった場合のマウスカーソルの当り判定につきまして、何か良い処理方法をご存知の方がいらっしゃいましたら何卒お教えくださいますようお願いします。
お礼
回答ありがとうございます。 3D処理ではなく、2D処理でのお話だったのですが、「いちばんZが近いものを選択」というのがヒントになり、解決しました。 今まで最も奥のX軸Y軸[0,0]からインクリメントでループを回してチェックをかけていたのを、逆のX軸Y軸共に最大軸からデクリメントでループを回してリージョン内マウスポインタチェックをかけることで想定していた結果を得ることができました。