LADXHD/InGame/Map/TileMap.cs
2023-12-14 17:21:22 -05:00

87 lines
3.4 KiB
C#

using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using ProjectZ.InGame.Things;
namespace ProjectZ.InGame.Map
{
public class TileMap
{
public Texture2D SprTileset;
public Texture2D SprTilesetBlur;
public string TilesetPath;
public int[,,] ArrayTileMap;
public int TileSize;
public int TileCountX;
public int TileCountY;
public bool BlurLayer = false;
public void SetTileset(Texture2D sprTileset, int tileSize = 16)
{
SprTileset = sprTileset;
SprTilesetBlur = Resources.SprBlurTileset;
TileSize = tileSize;
// calculate how many tiles are horizontally and vertically
TileCountX = SprTileset.Width / TileSize;
TileCountY = SprTileset.Height / TileSize;
}
public void Draw(SpriteBatch spriteBatch)
{
if (ArrayTileMap == null)
return;
spriteBatch.Begin(SpriteSortMode.Deferred, null, MapManager.Camera.Scale >= 1 ?
SamplerState.PointWrap : SamplerState.AnisotropicWrap, null, null, null, MapManager.Camera.TransformMatrix);
for (var i = 0; i < ArrayTileMap.GetLength(2) - (BlurLayer ? 1 : 0); i++)
DrawTileLayer(spriteBatch, SprTileset, i);
spriteBatch.End();
}
// TODO_End: this could be optimized like in MonoGame.Extended
public void DrawTileLayer(SpriteBatch spriteBatch, Texture2D tileset, int layer, int padding = 0)
{
var halfWidth = Game1.RenderWidth / 2;
var halfHeight = Game1.RenderHeight / 2;
var tileSize = Values.TileSize;
var camera = MapManager.Camera;
var startX = Math.Max(0, (int)((camera.X - halfWidth) / (camera.Scale * tileSize)) - padding);
var startY = Math.Max(0, (int)((camera.Y - halfHeight) / (camera.Scale * tileSize)) - padding);
var endX = Math.Min(ArrayTileMap.GetLength(0), (int)((camera.X + halfWidth) / (camera.Scale * tileSize)) + 1 + padding);
var endY = Math.Min(ArrayTileMap.GetLength(1), (int)((camera.Y + halfHeight) / (camera.Scale * tileSize)) + 1 + padding);
for (var y = startY; y < endY; y++)
for (var x = startX; x < endX; x++)
{
if (ArrayTileMap[x, y, layer] >= 0)
spriteBatch.Draw(tileset,
new Rectangle(x * tileSize, y * tileSize, tileSize, tileSize),
new Rectangle((ArrayTileMap[x, y, layer] % (tileset.Width / TileSize)) * TileSize,
ArrayTileMap[x, y, layer] / (tileset.Width / TileSize) * TileSize, TileSize, TileSize),
Color.White);
}
}
// this should probably be at a different location
public void DrawBlurLayer(SpriteBatch spriteBatch)
{
if (ArrayTileMap == null)
return;
//SprTilesetBlur.Dispose();
//Resources.LoadTexture(out SprTilesetBlur, "D:\\Dev\\ProjectZ\\ProjectZ\\bin\\Data\\Maps\\Tilesets\\blur tileset.png");
DrawTileLayer(spriteBatch, SprTilesetBlur, ArrayTileMap.GetLength(2) - 1, 1);
}
}
}