我已经设法将一个文件读入我的平台游戏中,该游戏由“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>
答案 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);
}
}
}
}
}