ページ 11

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

Posted: 2007年8月09日(木) 01:52
by PINO
いつもこの掲示板の質問、回答には勉強させられています。
ひとつつっかかってしまったので、質問させてください。

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

補足

Posted: 2007年8月09日(木) 04:00
by PINO
開発環境はMicrosoft Visual C++ 2005 Express Edition
DXライブラリを使用しています。

Re:補足

Posted: 2007年8月09日(木) 04:37
by 管理人
クォータービューですと、単純に45度足して計算してやればいいと思いますけど、うまくいかないとは具体的にどのように思い通りにならないのでしょう?

Re:補足

Posted: 2007年8月09日(木) 06:27
by PINO
ご返答ありがとうございます。

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

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

Re:補足

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

Re:補足

Posted: 2007年8月09日(木) 08:58
by PINO
ご返答ありがとうございます。

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

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

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

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

Re:補足

Posted: 2007年8月09日(木) 12:26
by YuO
単純に座標系の変換だけで済みませんか?

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で割ってやればよいので問題にはならないと思います。

Re:補足

Posted: 2007年8月09日(木) 12:35
by Justy
 マウスの座標はウインドウ内での座標なので、菱形のマップチップベースの座標を得るには
まず菱形自体をウインドウ座標で計算する必要があります。

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

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

Re:補足

Posted: 2007年8月10日(金) 10:05
by PIKO
ご回答ありがとうございます。

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

Re:補足

Posted: 2007年8月10日(金) 20:16
by PIKO
どうにか解読、導入に成功しました。
ここの皆様には、いつも感謝の念でいっぱいです。

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

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

Re:補足

Posted: 2007年8月10日(金) 21:38
by PINO
な。。名前が間違えてる。。。

Re:補足

Posted: 2007年8月11日(土) 21:43
by Justy
>手ごろな方法はなにかないでしょうか
 どういう条件で移動が行われますか?
(あちこちに移動できないところがある、とか、地形があって移動コストが
それぞれ異なる、とか)

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

Re:補足

Posted: 2007年8月11日(土) 21:47
by PINO
ご返答ありがとうございます。

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

Re:補足

Posted: 2007年8月12日(日) 03:20
by Justy
 こういうのはゲームの内容に合わせて最適なものを選ぶ必要があります。
 ダイクストラで十分ならいいのですが。


最短経路求解プログラム
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/



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

Re:補足

Posted: 2007年8月13日(月) 01:57
by Justy
 文献紹介するだけではさすがにアレなので適当な A*のサンプルを作ってみました。
(あんまり綺麗なソースではないですが・・・)


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