make big display toggleable

This commit is contained in:
Vinzenz Schroeter 2024-04-07 20:16:22 +02:00
parent a9aaf899a2
commit dc9ad21a3d
29 changed files with 119 additions and 46 deletions

View file

@ -1,3 +1,5 @@
using TanksServer.Models;
namespace TanksServer.Services;
internal sealed class BulletManager

View file

@ -1,9 +1,12 @@
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using TanksServer.TickSteps;
namespace TanksServer.Services;
internal sealed class GameTickService(IEnumerable<ITickStep> steps) : IHostedService, IDisposable
internal sealed class GameTickService(
IEnumerable<ITickStep> steps, IHostApplicationLifetime lifetime, ILogger<GameTickService> logger
) : IHostedService, IDisposable
{
private readonly CancellationTokenSource _cancellation = new();
private readonly List<ITickStep> _steps = steps.ToList();
@ -17,11 +20,19 @@ internal sealed class GameTickService(IEnumerable<ITickStep> steps) : IHostedSer
private async Task RunAsync()
{
while (!_cancellation.IsCancellationRequested)
try
{
foreach (var step in _steps)
await step.TickAsync();
await Task.Delay(1000/25);
while (!_cancellation.IsCancellationRequested)
{
foreach (var step in _steps)
await step.TickAsync();
await Task.Delay(1000 / 25);
}
}
catch (Exception ex)
{
logger.LogError(ex, "game tick service crashed");
lifetime.StopApplication();
}
}

View file

@ -0,0 +1,14 @@
using TanksServer.Helpers;
namespace TanksServer.Services;
internal sealed class LastFinishedFrameProvider
{
private DisplayPixelBuffer? _lastFrame;
public DisplayPixelBuffer LastFrame
{
get => _lastFrame ?? throw new InvalidOperationException("first frame not yet drawn");
set => _lastFrame = value;
}
}

View file

@ -1,3 +1,5 @@
using TanksServer.Models;
namespace TanksServer.Services;
internal sealed class MapService

View file

@ -1,42 +0,0 @@
using TanksServer.DrawSteps;
using TanksServer.Helpers;
using TanksServer.TickSteps;
namespace TanksServer.Services;
internal sealed class PixelDrawer(IEnumerable<IDrawStep> drawSteps) : ITickStep
{
private const uint GameFieldPixelCount = MapService.PixelsPerRow * MapService.PixelsPerColumn;
private DisplayPixelBuffer? _lastFrame;
private readonly List<IDrawStep> _drawSteps = drawSteps.ToList();
public DisplayPixelBuffer LastFrame
{
get => _lastFrame ?? throw new InvalidOperationException("first frame not yet drawn");
private set => _lastFrame = value;
}
public Task TickAsync()
{
var buffer = CreateGameFieldPixelBuffer();
foreach (var step in _drawSteps)
step.Draw(buffer);
LastFrame = buffer;
return Task.CompletedTask;
}
private static DisplayPixelBuffer CreateGameFieldPixelBuffer()
{
var data = new byte[10 + GameFieldPixelCount / 8];
var result = new DisplayPixelBuffer(data)
{
Magic1 = 0,
Magic2 = 19,
X = 0,
Y = 0,
WidthInTiles = MapService.TilesPerRow,
HeightInPixels = MapService.PixelsPerColumn
};
return result;
}
}

View file

@ -0,0 +1,8 @@
using TanksServer.Models;
namespace TanksServer.Services;
internal sealed class SpawnQueueProvider
{
public ConcurrentQueue<Player> Queue { get; } = new();
}

View file

@ -1,6 +1,6 @@
using System.Collections;
using System.Collections.Concurrent;
using Microsoft.Extensions.Logging;
using TanksServer.Models;
namespace TanksServer.Services;