あなたのコメントに基づいて、あなたはTiledMapEditorを使用しているようです。これにより、TiledLibを使用することをお勧めします。これは、ゲームで使用するために.tmxファイルをインポートして起動して実行する方法の簡単な説明です。
コンテンツパイプラインの概要
ファイル->コンテンツのインポート->コンテンツプロセス->コンテンツの書き込み->.xnb->ContentRead->ゲームオブジェクト
TiledLib
TiledLibContentImporter
は、上の図の一部のみを処理します。基本的に.tmxXMLの読み取りを処理し、実行時に必要なオブジェクトにデータを処理できるようにします。幸い、TiledLibの作者は、ダウンロードのデモセクションも提供しています。
基本的なタイルマッププロセッサのデモ
BasicDemo
ContentManager.Load呼び出しを含むメインゲームプロジェクト。
BasicDemoContent
Tiledの.tmxファイルがあるプロジェクト
BasicDemoContentPipeline
を持っているプロジェクトContentProcessor
TiledLib
これはContentImporter
ContentProcessor
TiledLibがすべてのインポートを処理するため、実際にはどのように機能するかを心配する必要があります。さまざまなクラスを調べて、XMLがどのように逆シリアル化されているかを理解することをお勧めします(教育目的で)。
ContentProcessor
基本デモプロジェクトの例では、 (TiledLib)MapContent
からオブジェクトを受け取り、ビルド時に.xnbにシリアル化され、実行時にオブジェクトに逆シリアル化されたオブジェクトを出力します。完全に処理された後のマップを表すクラスは次のとおりです。ContentImporter
DemoMapContent
Map
[ContentSerializerRuntimeType("BasicDemo.Map, BasicDemo")]
public class DemoMapContent
{
public int TileWidth;
public int TileHeight;
public List<DemoMapLayerContent> Layers = new List<DemoMapLayerContent>();
}
[ContentSerializerRuntimeType("BasicDemo.Layer, BasicDemo")]
public class DemoMapLayerContent
{
public int Width;
public int Height;
public DemoMapTileContent[] Tiles;
}
[ContentSerializerRuntimeType("BasicDemo.Tile, BasicDemo")]
public class DemoMapTileContent
{
public ExternalReference<Texture2DContent> Texture;
public Rectangle SourceRectangle;
public SpriteEffects SpriteEffects;
}
- A
Map
には、タイルの幅、タイルの高さ、およびのリストが含まれMapLayers
ます。
- A
MapLayer
には、幅、高さ、およびのリストが含まれTiles
ます。
- A
MapTile
には、テクスチャ、ソース長方形(タイルセット内の適切な長方形)、およびオプションのスプライト効果(私はこれまで使用したことがありません)が含まれています。
作り方
ContentProcessor
何が起こっているのかを理解するためにのコメントを読むことをお勧めしますが、簡単に言えば、これが基本です:
- タイルセットのテクスチャデータをロードする
- テクスチャ内から各タイルのソース長方形を取得します
- マップのすべてのレイヤーを反復処理します
- レイヤーごとに、すべてのタイルを繰り返し処理します
- タイルごとに、適切なテクスチャとソースの長方形を取得します
- 入力から出力にすべてのデータを適切に割り当てます
警告
基本的なタイプ(あいまいな、私は知っています)に固執する限り、コンテンツパイプラインの一部ContentWriter
についても心配する必要はありません。ContentReader
ビルド時と実行時に、それぞれ.xnbファイルを自動的にシリアル化および逆シリアル化します。私がこれについて尋ねた質問を参照してください:ここ。
また、Tiled内からオブジェクトレイヤーを使用している場合、デモではそれらの処理方法が示されていません。TiledLibはそれらを適切にインポートします。データを引き出して、適切なクラスに貼り付けるだけです。その方法の例を使って、後でこの回答を編集してみます。