From 91ab911f9cd76e20423c1bb4f77f3a4ccdcc05bd Mon Sep 17 00:00:00 2001 From: Vinzenz Schroeter Date: Wed, 10 Apr 2024 22:39:33 +0200 Subject: [PATCH] another data view --- TanksServer/Graphics/BulletDrawer.cs | 2 +- TanksServer/Graphics/MapDrawer.cs | 4 ++-- TanksServer/Graphics/TankDrawer.cs | 17 ++++++-------- TanksServer/Models/PositionHelpers.cs | 2 -- .../FixedSizeBitGridView.cs | 23 +++++++++++++++++++ ...BitFieldView.cs => FixedSizeBitRowView.cs} | 2 +- .../PixelDisplayBufferView.cs | 10 ++++---- .../SendToServicePointDisplay.cs | 4 ++-- TanksServer/appsettings.json | 3 ++- 9 files changed, 44 insertions(+), 23 deletions(-) create mode 100644 TanksServer/ServicePointDisplay/FixedSizeBitGridView.cs rename TanksServer/ServicePointDisplay/{FixedSizeBitFieldView.cs => FixedSizeBitRowView.cs} (96%) diff --git a/TanksServer/Graphics/BulletDrawer.cs b/TanksServer/Graphics/BulletDrawer.cs index b70d852..fcfa562 100644 --- a/TanksServer/Graphics/BulletDrawer.cs +++ b/TanksServer/Graphics/BulletDrawer.cs @@ -8,6 +8,6 @@ internal sealed class BulletDrawer(BulletManager bullets): IDrawStep public void Draw(PixelDisplayBufferView buffer) { foreach (var bullet in bullets.GetAll()) - buffer.Pixels[bullet.Position.ToPixelPosition().ToPixelIndex()] = true; + buffer.Pixels[bullet.Position.ToPixelPosition()] = true; } } diff --git a/TanksServer/Graphics/MapDrawer.cs b/TanksServer/Graphics/MapDrawer.cs index c1e9ebd..d40fef6 100644 --- a/TanksServer/Graphics/MapDrawer.cs +++ b/TanksServer/Graphics/MapDrawer.cs @@ -17,8 +17,8 @@ internal sealed class MapDrawer(MapService map) : IDrawStep for (byte pixelInTileY = 0; pixelInTileY < MapService.TileSize; pixelInTileY++) for (byte pixelInTileX = 0; pixelInTileX < MapService.TileSize; pixelInTileX++) { - var index = tile.GetPixelRelative(pixelInTileX, pixelInTileY).ToPixelIndex(); - buffer.Pixels[index] = pixelInTileX % 2 == pixelInTileY % 2; + var position = tile.GetPixelRelative(pixelInTileX, pixelInTileY); + buffer.Pixels[position] = pixelInTileX % 2 == pixelInTileY % 2; } } } diff --git a/TanksServer/Graphics/TankDrawer.cs b/TanksServer/Graphics/TankDrawer.cs index e21bccd..61e3d0c 100644 --- a/TanksServer/Graphics/TankDrawer.cs +++ b/TanksServer/Graphics/TankDrawer.cs @@ -35,18 +35,15 @@ internal sealed class TankDrawer : IDrawStep { var pos = tank.Position.ToPixelPosition(); var rotationVariant = (int)Math.Round(tank.Rotation) % 16; + for (var dy = 0; dy < MapService.TileSize; dy++) + for (var dx = 0; dx < MapService.TileSize; dx++) { - var rowStartIndex = (pos.Y + dy) * MapService.PixelsPerRow; + if (!TankSpriteAt(dx, dy, rotationVariant)) + continue; - for (var dx = 0; dx < MapService.TileSize; dx++) - { - if (!TankSpriteAt(dx, dy, rotationVariant)) - continue; - - var i = rowStartIndex + pos.X + dx; - buffer.Pixels[i] = true; - } + var position = new PixelPosition(pos.X + dx, pos.Y + dy); + buffer.Pixels[position] = true; } } } @@ -59,4 +56,4 @@ internal sealed class TankDrawer : IDrawStep return _tankSprite[index]; } -} +} \ No newline at end of file diff --git a/TanksServer/Models/PositionHelpers.cs b/TanksServer/Models/PositionHelpers.cs index e0985b0..ae15bf0 100644 --- a/TanksServer/Models/PositionHelpers.cs +++ b/TanksServer/Models/PositionHelpers.cs @@ -5,8 +5,6 @@ namespace TanksServer.Models; internal static class PositionHelpers { - public static int ToPixelIndex(this PixelPosition position) => position.Y * MapService.PixelsPerRow + position.X; - public static PixelPosition GetPixelRelative(this TilePosition position, byte subX, byte subY) { Debug.Assert(subX < 8); diff --git a/TanksServer/ServicePointDisplay/FixedSizeBitGridView.cs b/TanksServer/ServicePointDisplay/FixedSizeBitGridView.cs new file mode 100644 index 0000000..bcd598f --- /dev/null +++ b/TanksServer/ServicePointDisplay/FixedSizeBitGridView.cs @@ -0,0 +1,23 @@ +using System.Diagnostics; + +namespace TanksServer.ServicePointDisplay; + +internal sealed class FixedSizeBitGridView(Memory data, int columns, int rows) +{ + private readonly FixedSizeBitRowView _bits = new(data); + + public bool this[PixelPosition position] + { + get => _bits[ToPixelIndex(position)]; + set => _bits[ToPixelIndex(position)] = value; + } + + private int ToPixelIndex(PixelPosition position) + { + Debug.Assert(position.X < columns); + Debug.Assert(position.Y < rows); + var index = position.Y * columns + position.X; + ArgumentOutOfRangeException.ThrowIfNegative(index, nameof(position)); + return index; + } +} \ No newline at end of file diff --git a/TanksServer/ServicePointDisplay/FixedSizeBitFieldView.cs b/TanksServer/ServicePointDisplay/FixedSizeBitRowView.cs similarity index 96% rename from TanksServer/ServicePointDisplay/FixedSizeBitFieldView.cs rename to TanksServer/ServicePointDisplay/FixedSizeBitRowView.cs index dccc25e..b3ccbdf 100644 --- a/TanksServer/ServicePointDisplay/FixedSizeBitFieldView.cs +++ b/TanksServer/ServicePointDisplay/FixedSizeBitRowView.cs @@ -2,7 +2,7 @@ using System.Collections; namespace TanksServer.ServicePointDisplay; -internal sealed class FixedSizeBitFieldView(Memory data) : IList +internal sealed class FixedSizeBitRowView(Memory data) : IList { public int Count => data.Length * 8; public bool IsReadOnly => false; diff --git a/TanksServer/ServicePointDisplay/PixelDisplayBufferView.cs b/TanksServer/ServicePointDisplay/PixelDisplayBufferView.cs index 6da0f76..3532a7c 100644 --- a/TanksServer/ServicePointDisplay/PixelDisplayBufferView.cs +++ b/TanksServer/ServicePointDisplay/PixelDisplayBufferView.cs @@ -1,20 +1,22 @@ +using TanksServer.GameLogic; + namespace TanksServer.ServicePointDisplay; internal sealed class PixelDisplayBufferView : DisplayBufferView { - private PixelDisplayBufferView(byte[] data) : base(data) + private PixelDisplayBufferView(byte[] data, int columns, int pixelRows) : base(data) { - Pixels = new FixedSizeBitFieldView(Data.AsMemory(10)); + Pixels = new FixedSizeBitGridView(Data.AsMemory(10), columns, pixelRows); } // ReSharper disable once CollectionNeverQueried.Global (setting values in collection updates underlying byte array) - public FixedSizeBitFieldView Pixels { get; } + public FixedSizeBitGridView Pixels { get; } public static PixelDisplayBufferView New(ushort x, ushort y, ushort widthInTiles, ushort pixelRows) { // 10 bytes header, one byte per tile row (with one bit each pixel) after that var size = 10 + widthInTiles * pixelRows; - return new PixelDisplayBufferView(new byte[size]) + return new PixelDisplayBufferView(new byte[size], widthInTiles * MapService.TileSize, pixelRows) { Mode = 19, TileX = x, diff --git a/TanksServer/ServicePointDisplay/SendToServicePointDisplay.cs b/TanksServer/ServicePointDisplay/SendToServicePointDisplay.cs index 7906f2f..003afb0 100644 --- a/TanksServer/ServicePointDisplay/SendToServicePointDisplay.cs +++ b/TanksServer/ServicePointDisplay/SendToServicePointDisplay.cs @@ -90,10 +90,10 @@ internal sealed class SendToServicePointDisplay : ITickStep, IDisposable foreach (var p in playersToDisplay) { var score = p.Kills.ToString(); - var nameLength = ScoresWidth - score.Length; + var nameLength = Math.Min(p.Name.Length, ScoresWidth - score.Length - 1); var name = p.Name[..nameLength]; - var spaces = new string(' ', nameLength - name.Length + 1); + var spaces = new string(' ', ScoresWidth - score.Length - nameLength); _scoresBuffer.Rows[row] = name + spaces + score; row++; diff --git a/TanksServer/appsettings.json b/TanksServer/appsettings.json index e4622ad..0266752 100644 --- a/TanksServer/appsettings.json +++ b/TanksServer/appsettings.json @@ -3,7 +3,8 @@ "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning", - "TanksServer": "Debug" + "TanksServer": "Debug", + "Microsoft.AspNetCore.HttpLogging": "Debug" } }, "AllowedHosts": "*",