クォータービュー視点 ~ マウスでの移動

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

クォータービュー視点 ~ マウスでの移動

#1

投稿記事 by PINO » 18年前

いつもこの掲示板の質問、回答には勉強させられています。
ひとつつっかかってしまったので、質問させてください。

現在クォータービュー視点のゲームを製作しているのですが
マウスにて移動を行いたいと考えています。
ただ、どうしてもうまい具合にひし形での座標が得られず製作が進まなくなってしまいました。
解決方法などお教えいただけるとありがたいです。

PINO

補足

#2

投稿記事 by PINO » 18年前

開発環境はMicrosoft Visual C++ 2005 Express Edition
DXライブラリを使用しています。

管理人

Re:補足

#3

投稿記事 by 管理人 » 18年前

クォータービューですと、単純に45度足して計算してやればいいと思いますけど、うまくいかないとは具体的にどのように思い通りにならないのでしょう?

PINO

Re:補足

#4

投稿記事 by PINO » 18年前

ご返答ありがとうございます。

語彙不足で説明が苦手なので(苦笑)WEBページに画像つきで書いてみました。

http://pinomyth.web.fc2.com/

bin

Re:補足

#5

投稿記事 by bin » 18年前

2Dで考える場合、マップが描画できてるなら0-0マスのウインドウ位置がわかってるはずなので、
そこを基準にマウスとの相対位置で割り出すという手もあります。
もっとスマートにやる場合はマップそのものを3Dにする必要が出てくるんで、3Dゲームを作る覚悟がなければ
前者をお勧めします。

PINO

Re:補足

#6

投稿記事 by PINO » 18年前

ご返答ありがとうございます。

>>マウスとの相対位置
ここでだいぶつまづいちゃってます…。

>>3D
できれば使い慣れたDXライブラリで作りたいのでこれは避けたいです。
(技術的にもですが・・・)

キーボードでの移動が手ごろだとは思うのですが、
製作するゲームの仕様上、どうしてもマウスが利用したいんですよね 汗
いっそクォータービューをやめるって手もありにはありなのですが、
高さも表現したいので・・・。

なかなか難しいですね~。
もう少し粘ってきます。

YuO

Re:補足

#7

投稿記事 by YuO » 18年前

単純に座標系の変換だけで済みませんか?

1. まずは,マップ座標系とスクリーン座標系の関係式を調べます。
マップ座標系を45度回転させると,
x' = x / √2 - y / √2
y' = y / √2 + x / √2
これは,マップ座標系(x,y)とスクリーン座標系(x',y')の関係の式になります。
# 単純に回転行列を分解しただけです。

2. 次に,x', y'からx, yを求める式を出します。
x = (x' + y') / √2
y = (y' - x') / √2

これは,原点を一致させた回転ですが,ずれている場合はスクリーン座標系上でずれを補正してやれば,同じ式が使えます。

2の式によって得られたものはマップ座標系上のマウスの位置になります。
ただし,式の都合上単位長さは同じとしているので,得られる値はマスが48 x 48の場合における座標になりますが,これは48で割ってやればよいので問題にはならないと思います。

Justy

Re:補足

#8

投稿記事 by Justy » 18年前

 マウスの座標はウインドウ内での座標なので、菱形のマップチップベースの座標を得るには
まず菱形自体をウインドウ座標で計算する必要があります。

 各菱形の各頂点の座標が求まれば、後はどの菱形の内部にマウスがあるかを調べるだけです。

 ちょうど昼休みなので、ちょっとサンプルを作ってみました。
 ご参考のほどに。

PIKO

Re:補足

#9

投稿記事 by PIKO » 18年前

ご回答ありがとうございます。

いまお二人の案&ソースを解読中です。
できしだい報告いたします。

PIKO

Re:補足

#10

投稿記事 by PIKO » 18年前

どうにか解読、導入に成功しました。
ここの皆様には、いつも感謝の念でいっぱいです。

と、ここで連続になってしまうのですが、
もうひとつよろしいでしょうか?

現在地と移動指定先の最短コースを求める関数を作ろうとしていているのですが、
手ごろな方法はなにかないでしょうか?
「ダイクストラ法」というものも調べてみたのですが
なかなかわかりやすい解説がみつからないのでここにてご質問させていただきます。

PINO

Re:補足

#11

投稿記事 by PINO » 18年前

な。。名前が間違えてる。。。

Justy

Re:補足

#12

投稿記事 by Justy » 18年前

>手ごろな方法はなにかないでしょうか
 どういう条件で移動が行われますか?
(あちこちに移動できないところがある、とか、地形があって移動コストが
それぞれ異なる、とか)

 http://pinomyth.web.fc2.com/のような壁が周囲にしかない完全にグリッド状に
並んでいて、且つ移動コストも均一であるなら、非常に単純なのですが。

PINO

Re:補足

#13

投稿記事 by PINO » 18年前

ご返答ありがとうございます。

>>あちこちに移動できないところがある
これですね。
障害物があれば、それをさけて進みたいです。

Justy

Re:補足

#14

投稿記事 by Justy » 18年前

 こういうのはゲームの内容に合わせて最適なものを選ぶ必要があります。
 ダイクストラで十分ならいいのですが。


最短経路求解プログラム
http://www5.airnet.ne.jp/tomy/cpro/etc16.htm


 ある程度CPUにパワーがあるなら A* (A-Star)がお薦めです。
A*
http://www5f.biglobe.ne.jp/~kenmo/progr ... astar.html



 あとこの本が参考になりそうです。
http://www.amazon.co.jp/dp/4873112168/



# 書くのが面倒なら、グラフ理論を扱ったライブラリを使うというのも手ですね。

Justy

Re:補足

#15

投稿記事 by Justy » 18年前

 文献紹介するだけではさすがにアレなので適当な A*のサンプルを作ってみました。
(あんまり綺麗なソースではないですが・・・)


 ∞は絶対に移動できないところです。
 数字はそのブロックを移動するのに必要なコスト値です。
 マウスをクリックすると移動の開始地点を変更できます。

閉鎖

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