mirror of
https://github.com/Phantop/LADXHD.git
synced 2024-11-01 04:14:22 +00:00
87 lines
3.4 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|