bullet hits tank, tank dies
This commit is contained in:
		
							parent
							
								
									190c0c3143
								
							
						
					
					
						commit
						dd33ec59ad
					
				
					 6 changed files with 45 additions and 9 deletions
				
			
		|  | @ -34,7 +34,7 @@ internal sealed class TankDrawer : IDrawStep | ||||||
|         foreach (var tank in _tanks) |         foreach (var tank in _tanks) | ||||||
|         { |         { | ||||||
|             var pos = tank.Position.ToPixelPosition(); |             var pos = tank.Position.ToPixelPosition(); | ||||||
|             var rotationVariant = (int)Math.Floor(tank.Rotation); |             var rotationVariant = (int)Math.Round(tank.Rotation) % 16; | ||||||
|             for (var dy = 0; dy < MapService.TileSize; dy++) |             for (var dy = 0; dy < MapService.TileSize; dy++) | ||||||
|             { |             { | ||||||
|                 var rowStartIndex = (pos.Y + dy) * MapService.PixelsPerRow; |                 var rowStartIndex = (pos.Y + dy) * MapService.PixelsPerRow; | ||||||
|  |  | ||||||
|  | @ -2,7 +2,7 @@ namespace TanksServer.Models; | ||||||
| 
 | 
 | ||||||
| internal sealed class Bullet(Player tankOwner, FloatPosition position, double rotation) | internal sealed class Bullet(Player tankOwner, FloatPosition position, double rotation) | ||||||
| { | { | ||||||
|     public Player TankOwner { get; } = tankOwner; |     public Player Owner { get; } = tankOwner; | ||||||
|      |      | ||||||
|     public FloatPosition Position { get; set; } = position; |     public FloatPosition Position { get; set; } = position; | ||||||
|      |      | ||||||
|  |  | ||||||
|  | @ -7,6 +7,10 @@ internal sealed class Player(string name) | ||||||
|     public Guid Id { get; } = Guid.NewGuid(); |     public Guid Id { get; } = Guid.NewGuid(); | ||||||
| 
 | 
 | ||||||
|     public PlayerControls Controls { get; } = new(); |     public PlayerControls Controls { get; } = new(); | ||||||
|  | 
 | ||||||
|  |     public int Kills { get; set; } | ||||||
|  |      | ||||||
|  |     public int Deaths { get; set; } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| internal sealed class PlayerControls | internal sealed class PlayerControls | ||||||
|  |  | ||||||
|  | @ -1,3 +1,5 @@ | ||||||
|  | using TanksServer.Services; | ||||||
|  | 
 | ||||||
| namespace TanksServer.Models; | namespace TanksServer.Models; | ||||||
| 
 | 
 | ||||||
| internal sealed class Tank(Player player, FloatPosition spawnPosition) | internal sealed class Tank(Player player, FloatPosition spawnPosition) | ||||||
|  | @ -16,8 +18,17 @@ internal sealed class Tank(Player player, FloatPosition spawnPosition) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public FloatPosition Position { get; set; } = spawnPosition; |     public FloatPosition Position { get; set; } = spawnPosition; | ||||||
|      | 
 | ||||||
|     public DateTime NextShotAfter { get; set; } |     public DateTime NextShotAfter { get; set; } | ||||||
|      | 
 | ||||||
|     public bool Moved { get; set; } |     public bool Moved { get; set; } | ||||||
|  | 
 | ||||||
|  |     public (FloatPosition TopLeft, FloatPosition BottomRight) GetBounds() | ||||||
|  |     { | ||||||
|  |         const int halfTile = MapService.TileSize / 2; | ||||||
|  |         return ( | ||||||
|  |             new FloatPosition(Position.X - halfTile, Position.Y - halfTile), | ||||||
|  |             new FloatPosition(Position.X + halfTile, Position.Y + halfTile) | ||||||
|  |         ); | ||||||
|  |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -6,14 +6,20 @@ namespace TanksServer.Services; | ||||||
| 
 | 
 | ||||||
| internal sealed class TankManager(ILogger<TankManager> logger) : IEnumerable<Tank> | internal sealed class TankManager(ILogger<TankManager> logger) : IEnumerable<Tank> | ||||||
| { | { | ||||||
|     private readonly ConcurrentBag<Tank> _tanks = new(); |     private readonly ConcurrentDictionary<Tank, byte> _tanks = new(); | ||||||
| 
 | 
 | ||||||
|     public void Add(Tank tank) |     public void Add(Tank tank) | ||||||
|     { |     { | ||||||
|         logger.LogInformation("Tank added for player {}", tank.Owner.Id); |         logger.LogInformation("Tank added for player {}", tank.Owner.Id); | ||||||
|         _tanks.Add(tank); |         _tanks.TryAdd(tank, 0); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); |     IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); | ||||||
|     public IEnumerator<Tank> GetEnumerator() => _tanks.GetEnumerator(); |     public IEnumerator<Tank> GetEnumerator() => _tanks.Keys.GetEnumerator(); | ||||||
|  | 
 | ||||||
|  |     public void Remove(Tank tank) | ||||||
|  |     { | ||||||
|  |         logger.LogInformation("Tank removed for player {}", tank.Owner.Id); | ||||||
|  |         _tanks.Remove(tank, out _); | ||||||
|  |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -3,7 +3,7 @@ using TanksServer.Services; | ||||||
| 
 | 
 | ||||||
| namespace TanksServer.TickSteps; | namespace TanksServer.TickSteps; | ||||||
| 
 | 
 | ||||||
| internal sealed class CollideBulletsWithTanks(BulletManager bullets) : ITickStep | internal sealed class CollideBulletsWithTanks(BulletManager bullets, TankManager tanks) : ITickStep | ||||||
| { | { | ||||||
|     public Task TickAsync() |     public Task TickAsync() | ||||||
|     { |     { | ||||||
|  | @ -13,6 +13,21 @@ internal sealed class CollideBulletsWithTanks(BulletManager bullets) : ITickStep | ||||||
| 
 | 
 | ||||||
|     private bool BulletHitsTank(Bullet bullet) |     private bool BulletHitsTank(Bullet bullet) | ||||||
|     { |     { | ||||||
|         return false; // TODO |         foreach (var tank in tanks) | ||||||
|  |         { | ||||||
|  |             var (topLeft, bottomRight) = tank.GetBounds(); | ||||||
|  |             if (bullet.Position.X <= topLeft.X || bullet.Position.X >= bottomRight.X || | ||||||
|  |                 bullet.Position.Y <= topLeft.Y || bullet.Position.Y >= bottomRight.Y) | ||||||
|  |                 continue; | ||||||
|  | 
 | ||||||
|  |             if (bullet.Owner != tank.Owner) | ||||||
|  |                 bullet.Owner.Kills++; | ||||||
|  |             tank.Owner.Deaths++; | ||||||
|  |              | ||||||
|  |             tanks.Remove(tank); | ||||||
|  |             return true; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         return false; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Vinzenz Schroeter
						Vinzenz Schroeter