socket fixes, fix tank jumping

This commit is contained in:
Vinzenz Schroeter 2024-04-13 16:27:45 +02:00
parent 9620703efc
commit b3dacbd6f6
13 changed files with 44 additions and 46 deletions

View file

@ -52,7 +52,8 @@ public sealed class Cp437Grid(ushort width, ushort height) : IEquatable<Cp437Gri
{ {
ReadOnlySpan<byte> valueBytes = stackalloc byte[] { b }; ReadOnlySpan<byte> valueBytes = stackalloc byte[] { b };
Span<char> resultStr = stackalloc char[1]; Span<char> resultStr = stackalloc char[1];
_encoding.GetChars(valueBytes, resultStr); var consumed = _encoding.GetChars(valueBytes, resultStr);
Debug.Assert(consumed == 1);
return resultStr[0]; return resultStr[0];
} }

View file

@ -32,7 +32,7 @@ internal sealed class SpawnNewTanks(
if (map.IsCurrentlyWall(tile)) if (map.IsCurrentlyWall(tile))
continue; continue;
var tilePixelCenter = tile.GetPixelRelative(4, 4).ToFloatPosition(); var tilePixelCenter = tile.ToPixelPosition().GetPixelRelative(4, 4).ToFloatPosition();
var minDistance = bullets.GetAll() var minDistance = bullets.GetAll()
.Cast<IMapEntity>() .Cast<IMapEntity>()

View file

@ -8,6 +8,6 @@ internal sealed class DrawBulletsStep(BulletManager bullets) : IDrawStep
public void Draw(PixelGrid buffer) public void Draw(PixelGrid buffer)
{ {
foreach (var position in bullets.GetAll().Select(b => b.Position.ToPixelPosition())) foreach (var position in bullets.GetAll().Select(b => b.Position.ToPixelPosition()))
buffer[position.X, position.Y] = true; buffer[(ushort)position.X, (ushort)position.Y] = true;
} }
} }

View file

@ -17,8 +17,8 @@ internal sealed class DrawMapStep(MapService map) : IDrawStep
for (byte pixelInTileY = 0; pixelInTileY < MapService.TileSize; pixelInTileY++) for (byte pixelInTileY = 0; pixelInTileY < MapService.TileSize; pixelInTileY++)
for (byte pixelInTileX = 0; pixelInTileX < MapService.TileSize; pixelInTileX++) for (byte pixelInTileX = 0; pixelInTileX < MapService.TileSize; pixelInTileX++)
{ {
var position = tile.GetPixelRelative(pixelInTileX, pixelInTileY); var (x, y) = tile.ToPixelPosition().GetPixelRelative(pixelInTileX, pixelInTileY);
buffer[position.X, position.Y] = pixelInTileX % 2 == pixelInTileY % 2; buffer[(ushort)x, (ushort)y] = pixelInTileX % 2 == pixelInTileY % 2;
} }
} }
} }

View file

@ -40,8 +40,8 @@ internal sealed class DrawTanksStep : IDrawStep
if (!TankSpriteAt(dx, dy, orientation)) if (!TankSpriteAt(dx, dy, orientation))
continue; continue;
var position = tankPosition.GetPixelRelative(dx, dy); var (x, y) = tankPosition.GetPixelRelative(dx, dy);
buffer[position.X, position.Y] = true; buffer[(ushort)x, (ushort)y] = true;
} }
} }
} }

View file

@ -18,7 +18,7 @@ internal sealed class ByteChannelWebSocket(WebSocket socket, ILogger logger, int
yield return _buffer.ToArray(); yield return _buffer.ToArray();
} }
if (socket.State != WebSocketState.Closed) if (socket.State is not WebSocketState.Closed and not WebSocketState.Aborted)
Debugger.Break(); Debugger.Break();
} }

View file

@ -93,9 +93,9 @@ internal sealed class ClientScreenServer(
await _channel.SendAsync(pixels.Data); await _channel.SendAsync(pixels.Data);
_lastSentPixels = pixels; _lastSentPixels = pixels;
} }
catch (ChannelClosedException) catch (WebSocketException ex)
{ {
_logger.LogWarning("send failed, channel is closed"); _logger.LogWarning(ex, "send failed");
} }
} }

View file

@ -1,9 +1,11 @@
using System.Diagnostics;
using TanksServer.GameLogic; using TanksServer.GameLogic;
namespace TanksServer.Models; namespace TanksServer.Models;
[DebuggerDisplay("({X} | {Y})")]
internal readonly struct FloatPosition(double x, double y) internal readonly struct FloatPosition(double x, double y)
{ {
public double X { get; } = (x + MapService.PixelsPerRow) % MapService.PixelsPerRow; public double X { get; } = (x + MapService.PixelsPerRow) % MapService.PixelsPerRow;
public double Y { get; } = (y + MapService.PixelsPerColumn) % MapService.PixelsPerColumn; public double Y { get; } = (y + MapService.PixelsPerColumn) % MapService.PixelsPerColumn;
} }

