シーザーIIIのリバースエンジニアリング(パート2、都市の描画)

元のゲームのリソースからテクスチャを取得するアルゴリズムを説明した以前のCaesar IIIバックエンジニアリングポストが、ホーカーに好意的に受け取られたことを願っています。 この記事では、マップのフォーマット、選択アルゴリズム、レンダリングのためのタイルの順序、最終テクスチャの形成について説明します。











タイルが何であるかがわかっている場合は、次のセクションをスキップできます。

タイル

タイルは固定サイズの画像であり、他のタイルの隣に描画するときに「継ぎ目」のない固体画像が得られるように形成されます。 これがシーザーIIIの草のテクスチャの例です







それらを特定の順序で組み合わせ、木々のテクスチャを追加すると、地球の特定の領域が得られます。この絵のような画像に、たとえば道路の画像など、別の種類のタイルを追加すると、既にプリミティブマップを作成できます。







おそらく、提示された画像は正方形ではなく、ひし形であることに気づいたでしょう。 これは、イメージにボリューム感(深さ)を与えるために行われます。 このようなタイルの外観は、見る人に対してある角度で向きを変え、さらに深くなると、2次元の写真は3番目の次元を獲得します。 ボリューム効果を作成するには、幅を長さの半分未満にする必要があります。 Caesar IIIゲームのタイルベースは58x30ピクセルで、これはゲームエンジンで使用される最小タイルサイズです。 リメイク開発の最初の段階では、1つの不快な効果がありました。ゲーム内のテクスチャは透明度なしで作成され、追加の処理を行わずに画面に表示すると、次のような結果になりました。







この状況から抜け出す方法は次のとおりです。たとえば、マスクを使用するか、左端の文字の色を透明として受け入れるか、アルファチャネルを使用してテクスチャを追加します。 元のゲームでは、最初のオプションが使用され、リメイクでは2番目のオプションが使用されました。テクスチャは、リソースをロードする段階で準備されます。



地図

マップは、レイヤー上のタイルの位置とそのパラメーターを決定する配列です。 最も単純な場合、マップはMxNマトリックスであり、各要素には条件付きの「タイルパレット」からの識別子(数値、数値)が含まれます。 タイルには必ずしも連続したシリアル番号が付いているわけではなく、タイル番号はいくつかの間隔と名前付きスペースに分割されています。 たとえば、土地、木、水、断層、草のタイルには、land1a_00001からland1a_00303までのインデックスがあります。 Caesar IIIでは、30x30〜160x160タイルのサイズの正方形カードが許可されています。 タイルはマップ上にあるため、上部の境界線は「北」になります。







画面上にタイルを描画するには、その距離を考慮する必要があります。タイルをマップ上に配置した順序で単純に描画すると、一部のタイルが誤ったタイミングで描画されたため、アブラカダブラが得られます。







タイルを描画するために必要な順序で、次の画像が表示されます。







1.最初の図は、2Dマップでタイルを描画して深度効果を作成する順序を示しています。

2. 2番目の図は、2.5Dマップでタイルを描画する順序を示しています。タイルが高いほど、より早く描画されるはずです。







この画像は、正しい順序で描画された次のタイルから形成されます。







一般に、レンダリング用のタイルインデックスを生成するコードは次のとおりです。



表示する
//   ""  tilemap map; //  tilearray tiles; //  for( j=0; y < map_size; j++ ) { for( t=0; t <= j; t++ ) { tiles.append( map[ t , map_size - 1 - ( j - t ) ]; } } //   ""  for( i=1; i < map_size; i++ ) { for( int t=0; t < map_size-i; t++ ) { tiles.append( map[ i + t, t ] ); } }
      
      







都市の描画

都市をレンダリングするときに発生する追加の条件。

1.マップ上には、土地、草、建物の静的なタイルだけでなく、動くオブジェクト(人、動物、アニメーション)もあります

2.通過できるオブジェクトがあります(アーチ、門、納屋)

3.タイルとオブジェクトの追加のアニメーション

4.非正方形オブジェクト



これらの条件は、レンダリングプロセスを複雑にし、追加のレンダリングルールを生成します。

1.等角図上のキャラクターの動きは単なるものではありません。 マップは「深さ方向」に回転し、その絶対垂直サイズは水平サイズと一致しません。 したがって、移動するオブジェクトはそれに応じて「上に」移動する必要があります。最も単純な場合、横に2ステップ進むと1ステップ深くなります。

2.動いているオブジェクトはタイルのさまざまな部分にあり、タイルのメイン画像が表示された後に描画されます。これにより、たとえば次のような表示アーチファクトが発生する可能性があります。 これは、移動オブジェクトの描画後に表示される追加のスプライトを描画することによるものです。



+ =



3.アニメーションはメイン画像のサイズを超える場合があります。ここでは、アニメーション(アニメーション)が上下に移動できるが、上下に移動できない機能を考慮する必要があります。そうでない場合、次のタイルでブロックされます。

4.ゲームのほとんどは正方形のオブジェクトを使用しますが、レンダリングアルゴリズムを簡素化するために拡張オブジェクトもあります。それらは、たとえばヒッポドロームなどの小さな(正方形の)パーツにbeatられます。



= + +



描き方

1.最初のパスでは、「平らな」タイルとその上の移動オブジェクトが描画されます

2. 2番目のパスでは、タイルが描画され、その画像はタイルのベースを超えることができます

3.このフラグを持つタイルに対して追加のアニメーションが描画されます。

考えられる質問を予測します。 このアルゴリズムは、私が理解できる限り、元のゲームから復元されました。おそらく、後のバージョンで変更されるでしょう。 レンダリングサイクルを整理するためのヒントは大歓迎です。



シーザーIIIゲームカードの形式

最初の5つのデータブロックは、* .mapファイルで都市に表示されるオブジェクトに直接関連しています。 ファイルの先頭から読み取り、データを連続して読み取ります。



short tile_id [26244] -要素の識別子を含み、各識別子はそのテクスチャに対応します。 たとえば、識別子グループ246-548は、land1a_00001-land1a_00303のテクスチャに対応します。これらは、前述の地球、樹木などのテクスチャです。

byte edge_data [26244] -配列には、tile_id配列でテクスチャが選択されているオブジェクトのサイズに関する情報が含まれています

short terrain_info [26244] -配列には、特定のタイル、地球、水、道路、壁などの表面特性が含まれます( これらのフラグに関する完全な情報

byte minimap_info [26244] - ミニマップを作成するための基本情報。ゲーム中のいくつかの計算にも関与し、一種の「乱数」の配列として機能します。

byte height_info [26244] -この配列は、サーフェス上のタイルの高さを示します。0-地面、1〜15ピクセル、2〜30ピクセルなど。



実用化

Bitbucket.orgのwikiで Caesar IIIとリメイクの進捗に関する詳細情報を見つけることができます。

記事および提供された資料の執筆に協力してくれたBianca van Schaikに感謝します。



そして最後に、小さなテストのスクリーンショット、エトルリアのランサーは噴水の街で激怒しています:










All Articles