49 lines
1.4 KiB
C#
49 lines
1.4 KiB
C#
using Mine2d.engine;
|
|
|
|
namespace Mine2d.game.frontend.renderer;
|
|
|
|
public class BackgroundRenderer : IRenderer
|
|
{
|
|
private readonly IntPtr texture;
|
|
|
|
public BackgroundRenderer()
|
|
{
|
|
var rl = Context.Get().ResourceLoader;
|
|
var (ptr, size) = rl.LoadToIntPtr("assets.background.png");
|
|
var sdlBuffer = SDL_RWFromMem(ptr, size);
|
|
var surface = IMG_Load_RW(sdlBuffer, 1);
|
|
this.texture = Context.Get().Renderer.CreateTextureFromSurface(surface);
|
|
SDL_FreeSurface(surface);
|
|
}
|
|
|
|
~BackgroundRenderer()
|
|
{
|
|
SDL_DestroyTexture(this.texture);
|
|
}
|
|
|
|
public void Render()
|
|
{
|
|
var ctx = Context.Get();
|
|
var camera = ctx.FrontendGameState.Camera;
|
|
var scale = ctx.FrontendGameState.Settings.GameScale;
|
|
var renderer = ctx.Renderer;
|
|
var (w, h) = ctx.Window.GetSize();
|
|
var offsetX = camera.Position.X / scale % 16;
|
|
var offsetY = camera.Position.Y / scale % 16;
|
|
w /= scale;
|
|
h /= scale;
|
|
|
|
for (var x = -16; x < w + 16; x += 16)
|
|
{
|
|
for (var y = -16; y < h + 16; y += 16)
|
|
{
|
|
var rx = (x - (int)offsetX) * scale;
|
|
var ry = (y - (int)offsetY) * scale;
|
|
var rw = 16 * scale;
|
|
var rh = 16 * scale;
|
|
renderer.DrawTexture(this.texture, rx, ry, rw, rh);
|
|
}
|
|
}
|
|
}
|
|
}
|