【问题标题】:Loading a 2D map - C# Monogame加载 2D 地图 - C# Monogame
【发布时间】:2017-12-19 22:37:00
【问题描述】:

大家好,我有个问题。

我正在为我的 2D 游戏制作地图编辑器。

基本上我有一个“插槽”对象,它包含一个“平铺”对象(属于插槽并具有纹理)。我有 2 种类型的插槽:

  1. Type 是 Pen Slots,当您按下它们并弹出用于加载的表单时 计算机上任何位置的磁贴图像。最后点击的磁贴是活动的 瓷砖。

  2. 类型是地图图块。它们是 32x32 的插槽,彼此相邻堆叠,使其看起来像一张地图。当您有一支笔并单击它使其处于活动状态时,您可以绘制地图,然后它将笔槽纹理复制到地图纹理。

现在我设法将我的地图保存到一个文本文件中(对于每个图块 -> Path.GetFileNameWithoutExtenson -> 保存 map.txt)。我可以加载一个文本文件来获取保存的名称,但我不知道如何处理纹理,我应该:

1.我会在我的游戏中使用这个编辑器,所以我可以放置我所有的纹理 从地图编辑器项目中某个文件夹内的游戏中,可以使用相同的纹理相同的名称。

2. ??????

如果有人能想到另一种将纹理加载到地图插槽中的方法,可以推荐我吗?

编辑:

假设我有一个 3 x 3 的地图和 3 个纹理作为图块:

天空天空天空 天空 草 天空 土草土

纹理名称也是天空、草和泥土,因此易于存储 加载地图时变量/数组中的纹理名称。 但是纹理呢?我该如何处理这些图像。

假设我将我的地图编辑器用于 10 种不同的游戏,我将地图保存为带有纹理名称的 map.txt 文件。我重新启动地图编辑器,我想加载地图,它可以很好地加载给定数据的文本,但是图像呢,我如何将图块从地图编辑器传递到游戏

【问题讨论】:

  • 我很难理解你的问题。如果我错了,请纠正我,但您创建了一个地图编辑器,允许用户创建自己的图块(有纹理?),并使用这些图块创建地图(32x32 的图块数组?) - 你是只是不确定保存/加载这些自定义地图/纹理的最佳方式?
  • *允许用户从计算机中选择图像并将其加载到插槽中,并将这些图像用作地图插槽中的图块,这是一个图块宽度和八个 32x32 的数组我不确定加载纹理那些是瓷砖,可以得到他们的名字,但不确定我是否也应该将每个纹理保存在 map.txt 所在的地图文件夹中
  • 我仍然不确定您的实际要求。您不确定应该如何存储用户选择的平铺纹理?假设用户创建了一个包含五个纹理的地图,您不确定如何存储这些纹理以供游戏以后使用?
  • 是的,这就是我要问的

标签: c# monogame


【解决方案1】:

保存信息时,通常最好尽可能地隔离数据。这使得将来的维护更容易,整体设计更清洁。

在您的情况下,我会将每个唯一的图块存储在一个数组中,并且只需让地图跟踪哪些图块去哪里(通过图块数组的索引)。这是the most common way tile maps are implemented in games

如何实际跟踪磁盘上的数据完全取决于您,尽管我建议使用 JSON,因为有许多库可以让解析变得非常容易。尽管您可以使用可序列化的对象,甚至可以编写自己的文件格式。有关在 C# 中读取/写入 JSON 文件的更多信息,请参阅this post

以 JSON 格式存储到磁盘的测试地图示例如下所示:

{  
   "tiles": [  
      {  
         "id": 1,
         "hasCollision": false,
         "texture": "DirtPath.png"
      },
      {  
         "id": 2,
         "hasCollision": true,
         "texture": "DeadTreeStump.png"
      }
   ],
   "maps": [  
      {  
         "id": 1,
         "name": "Test Map",
         "tiles": [  
            0, 0, 0, 0, 0,
            0, 1, 1, 1, 0,
            0, 1, 2, 1, 0,
            0, 1, 1, 1, 0,
            0, 0, 0, 0, 0 ]
      }
   ]
}

【讨论】:

  • 但这并不能回答我的问题,我正在尝试将纹理加载为瓷砖。我已经可以保存地图,我可以从保存的地图中加载纹理的名称,不管这些数据,但我的问题是图像我如何获得这些图像
  • 通常 2D 贴图的纹理被组合在一起并存储在一个名为 tile-map 的文件中。这样做是为了通过减少所需的 IO 操作数量来增加加载时间 - 您可以简单地加载一个然后“剪切”内存中的每个纹理,而不是单独加载所有 20 个平铺纹理。我建议您在地图编辑器中采用类似的方法,而不是在使用用户上传的图像时创建平铺地图。然后可以将这个 tilemap 图像与其他地图文件一起存储。
  • 你是说Tilesheet?我想这样做,但制作可以具有将纹理切割成较小纹理的 tiletexture 的插槽似乎更简单
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多