2013年11月11日月曜日

クォータービューとの戦い?w

どもども、こんにちわ!

もう、ここの放置っぷりが半端ないですね。
いや~仕事の方が多忙で全然更新する気力がね・・・・

でも、全く何もやってなかった訳ではないですよ。
しっかりやる事はやってました。
少し前のブログにも書いた気がしますが
新しいゲームを3D(OpenGL ES2)でゴリゴリ組んでたんです。
でもやっぱり3Dってだけで重たい・・・
動きはするんですが、やっぱり重たいんです。
すでにJavaは捨ててC++(NDK)でやっているんですけど
それでも3Dはそれなりに重たい。
これだと、どうしても箱庭感から抜け出せないんですね。
確かに3Dの表現力はもの凄いので
2Dでは諦めていたような色んな問題を一気に解決
してくれる訳ですが、その代わりに重いんです。

ああ、結局ここで頭の中に天秤が現れるわけですが

「自分たちがやりたい事って本当に3Dが必要?」

という言葉が頭をよぎったのが運のつき。
もう、頭から離れなくなりまして・・・・
結局、2Dと3Dの間にあたるような
「クォータービュー(英:Isometric view)」を試してみようと
軽い気持ちでやってみた訳です。

はじめに菱形の地面の絵を用意して敷き詰めてみました。
ここはすんなりいったので
「ほお、なんだちょろいなw」とか思っていたんですが
そこに立体感のある物体(というか箱?w)を
配置したあたりから状況が一変
その箱の間を赤い箱が通過するようなプログラムを
組んでいたのですが、どうしても重なりが
上手くいかない部分が出てくるのです。

例えばこれ↓
明らかに下にいるべきブロックが
上にきてますね。

そこでマスに番号を振って
考えてみました。

この図をみてください。
真ん中にいる赤い箱が
9番に向かって移動しているわけです。
その状況を、赤い矢印の順番に描画するわけですが
9番の地面の上に赤い箱がきているこの場合
3番(見えてないけど)の描画の直後に
赤い箱を描いてしまうと9番の地面が
赤い箱を上書きしてしまうのです。

そう、この場合は9番の地面を描いたあとに
10番として赤い箱を描くべきだと考えました。

・・・・・・・・でも、待てよ?

一見すると、これで良さそうですが
(実際、ネットでどこそこ検索すると
そうしろ的な記事も見かけるんですが)
本来、赤い箱の大半は3番の上にいるわけです。
そして、その隣にいる4番の箱
これは赤い箱の手前にいるわけですから
赤い箱の後に描画しなければ
奥行の表現としてはおかしいことになります。


問題1:
3番→赤い箱→4番~9番(ここで赤い箱の上に9番の地面がかぶる)

問題2:
3番~9番→赤い箱(ここで4番の箱の前に赤い箱がかぶる)

もう、これは明らかな矛盾なので
正攻法では解決できないなという結論になりました。

そこで、まず考えたのが描画順
普通のXを加算しながらYを加算のループではなく
独自のルールでの描画順を行うこととしました。

描画順ルール

まず、XとYが同じ場合は
XとYをかけた数値を描画順とします。
次にそこからマイナス方向の座標には
-1ずつした数値として
その順番で描画するようにします。
そうすることで、奥にあるものほど
先に描画をしようという方法です。
(同じ数値の場合はどちらが先でも
まぁ、問題は無いかなといった
軽い考えですが・・・・)

ただ、これだけでも実は十分ではありません。
(試すとわかるが、2:2から3:2へ移動する途中、
1:3にある箱の上に赤い箱が一部がかぶってしまう。)
上述の赤い箱がおかしな動きを
しない為には、もうひとひねり必要です。



今回はめずらしく長々書いて疲れたので
続きは気が向いたら書くことにします・・・(´・ω・`;)


0 件のコメント:

コメントを投稿