Добавил класс прорисовки

This commit is contained in:
x1337-man 2025-02-10 14:21:35 +04:00
parent 7d24f56b1f
commit 7d8ee126e2

View File

@ -0,0 +1,201 @@
namespace ProjectGasolineTanker;
public class DrawingGasolineTanker
{
/// <summary>
/// Класс-сущность
/// </summary>
public EntityGasolineTanker? EntityGasolineTanker { get; private set; }
/// <summary>
/// Ширина окна
/// </summary>
private int? _pictureWidth;
/// <summary>
/// Высота окна
/// </summary>
private int? _pictureHeight;
/// <summary>
/// Левая координата прорисовки бензовоза
/// </summary>
private int? _posX;
/// <summary>
/// Верхняя кооридната прорисовки бензовоза
/// </summary>
private int? _posY;
/// <summary>
/// Ширина прорисовки бензовоза
/// </summary>
private readonly int _drawingWidth = 90;
/// <summary>
/// Высота прорисовки бензовоза
/// </summary>
private readonly int _drawingHeight = 63;
/// <summary>
/// Инициализация свойств
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес</param>
/// <param name="bodyColor">Основной цвет</param>
/// <param name="additionalColor">Дополнительный цвет</param>
/// <param name="tank">Бак</param>
/// <param name="signalBeacon">Сигнальный маяк</param>
public void Init(int speed, double weight, Color bodyColor, Color additionalColor, bool tank, bool signalBeacon)
{
EntityGasolineTanker = new EntityGasolineTanker();
EntityGasolineTanker.Init(speed, weight, bodyColor, additionalColor, tank, signalBeacon);
_pictureWidth = null;
_pictureHeight = null;
_posX = null;
_posY = null;
}
/// <summary>
/// Установка границ поля
/// </summary>
/// <param name="width">Ширина поля</param>
/// <param name="height">Высота поля</param>
/// <returns>true - границы заданы, false - проверка не пройдена, нельзя разместить объект в этих размерах</returns>
public bool SetPictureSize(int width, int height)
{
if (width > _drawingWidth && height > _drawingHeight)
{
_pictureWidth = width;
_pictureHeight = height;
if (_posX != null && _posY != null)
{
if (_posX.Value < 0) _posX = 0;
if (_posY.Value < 0) _posY = 0;
if (_posX.Value + _drawingWidth > _pictureWidth)
{
_posX = _pictureWidth - _drawingWidth;
}
if (_posY.Value + _drawingHeight > _pictureHeight)
{
_posY = _pictureHeight - _drawingHeight;
}
}
return true;
}
return false;
}
/// <summary>
/// Установка позиции
/// </summary>
/// <param name="x">Координата X</param>
/// <param name="y">Координата Y</param>
public void SetPosition(int x, int y)
{
if (!_pictureHeight.HasValue || !_pictureWidth.HasValue)
{
return;
}
_posX = x;
_posY = y;
if (_pictureHeight.Value < (_posY + _drawingHeight))
{
_posY = _pictureHeight - _drawingHeight;
}
if (_pictureWidth.Value < (_posX = _drawingWidth))
{
_posX = _pictureWidth - _drawingWidth;
}
}
/// <summary>
/// Изменение направления перемещения
/// </summary>
/// <param name="direction">Направление</param>
/// <returns>true - перемещене выполнено, false - перемещение невозможно</returns>
public bool MoveTransport(DirectionType direction)
{
if (EntityGasolineTanker == null || !_posX.HasValue || !_posY.HasValue)
{
return false;
}
switch (direction)
{
case DirectionType.Left:
if (_posX.Value - EntityGasolineTanker.Step > 0)
{
_posX -= EntityGasolineTanker.Step;
}
return true;
case DirectionType.Up:
if (_posY.Value - EntityGasolineTanker.Step > 0)
{
_posY -= EntityGasolineTanker.Step;
}
return true;
case DirectionType.Right:
if (_posX.Value + _drawingWidth + EntityGasolineTanker.Step < _pictureWidth)
{
_posX += EntityGasolineTanker.Step;
}
return true;
case DirectionType.Down:
if (_posY + EntityGasolineTanker.Step + _drawingHeight < _pictureHeight)
{
_posY += EntityGasolineTanker.Step;
}
return true;
default:
return false;
}
}
/// <summary>
/// Прорисовка объекта
/// </summary>
/// <param name="g"></param>
public void DrawTransport(Graphics g)
{
if (EntityGasolineTanker == null || !_posX.HasValue || !_posY.HasValue)
{
return;
}
Pen pen = new(Color.Black);
Brush additionalBrush = new SolidBrush(EntityGasolineTanker.AdditionalColor);
// Кузов
Brush br = new SolidBrush(EntityGasolineTanker.BodyColor);
g.FillRectangle(br, _posX.Value + 0, _posY.Value + 35, 90, 7);
g.FillRectangle(br, _posX.Value + 67, _posY.Value + 5, 22, 28);
// Колеса
Brush brBlack = new SolidBrush(Color.Black);
g.FillEllipse(brBlack, _posX.Value + 0, _posY.Value + 40, 23, 23);
g.FillEllipse(brBlack, _posX.Value + 23, _posY.Value + 40, 23, 23);
g.FillEllipse(brBlack, _posX.Value + 67, _posY.Value + 40, 23, 23);
// Бак
if (EntityGasolineTanker.Tank)
{
g.DrawEllipse(pen, _posX.Value + 0, _posY.Value + 5, 64, 30);
g.FillEllipse(additionalBrush, _posX.Value + 0, _posY.Value + 5, 64, 30);
}
// Сигнальный маяк
if (EntityGasolineTanker.SignalBeacon)
{
g.FillRectangle(additionalBrush, _posX.Value + 79, _posY.Value + 0, 5, 5);
g.DrawEllipse(pen, _posX.Value + 79, _posY.Value + 0, 5, 10);
g.FillEllipse(additionalBrush, _posX.Value + 79, _posY.Value + 0, 5, 10);
}
}
}