多少の寝不足と、仕事で作業が出来てきたのでちらちら見てる暇もなくなってきたので徐々に読み解いていこう。
ざっと見た感じ、前回の衝突判定よりも理解がしやすいような感じ。

今回はプロジェクトが2つあり、MAPを作成するためのパイプライン関連と、ゲームのメインロジックの二つである。
このサンプルの肝は、前者のパイプラインの処理だ。(多分)

パイプラインが何をするためのものかというかというと、
 「Contentsに登録されているテクスチャ(二次元の画像)を読み込むときに、
 パイプラインにテクスチャを通して、ゴニョゴニョ変換してMapを作っちゃおー」
という事だ!

普通にGameクラスでテクスチャを読み込んで、そこでMapを作成していってもいいけれど、
色んなMapが有るゲームを作るときに毎回そんなのやってられないから、
テクスチャ読み込んだときにMapに変えてくれよ!

という要望を実現するためにある。(Contentsの内容を読み込む際に、好きな型に変換できるってことです)

----------
で大まかな用語は理解したので実際に中を見る。
パイプライン(HeightmapCollisionPipeline)の中には
HeightMapInfoContent.cs と TerrainProcessor.cs が入っている。
プロセッサというのが、パイプライン処理の中で「読み込んだContentsの方を変換する」のを担当する。
ここでハイトマップを作っていると思えばよい。

もう一個のほうは作成したMapを新しいContentsに登録するためのクラスだ(多分)
ContentTypeWriterというクラスを継承しているクラスがそれを担当する。
HeightMapInfoContentはBeanのようなものだろう。

TerrainProcessorは少し観辛いが、
テクスチャをビットマップに変換して深度から高さを作成しているようだ。
(Processメソッド内の最初のforループ)
では、ここでのテクスチャとは何か?

それは実際にMapを使ってるGameクラスのほうを観ればいい。
Terrain.bmpを使ってるみたいだ。
そのファイルを開くと、モノトーンのおしゃれぶった画像が表示される。
さっきのforループから察するに、このファイルで白ければ白いほど地面が高くなりそうだ。

むずむずする人はBMPを書き換えてひとまず遊んでみるのも良いだろう。私は遊んだ。画像は秘密だ。


Processメソッドに戻って、
もう、言うまでもないかもしれないがforループ内の
   position.Y = (heightfield.GetPixel(x, y) - 1) * terrainBumpiness;
で高さを作っている。GetPixel(x,y)というのは0から1の値を戻すので、
Yの値は-1(クロ)から0(シロ)に倍率を書けた値が入る。


ざっとだが、
その後に反射光をつくり、テクスチャを貼り付けて(Mapの質感を作るって事です)
メッシュを作成する。(MeshBilder.FinishMesh())
(メッシュってのは複雑な(単一ポリゴンじゃない)ポリゴンの事だと思えばいいようだ。
今回で言うところのMap。)

これで、テクスチャからMapの作成は出来た。
Gameから読み出せるようにするために、なんとかContentクラスをnewしてやって
戻り値のTagに設定してやる。

これでテクスチャからMapの作成はほぼ終わり。


さて、bmpを適当に作ってみたり、倍率を変更したりして実行してみよー。
結構解ってきたな。ふむふむ。
そろそろ物理エンジンを乗っけてみようか。

衝突判定は明日にする。ねむい・・・。


---------------
このサンプルには地面はあるけど空がないのでSpriteBatchで固定でいいから書いてみよう。