DangerousD/DangerousD/GameCore/Managers/MapManager.cs
2023-08-18 11:47:24 +03:00

124 lines
5.2 KiB
C#

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Xml;
using DangerousD.GameCore.GameObjects.MapObjects;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using System.Xml.Serialization;
using DangerousD.GameCore.GameObjects;
using System.Globalization;
using System.IO;
using DangerousD.GameCore.GameObjects.Entities;
using DangerousD.GameCore.GameObjects.LivingEntities;
namespace DangerousD.GameCore.Managers
{
public class MapManager
{
private int _scale;
private int _columns;
public MapManager(int scale)
{
_scale = scale;
}
//Level
public void LoadLevel(string level)
{
LoadTilesData();
XmlDocument xml = new();
xml.Load($"../../../Content/{level}.tmx");
Vector2 tileSize = new(int.Parse(xml.DocumentElement.Attributes["tilewidth"].Value),
int.Parse(xml.DocumentElement.Attributes["tileheight"].Value));
//tileSize *= _scale;
foreach (XmlNode layer in xml.DocumentElement.SelectNodes("layer"))
{
InstantiateTiles(layer, tileSize);
}
foreach (XmlNode layer in xml.DocumentElement.SelectNodes("objectgroup"))
{
InstantiateEntities(layer);
}
}
private void InstantiateTiles(XmlNode layer, Vector2 tileSize)
{
string tileType = layer.Attributes["class"].Value;
float offsetX = layer.Attributes["offsetx"] is not null ? float.Parse(layer.Attributes["offsetx"].Value, CultureInfo.InvariantCulture) : 0;
float offsetY = layer.Attributes["offsety"] is not null ? float.Parse(layer.Attributes["offsety"].Value, CultureInfo.InvariantCulture) : 0;
Debug.Write(layer.SelectNodes("data/chunk").Count);
foreach (XmlNode chunk in layer.SelectNodes("data/chunk"))
{
int chunkW = int.Parse(chunk.Attributes["width"].Value);
int chunkX = int.Parse(chunk.Attributes["x"].Value);
int chunkY = int.Parse(chunk.Attributes["y"].Value);
List<int> tiles = chunk.InnerText.Split(',').Select(int.Parse).ToList();
for (int i = 0; i < tiles.Count; i++)
{
if (tiles[i] != 0)
{
Vector2 pos = new(((chunkX+ i % chunkW) * tileSize.X + offsetX) * _scale,
((chunkY + i / chunkW) * tileSize.Y + offsetY) * _scale);
//pos *= _scale;
Rectangle sourceRect = new(new Point((tiles[i] -1) % _columns, (tiles[i] -1) / _columns) * tileSize.ToPoint(), tileSize.ToPoint());
Type type = Type.GetType($"DangerousD.GameCore.GameObjects.MapObjects.{tileType}");
Activator.CreateInstance(type, pos, tileSize * _scale, sourceRect);
}
}
}
}
private void LoadTilesData()
{
XmlDocument xml = new();
xml.Load($"../../../Content/map.tsx");
XmlNode root = xml.DocumentElement;
_columns = int.Parse(root.Attributes["columns"].Value);
}
private void InstantiateEntities(XmlNode group)
{
string entityGroup = group.Attributes["class"] is not null ? group.Attributes["class"].Value : "";
float offsetX = group.Attributes["offsetx"] is not null ? float.Parse(group.Attributes["offsetx"].Value) : 0;
float offsetY = group.Attributes["offsety"] is not null ? float.Parse(group.Attributes["offsety"].Value) : 0;
foreach (XmlNode entity in group.ChildNodes)
{
string entityType = entity.Attributes["type"] is not null ? "." + entity.Attributes["type"].Value : "";
Type type = Type.GetType($"DangerousD.GameCore.GameObjects.{entityGroup}{entityType}");
Vector2 pos =
new Vector2(float.Parse(entity.Attributes["x"].Value, CultureInfo.InvariantCulture) + offsetX,
float.Parse(entity.Attributes["y"].Value, CultureInfo.InvariantCulture) + offsetY) * _scale;
Entity inst;
if (type.Equals(typeof(Player)))
{
inst = (Entity)Activator.CreateInstance(type, pos, false);
}
else if (type.Equals(typeof(Door)))
{
int gid = entity.Attributes["gid"] is not null ? int.Parse(entity.Attributes["gid"].Value) : 0;
inst = (Entity)Activator.CreateInstance(type, pos, new Vector2(32, 48), new Rectangle((gid - 872)*32, 0, 32, 48));
}
else
{
inst = (Entity)Activator.CreateInstance(type, pos);
}
inst.SetPosition(new Vector2(inst.Pos.X, inst.Pos.Y - inst.Height));
inst.Height *= _scale;
inst.Width *= _scale;
}
}
}
}