我正在使用Monogame Extended和Tiled制作等距城市建设者。我已经完成了所有设置,现在我需要以某种方式访问特定的磁贴,以便我可以在运行时更改它们,因为用户单击磁贴来构建对象。问题是,我似乎无法找到“map.GetLayer(”Layername“)。GetTile(x,y)或.SetTile(x,y)函数或类似的东西。
现在我可以做的是编辑xml(.tmx)文件,其中有一个表示地图的矩阵和它的绘制图块。这个问题是我需要在编辑要显示的更改后再次在内容管道中构建地图。我不能真正在运行时构建,或者我可以吗?
提前致谢!
答案 0 :(得分:1)
这样的事情会让你分道扬。
var tileLayer = map.GetLayer<TiledMapTileLayer>("layername");
TiledMapTile tile;
if(tileLayer.TryGetTile(x, y, out tile))
{
// do something with tile
}
然而,一旦您从地图上获得了瓷砖,您实际上只能使用有限数量的东西。
没有SetTile
方法,因为目前不支持在运行时更改切片数据。这是渲染器的限制,渲染器已经过优化,可以通过构建静态几何体来渲染非常大的地图,静态几何体一旦加载到图形卡中就无法更改。
关于构建另一个可以处理动态地图更改的渲染器的讨论已经有了一些讨论,但是在这个阶段,库中没有实现这一点。你总是可以自己实现一个简单的渲染器,一个非常基本的渲染器并不像你想象的那么难。
处理此类问题的另一种方法可能是在将地图数据提供给渲染器之前对其进行预处理。我们的想法是有效地将静态地图的图层与动态图层分开,并将动态图块渲染为普通精灵。只是一个想法,我不确定这可能如何运作的细节。
我计划最终在MonoGame.Extended的下一个主要版本中重新访问Tiled API。不要屏住呼吸,这些事情可能需要花费很多时间,但我注意到人们在现有API中遇到的反馈和各种问题。
答案 1 :(得分:1)
由于地图数据存储在通过内容管道运行的XML(或csv)文件中,因此无法在运行时更改它。
无论如何,在城市建设者中,您通常不会更改现有的瓷砖,而是将对象放在现有瓷砖的顶部。