Multiple players visible in cell

This commit is contained in:
Michele 2021-02-04 23:18:08 +00:00
parent 5434766207
commit 4619844607
2 changed files with 182 additions and 15 deletions

View file

@ -1304,22 +1304,130 @@ namespace Sledgemapper
private void DrawPlayers()
{
for (int i = 0; i < _sessionData.Players.Count; i++)
var ffont = _fonts.FirstOrDefault(m => int.Parse(m.Key.Replace("font", "")) > _state.TileSize).Value ?? _fonts.Last().Value;
var fscale = _state.TileSize / ((float)ffont.LineSpacing * 3f);
var playerCells = _sessionData.Players.Select(m => m.Position).Distinct().ToList();
foreach (var cell in playerCells)
{
Player player = _sessionData.Players[i];
var color = player.Color.ToColor();
_spriteBatch.DrawRectangle(new Rectangle(player.Position.X * _state.TileSize - 4, player.Position.Y * _state.TileSize - 4, _state.TileSize + 7, _state.TileSize + 7), color, 2);
var ffont = _fonts.FirstOrDefault(m => int.Parse(m.Key.Replace("font", "")) > _state.TileSize).Value ?? _fonts.Last().Value;
var fscale = _state.TileSize / ((float)ffont.LineSpacing * 2);
_spriteBatch.DrawString(ffont,
player.Initials,
new Vector2(player.Position.X * _state.TileSize + 2, player.Position.Y * _state.TileSize + _state.TileSize - 2 - ffont.LineSpacing * fscale),
color,
0,
Vector2.Zero,
fscale,
SpriteEffects.None,
0);
var playersInCell = _sessionData.Players.Where(m => m.Position == cell).ToList();
var i = 0;
foreach (var player in playersInCell)
{
var color = player.Color.ToColor();
var rectangle = new Rectangle();
var stringPosition = new Vector2();
var measure = ffont.MeasureString(player.Initials);
var maxSize = Math.Max(measure.X, measure.Y);
if (playersInCell.Count == 1)
{
fscale = (_state.TileSize - 2) / maxSize;
rectangle = new Rectangle(
player.Position.X * _state.TileSize,
player.Position.Y * _state.TileSize,
_state.TileSize - 1,
_state.TileSize - 1);
stringPosition = new Vector2(
player.Position.X * _state.TileSize,
player.Position.Y * _state.TileSize + _state.TileSize - measure.Y * fscale);
}
else if (playersInCell.Count == 2)
{
fscale = (_state.TileSize / 2 - 2) / maxSize;
if (i == 0)
{
rectangle = new Rectangle(
player.Position.X * _state.TileSize,
player.Position.Y * _state.TileSize,
_state.TileSize / 2 - 1,
_state.TileSize - 1);
stringPosition = new Vector2(
player.Position.X * _state.TileSize,
player.Position.Y * _state.TileSize + _state.TileSize - measure.Y * fscale);
}
else
{
rectangle = new Rectangle(
player.Position.X * _state.TileSize + _state.TileSize / 2,
player.Position.Y * _state.TileSize,
_state.TileSize / 2 - 1,
_state.TileSize - 1);
stringPosition = new Vector2(
player.Position.X * _state.TileSize + _state.TileSize / 2,
player.Position.Y * _state.TileSize + _state.TileSize - measure.Y * fscale);
}
i++;
}
else if (playersInCell.Count >= 3)
{
fscale = (_state.TileSize / 2 - 2) / maxSize;
switch (i)
{
case 0:
rectangle = new Rectangle(
player.Position.X * _state.TileSize,
player.Position.Y * _state.TileSize,
_state.TileSize / 2 - 1,
_state.TileSize / 2 - 1);
stringPosition = new Vector2(
player.Position.X * _state.TileSize,
player.Position.Y * _state.TileSize + _state.TileSize / 2 - measure.Y * fscale);
break;
case 1:
rectangle = new Rectangle(
player.Position.X * _state.TileSize + _state.TileSize / 2,
player.Position.Y * _state.TileSize,
_state.TileSize / 2 - 1,
_state.TileSize / 2 - 1);
stringPosition = new Vector2(
player.Position.X * _state.TileSize + _state.TileSize / 2,
player.Position.Y * _state.TileSize + _state.TileSize / 2 - measure.Y * fscale);
break;
case 2:
rectangle = new Rectangle(
player.Position.X * _state.TileSize,
player.Position.Y * _state.TileSize + _state.TileSize / 2,
_state.TileSize / 2 - 1,
_state.TileSize / 2 - 1);
stringPosition = new Vector2(
player.Position.X * _state.TileSize,
player.Position.Y * _state.TileSize + _state.TileSize - measure.Y * fscale);
break;
case 3:
default:
rectangle = new Rectangle(
player.Position.X * _state.TileSize + _state.TileSize / 2,
player.Position.Y * _state.TileSize + _state.TileSize / 2,
_state.TileSize / 2 - 1,
_state.TileSize / 2 - 1);
stringPosition = new Vector2(
player.Position.X * _state.TileSize + _state.TileSize / 2,
player.Position.Y * _state.TileSize + _state.TileSize - measure.Y * fscale);
break;
}
i++;
}
_spriteBatch.DrawRectangle(rectangle, color, 2);
_spriteBatch.DrawString(ffont,
player.Initials,
stringPosition,
color,
0,
Vector2.Zero,
fscale,
SpriteEffects.None,
0);
}
}
foreach (var player in _sessionData.Players)