タクティクスオウガの HERMIT を考える その2

というわけでアイマスのキャラクタを 4体描いたので、早速画面に載っけてみることにした!
この瞬間が一番楽しい。


ソース
hh03.png


当然のごとくマップの上に描いているので、重なりが無い。
重なりをつけるには、"重なりがあるものを重なった順に描く仕組み" が必要となる。


重なりがあるということは、重なる順番が変わる可能性があるということなので、
重なりがあるものだけ別に管理したほうが順番を入れ替えたりとかがやりやすい。
そこで、重なる可能性があるもの(以下オブジェクト)をリストに入れて管理するようにした。
objects.cpp にリストの実装がある。単なる双方向リスト。
やり方はいろいろとあるが、Simple is the best で自分で実装した。STL を使うとどうもデバッグがねえ…。


今回の場合、"一番下の地面以外のもの" をオブジェクトとした。
オブジェクトのリストへの登録は、重なり順 (x+y+z) にソートしてから行う。
描画するときにはリストの頭から順番に行っていくだけ。


hh02.png


重なりリストを使用して (x+y+z) で順番を付けた今回の実装の場合、描画順は下図のようになる。


hh04.png


柱を地面 4個分としているのでこんなことになっている。
とりあえず重なりの叩き台は完成。




さて、今の重なりの考え方は "重なる可能性があるもの" をまるごとオブジェクトにしたわけだが、
以下のようなときに結構悲惨なことになる。


hh05.png


キャラの足下のところが重なる可能性があるため、地面をオブジェクトにするのはいいが、
その地面に重なる下のほうの地面たちをまるごとオブジェクトにしないといけない。
実際には一番左と一番上の地面しか重なる部分が無いので、それに重なる地面には重なりが存在しない。
これは無駄である。


ではどうするか。次回へ続く。