访问' Tiled'中的自定义属性水平图(C#,Monogame)

时间:2017-09-26 14:35:17

标签: c# monogame tiled

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

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 个答案:

答案 0 :(得分: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);
                }
            }
        }
    }
}