根据您的评论,我看到您正在使用平铺地图编辑器。这导致我建议您使用 TiledLib。这里简要说明了如何启动和运行导入 .tmx 文件以在游戏中使用。
内容管道概述
文件 -> 内容导入 -> 内容处理 -> 内容写入 -> .xnb -> ContentRead -> 游戏对象
平铺库
TiledLib 只处理ContentImporter
上图的一部分。它本质上将处理读取 .tmx XML 并允许您将数据处理为运行时所需的任何对象。幸运的是,TiledLib 作者也在下载中提供了一个演示部分。
基本平铺地图处理器演示
BasicDemo
包含 ContentManager.Load 调用的主游戏项目。
BasicDemoContent
具有 Tiled 的 .tmx 文件的项目
BasicDemoContentPipeline
项目有ContentProcessor
TiledLib
其中有ContentImporter
你真的只需要担心它是如何ContentProcessor
工作的,因为 TiledLib 会为你处理所有的导入。尽管我确实建议查看不同的类以了解它如何反序列化 XML(出于教育目的)。
ContentProcessor
Basic Demo 项目中的示例MapContent
从ContentImporter
(TiledLib) 中获取一个对象,并输出一个DemoMapContent
在构建时序列化为 .xnb 并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 文件。请参阅我问过的一个问题:here。
此外,您会注意到,如果您在 Tiled 中使用对象图层,该演示不会向您展示如何处理这些图层。TiledLib 确实正确地导入了它们,您只需将数据提取出来并将其粘贴到适当的类中。稍后我将尝试编辑此答案,并举例说明如何做到这一点。