高さのあるクォータービューの当り判定について

この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は変形五角形として扱うこともできそうですが、常にこういった高さの違うマップだけを表示する、というわけではなく、ブロックによっては高さが任意に変わってしまうため、変形多角形のパターンも多岐になるであろうことが予測できてしまい、目の前が真っ暗になってしまっております。 こういった場合のマウスカーソルの当り判定につきまして、何か良い処理方法をご存知の方がいらっしゃいましたら何卒お教えくださいますようお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • zwi
  • ベストアンサー率56% (730/1282)
回答No.1

難しく考えずに複数の面が該当したらいちばんZが近い(カメラが近い)ものを選択すれば良いのでは?

eternazx9r
質問者

お礼

回答ありがとうございます。 3D処理ではなく、2D処理でのお話だったのですが、「いちばんZが近いものを選択」というのがヒントになり、解決しました。 今まで最も奥のX軸Y軸[0,0]からインクリメントでループを回してチェックをかけていたのを、逆のX軸Y軸共に最大軸からデクリメントでループを回してリージョン内マウスポインタチェックをかけることで想定していた結果を得ることができました。

関連するQ&A

  • ひし形のあたり判定について

    C言語でクォータービューのRPGを作っているのですが、ひし形をマップの座標からウィンドウへ描画する座標については自力で解決できたのですが、マウスの位置を取得してそこにカーソルを重ねるときにひし形のあたり判定の仕方がわからないのですが、どなたかご存知ないでしょうか? 教えてくださいお願いします。

  • WindowsAPI ツリービューについて

    はじめまして,calkと申します。 WindowsAPI(C/C++)のツリービューなのですが,「現在どの項目にカーソルがあるか」という情報を取得するにはどうすればよいのでしょうか。 選択されている項目は,TreeView_GetSelection()を使うことで取得することが出来たのですが,カーソルとなると上手くいきません。 現在はマウスカーソルの座標で判断しているのですが,何か他に方法はないものでしょうか。

  • Java ブロック崩し 当たり判定

    こんにちは、Java初心者の者です。 今週の末に、文化祭があるので、その際の出し物で「ブロック崩し」を出すことにしたのですが、 ブロックの当たり判定がおかしいのです。 おかしいというか、正確にはブロックとの当たり判定自体はあるのですが、ブロックと当たったらブロックが消えるようにしているはずが、消えないのです。 一応、消えてはくれるのですがボールとブロックが離れたらまた元の色に戻ってしまいます。 フラグ管理を使っての処理で、ボールとブロックが触れたらフラグを「偽」。そしたらそれに該当するブロックを描画しないようにする仕組みなのですが、どうも上手くいきません。 以下コードです。 ~~~~中略~~~~ //ブロックの座標の設定 int k=0; for(int j=0;j<block_r;j++) { for(int i=0;i<block_g;i++) { block_x[k] = i*block_w; block_y[k] = j*block_h; block[k] = 1; flag[k] = true; k++; } } //ブロックに当たった時の処理 for(int i=0;i<30;i++) { if(flag[i] == true) { if(y + ball_y >= block_y[i] && y <= block_y[i]+block_h && x + ball_x >= block_x[i] && x <= block_x[i] + block_w) { vy = -vy; flag[i] = false; } } } //ブロックの描画 for(int i=0;i<30;i++) { if(flag[i] == true ) { //ブロックの描画 offg.setColor(Color.yellow); offg.fillRect(block_x[i],block_y[i],block_w,block_h); //ブロックの枠線 offg.setColor(Color.black); offg.drawRect(block_x[i],block_y[i],block_w,block_h); } } ~~~~中略~~~~~ paintメソッドの部分だけ載せてます。 どこかおかしいところがあれば、アドバイスを頂ければ幸いです。 宜しくお願い致します。

    • ベストアンサー
    • Java
  • クリッカブルマップ上でカーソルを追うタグ

    HPでカーソルを追っかけるアイコン(マウスストーカー?)を付けたいのですが、 普通に付けることは出来たのですが クリッカブルマップを使用していて、その上にカーソルをもっていくと アイコンが消えてしまいます。 クリッカブルマップで使用している画像からカーソルを外すと 再びカーソルを追いかけてきます。 マップ上にメニューなどあるので画像の上でも追いかけられるように したいのですが、どうしても出来ません。 それともクリッカブルマップ上では追いかけることは不可能なのでしょうか。 どなたか詳しい方、教えていただけると助かります。 宜しくお願いします。

    • ベストアンサー
    • HTML
  • キーボードでポインタの位置を決める

    C言語を用いて、プログラミングを行っています。 マウスのように、キーボードで x, y座標を入力し、 その座標にカーソルが移動するようにしたいのですが、 座標情報をどのように処理すれば、カーソルの位置が移動してくれるのかわかりません。 恐れ入りますが、どなたかご教授いただけないでしょうか。

  • 色を判定してくれるソフトはないですか?

    PDFの画像やイラストで部分消しの目的で該当の場所に適当な図形を上乗せして隠したい場合があるのですが、背景に色が付いている場合なかなか同じ色にするのは大変です。たとえば背景の部分にカーソルを持って行くと、この部分は(赤:255 緑:200 青:150)に最も近い色ですという風に判定してくれるソフトはないのでしょうか?

  • リストビューでのドラッグ&ドロップでの反転表示

    VC++にてエクスプローラもどきを作成していて、 ドラッグ&ドロップの操作を実装中です。 ListViewにて、OnLButtonDown内で マウスで押下されたフォルダイメージを CreateDragImageで作成しマウスカーソルを変更しました。 そして、ドラッグ中に、別フォルダへカーソルが移動した際、 そのフォルダを反転させるために、 OnDragOver内で、まず、全ての選択状態をクリアし、 for ( i = 0; i < list.GetItemCount(); i++ ){   item.iItem = i;   ListView_GetItem( list, &item2 );   item2.state = 0;   item2.stateMask = LVIS_SELECTED;   ListView_SetItem( list, &item ); } 対象となるフォルダのLV_ITEMを取得後に、 item.state = LVIS_SELECTED; item.stateMask = LVIS_SELECTED; ListView_SetItem( list, &item ); を行い選択状態に変更させました。 一応、ドラッグ&ドロップは、ある程度できているのですが、 描画が汚く、下記の2点について困っています。 1.ドラッグされたフォルダの反転表示が綺麗ではない(画像参照) 2.カーソル下に何のフォルダも無い場合は、   全ての選択状態をクリアだけでDragOverの処理を終了しているが、   前回選択状態にしたフォルダが反転表示(汚い状態で…)されたまま なにか、修正方法はありますでしょうか?

  • 画像の一部を表示

    JavaScriptで画像の一部だけを表示することは出来るでしょか?イメージ的には、表示する枠を選んで表示したい部分の左上のXY座標を指定する、みたいな感じです。もちろん他の方法でもいいです。最終的にはその表示したい部分の左上の座標の値ををマウスや矢印キーなどで変えてグーグルマップのようなことが出来たらいいなと思っています。回答よろしくお願いします。

  • イラストレータ [変形]から先が選択できない

    当方初心者です。 イラストレータで、写真の上にシャボン玉のような透明の球体(背景が円形にゆがんで見える)をのっけようと思っています。 あるサイトで、画像を選択して[フィルター]→[変形]→[極座標](または球体)とすればいいとの説明がありますが、私がこれをやると[変形]から先は何も選択できない状態になってしまいます。 原因として何が考えられますでしょうか。これだけでは分からないかも知れませんがよろしくお願いします。

  • クリッカブルマップの画像処理

    クリッカブルマップを使い、画像内の指定した一部分だけを暗くする処理を行いたいです。 ロールオーバーで画像を切り替えるのではなく、デフォルトの状態で 暗い部分と明るい部分を作りたいと思っています。 areaにクラス属性を与えて、その部分だけ画像の不透明度を変えたり 別の画像をかぶせるというような処理を行うことはできないでしょうか。

    • ベストアンサー
    • HTML

専門家に質問してみよう