2017-09-26 87 views
0

我已经设法使用TiledSharp图书馆将文件读入由'平铺'级别编辑器制作的平台游戏中。我终于设法加载了一个关卡,并在我的游戏中正确显示,但我无法解决如何访问我在地图上的瓷砖上设置的自定义属性。例如,我有一个名为'忽略'的布尔属性,它指定在碰撞计算中瓦片是否应该被忽略。我希望能够读取每个图块加载时的“忽略”属性。像这样的:在'平铺'级别地图(C#,Monogame)中访问自定义属性

for (var i = 0; i < map.Layers[0].Tiles.Count; i++) 
{ 
    Console.WriteLine(map.Layers[0].Tiles[i].Ignore); 
} 

但是我找不到一种方法来访问这些属性。任何人都可以帮忙吗?谢谢!

编辑:这里有一个小的文件我读的内容:

<?xml version="1.0" encoding="UTF-8"?> 
<map version="1.0" orientation="orthogonal" renderorder="right-down" width="16" height="9" tilewidth="80" tileheight="80" nextobjectid="1"> 
<tileset firstgid="1" name="GroundTileSet" tilewidth="80" tileheight="80" tilecount="24" columns="6"> 
    <image source="GroundTileSet2.png" trans="df7126" width="480" height="320"/> 
    <tile id="0"> 
    <properties> 
    <property name="Ignore" type="bool" value="true"/> 
    <property name="OneWay" type="bool" value="false"/> 
    </properties> 
    </tile> 

回答

1

我设法解决这个问题。我发布了我的整个Level课程,以防止任何人受到影响。

using System; 
using TiledSharp; 
using System.Xml.Linq; 
using Microsoft.Xna.Framework.Graphics; 
using Microsoft.Xna.Framework; 

namespace Platformer 
{ 
    class Level 
    { 
     public Level(TmxMap map, Texture2D tileSet) 
     { 
      var tileMap = map; 
      Texture2D levelTilesetTexture = tileSet; 

      int tileWidth = tileMap.Tilesets[0].TileWidth; 
      int tileHeight = tileMap.Tilesets[0].TileHeight; 
      int tilesetTilesWide = levelTilesetTexture.Width/tileWidth; 
      int tilesetTilesHigh = levelTilesetTexture.Height/tileHeight; 
      GameInfo.gameInfo.bottomOfLevel = tileMap.Height * tileHeight; 
      GameInfo.gameInfo.leftOfLevel = 0; 


      int staticObjectSpriteWidth = tileMap.TileWidth; 
      int staticObjectSpriteHeight = tileMap.TileHeight; 
      Vector2 staticObjectBoundingBoxOffset = new Vector2(0, 0); 
      int staticObjectBoundingBoxWidth = tileMap.TileWidth; 
      int staticObjectBoundingBoxHeight = tileMap.TileHeight; 
      bool oneWayPlatform = false; 
      bool collisionObject = true; 
      bool ignore = false; 
      int drawLayer = 1; 

      for (var i = 0; i < tileMap.Layers[0].Tiles.Count; i++) 
      { 
       int tileNumber = tileMap.Layers[0].Tiles[i].Gid; 
       if (tileNumber != 0) // If not empty tile. 
       { 
        tileNumber--; 
        var tileProperties = tileMap.Tilesets[0].Tiles[tileNumber].Properties; 
        string ignoreValue = "nothing"; 
        string oneWayValue = "nothing"; 
        tileProperties.TryGetValue("Ignore", out ignoreValue); 
        ignore = Convert.ToBoolean(ignoreValue); 
        tileProperties.TryGetValue("OneWay", out oneWayValue); 
        oneWayPlatform = Convert.ToBoolean(oneWayValue); 

        int column = tileNumber % tilesetTilesWide; 
        int row = (int)Math.Floor((double)tileNumber/(double)tilesetTilesWide); 

        float x = (i % tileMap.Width) * tileMap.TileWidth; 
        float y = (float)Math.Floor(i/(double)tileMap.Width) * tileMap.TileHeight; 

        PlatformerGame.game.CreateStaticObject(levelTilesetTexture, new Vector2(x, y), staticObjectSpriteWidth, staticObjectSpriteHeight, 
          staticObjectBoundingBoxOffset, staticObjectBoundingBoxWidth, staticObjectBoundingBoxHeight, 
          column, row, oneWayPlatform, collisionObject, drawLayer, ignore); 
       } 
      } 
     } 
    } 
}