mine2d/Mine2d/core/tiles/Tile.cs

72 lines
2.2 KiB
C#

using mine2d.core.data;
namespace mine2d.core.tiles;
public class Tile
{
public string Name { get; set; }
public int Hardness { get; set; }
private readonly IntPtr texture;
private static IntPtr breakingTexture;
public Tile(string name, string textureName, int hardness)
{
this.Name = name;
this.Hardness = hardness;
var rl = Context.Get().ResourceLoader;
var (ptr, size) = rl.LoadToIntPtr("assets." + textureName + ".png");
var sdlBuffer = SDL_RWFromMem(ptr, size);
var surface = IMG_Load_RW(sdlBuffer, 1);
this.texture = Context.Get().Renderer.CreateTextureFromSurface(surface);
if (breakingTexture == IntPtr.Zero)
{
LoadBreakingTexture();
}
SDL_FreeSurface(surface);
}
~Tile()
{
SDL_DestroyTexture(this.texture);
}
public void Render(int x, int y, STile tile)
{
var renderer = Context.Get().Renderer;
var scale = Context.Get().FrontendGameState.Settings.GameScale;
var camera = Context.Get().FrontendGameState.Camera;
renderer.DrawTexture(
this.texture,
(x - (int)camera.Position.X) * scale,
(y - (int)camera.Position.Y) * scale,
Constants.TileSize * scale,
Constants.TileSize * scale
);
if (tile.Hits > 0)
{
var breakingOffset = (int)((double)tile.Hits / this.Hardness * 4);
renderer.DrawTexture(
breakingTexture,
(x - (int)camera.Position.X) * scale,
(y - (int)camera.Position.Y) * scale,
Constants.TileSize * scale,
Constants.TileSize * scale,
breakingOffset,
16,
16
);
}
}
private static void LoadBreakingTexture()
{
var rl = Context.Get().ResourceLoader;
var (ptr, size) = rl.LoadToIntPtr("assets.breaking.png");
var sdlBuffer = SDL_RWFromMem(ptr, size);
var surface = IMG_Load_RW(sdlBuffer, 1);
breakingTexture = Context.Get().Renderer.CreateTextureFromSurface(surface);
SDL_FreeSurface(surface);
}
}