View file

@ -1,3 +1,6 @@
using System.Diagnostics;
namespace TanksServer.Models; namespace TanksServer.Models;
[DebuggerDisplay("{TopLeft}, {BottomRight}")]
internal record struct PixelBounds(PixelPosition TopLeft, PixelPosition BottomRight); internal record struct PixelBounds(PixelPosition TopLeft, PixelPosition BottomRight);

View file

@ -1,9 +1,17 @@
using System.Diagnostics;
using TanksServer.GameLogic; using TanksServer.GameLogic;
namespace TanksServer.Models; namespace TanksServer.Models;
internal readonly struct PixelPosition(ushort x, ushort y) [DebuggerDisplay("({X} | {Y})")]
internal readonly struct PixelPosition(int x, int y)
{ {
public ushort X { get; } = (ushort)((x + MapService.PixelsPerRow) % MapService.PixelsPerRow); public int X { get; } = (x + MapService.PixelsPerRow) % MapService.PixelsPerRow;
public ushort Y { get; } = (ushort)((y + MapService.PixelsPerColumn) % MapService.PixelsPerColumn); public int Y { get; } = (y + MapService.PixelsPerColumn) % MapService.PixelsPerColumn;
}
public void Deconstruct(out int x, out int y)
{
x = X;
y = Y;
}
}

View file

@ -1,31 +1,14 @@
using System.Diagnostics;
using TanksServer.GameLogic; using TanksServer.GameLogic;
namespace TanksServer.Models; namespace TanksServer.Models;
internal static class PositionHelpers internal static class PositionHelpers
{ {
public static PixelPosition GetPixelRelative(this TilePosition position, byte subX, byte subY) public static PixelPosition GetPixelRelative(this PixelPosition position, short subX, short subY)
{ => new(position.X + subX, position.Y + subY);
Debug.Assert(subX < 8);
Debug.Assert(subY < 8);
return new PixelPosition(
(ushort)(position.X * MapService.TileSize + subX),
(ushort)(position.Y * MapService.TileSize + subY)
);
}
public static PixelPosition GetPixelRelative(this PixelPosition position, byte subX, byte subY) public static PixelPosition ToPixelPosition(this FloatPosition position)
{ => new((int)position.X, (int)position.Y);
Debug.Assert(subX < 8);
Debug.Assert(subY < 8);
return new PixelPosition((ushort)(position.X + subX), (ushort)(position.Y + subY));
}
public static PixelPosition ToPixelPosition(this FloatPosition position) => new(
(ushort)((int)position.X % MapService.PixelsPerRow),
(ushort)((int)position.Y % MapService.PixelsPerRow)
);
public static PixelPosition ToPixelPosition(this TilePosition position) => new( public static PixelPosition ToPixelPosition(this TilePosition position) => new(
(ushort)(position.X * MapService.TileSize), (ushort)(position.X * MapService.TileSize),

View file

@ -28,13 +28,12 @@ internal sealed class Tank(Player player, FloatPosition spawnPosition) : IMapEnt
public PixelBounds Bounds => GetBoundsForCenter(Position); public PixelBounds Bounds => GetBoundsForCenter(Position);
public static PixelBounds GetBoundsForCenter(FloatPosition position) => new( public static PixelBounds GetBoundsForCenter(FloatPosition position)
new PixelPosition( {
(ushort)(position.X - MapService.TileSize / 2d), var pixelPosition = position.ToPixelPosition();
(ushort)(position.Y - MapService.TileSize / 2d) return new PixelBounds(
), new PixelPosition( pixelPosition.GetPixelRelative(-3, -3),
(ushort)(position.X + MapService.TileSize / 2d - 1d), pixelPosition.GetPixelRelative(4, 4)
(ushort)(position.Y + MapService.TileSize / 2d - 1d) );
) }
);
} }

View file

@ -1,9 +1,11 @@
using System.Diagnostics;
using TanksServer.GameLogic; using TanksServer.GameLogic;
namespace TanksServer.Models; namespace TanksServer.Models;
[DebuggerDisplay("({X} | {Y})")]
internal readonly struct TilePosition(ushort x, ushort y) internal readonly struct TilePosition(ushort x, ushort y)
{ {
public ushort X { get; } = (ushort)((x + MapService.TilesPerRow) % MapService.TilesPerRow); public ushort X { get; } = (ushort)((x + MapService.TilesPerRow) % MapService.TilesPerRow);
public ushort Y { get; } = (ushort)((y + MapService.TilesPerColumn) % MapService.TilesPerColumn); public ushort Y { get; } = (ushort)((y + MapService.TilesPerColumn) % MapService.TilesPerColumn);
} }