230 lines
7.6 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using ProjectCleaningCar.Entities;
namespace ProjectCleaningCar.Drawning;
/// <summary>
/// Класс, отвечающий за прорисовку базового объекта-сущности
/// </summary>
public class DrawningCar
{
/// <summary>
/// Класс-сущность
/// </summary>
public EntityCar? EntityCar { get; protected set; }
/// <summary>
/// Ширина окна
/// </summary>
private int? _pictureWidth;
/// <summary>
/// Высота окна
/// </summary>
private int? _pictureHeight;
/// <summary>
/// Левая координата прорисовки машины
/// </summary>
protected int? _startPosX;
/// <summary>
/// Верхняя кооридната прорисовки машины
/// </summary>
protected int? _startPosY;
/// <summary>
/// Ширина прорисовки машины
/// </summary>
private readonly int _drawningCarWidth = 130;
/// <summary>
/// Высота прорисовки машины
/// </summary>
private readonly int _drawningCarHeight = 65;
/// <summary>
/// Координата X объекта
/// </summary>
public int? GetPosX => _startPosX;
/// <summary>
/// Координата Y объекта
/// </summary>
public int? GetPosY => _startPosY;
/// <summary>
/// Ширина объекта
/// </summary>
public int GetWidth => _drawningCarWidth;
/// <summary>
/// Высота объекта
/// </summary>
public int GetHeight => _drawningCarHeight;
/// <summary>
/// Пустой конструктор
/// </summary>
private DrawningCar()
{
_pictureWidth = null;
_pictureHeight = null;
_startPosX = null;
_startPosY = null;
}
/// <summary>
/// Конструктор
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес</param>
/// <param name="bodyColor">Основной цвет</param>
public DrawningCar(int speed, double weight, Color bodyColor) : this()
{
EntityCar = new EntityCar(speed, weight, bodyColor);
}
/// <summary>
/// Конструктор для наследников
/// </summary>
/// <param name="drawningCarWidth">Ширина прорисовки машины</param>
/// <param name="drawningCarHeight">Высота прорисовки машины</param>
protected DrawningCar(int drawningCarWidth, int drawningCarHeight) : this()
{
_drawningCarWidth = drawningCarWidth;
_drawningCarHeight = drawningCarHeight;
}
/// <summary>
/// Установка границ поля
/// </summary>
/// <param name="width">Ширина поля</param>
/// <param name="height">Высота поля</param>
/// <returns>true - границы заданы, false - проверка не пройдена, нельзя
/// разместить объект в этих размерах</returns>
public bool SetPictureSize(int width, int height)
{
if (width < _drawningCarWidth || height < _drawningCarHeight) { return false; };
_pictureWidth = width;
_pictureHeight = height;
if (_startPosX != null || _startPosY != null)
{
if (_startPosX + _drawningCarWidth > _pictureWidth)
{
_startPosX = -_drawningCarWidth + _pictureWidth;
}
else if (_startPosX < 0)
{
_startPosX = 0;
}
if (_startPosY + _drawningCarHeight > _pictureHeight)
{
_startPosY = -_drawningCarHeight + _pictureHeight;
}
else if (_startPosY < 0)
{
_startPosY = 0;
}
}
return true;
}
/// <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;
}
if (x + _drawningCarWidth > _pictureWidth)
{
_startPosX = _pictureWidth - _drawningCarWidth;
}
else if (x < 0)
{
_startPosX = 0;
}
else
{
_startPosX = x;
}
if (y + _drawningCarHeight > _pictureHeight)
{
_startPosY = _pictureHeight - _drawningCarHeight;
}
else if (y < 0)
{
_startPosY = 0;
}
else
{
_startPosY = y;
}
}
/// <summary>
/// Изменение направления перемещения
/// </summary>
/// <param name="direction">Направление</param>
/// <returns>true - перемещение выполнено, false - перемещение невозможно</returns>
public bool MoveTransport(DirectionType direction)
{
if (EntityCar == null || !_startPosX.HasValue || !_startPosY.HasValue)
{
return false;
}
switch (direction)
{
//влево
case DirectionType.Left:
if (_startPosX.Value - EntityCar.Step > 0)
{
_startPosX -= (int)EntityCar.Step;
}
return true;
//вправо
case DirectionType.Right:
if (_startPosX.Value + _drawningCarWidth + EntityCar.Step < _pictureWidth)
{
_startPosX += (int)EntityCar.Step;
}
return true;
//вверх
case DirectionType.Up:
if (_startPosY.Value - EntityCar.Step > 0)
{
_startPosY -= (int)EntityCar.Step;
}
return true;
//вниз
case DirectionType.Down:
if (_startPosY.Value + _drawningCarHeight + EntityCar.Step < _pictureHeight)
{
_startPosY += (int)EntityCar.Step;
}
return true;
default:
return false;
}
}
/// <summary>
/// Отрисовка объекта
/// </summary>
/// <param name="g"></param>
public virtual void DrawTransport(Graphics g)
{
if (EntityCar == null || !_startPosX.HasValue || !_startPosY.HasValue)
{
return;
}
Pen pen = new(Color.Black);
Brush bodyBrush = new SolidBrush(EntityCar.BodyColor);
//основание
g.FillRectangle(bodyBrush, _startPosX.Value, _startPosY.Value + 35, 120, 10);
g.DrawRectangle(pen, _startPosX.Value, _startPosY.Value + 35, 120, 10);
//
g.FillRectangle(bodyBrush, _startPosX.Value + 100, _startPosY.Value + 5, 20, 30);
g.DrawRectangle(pen, _startPosX.Value + 100, _startPosY.Value + 5, 20, 30);
//колёса
g.FillEllipse(bodyBrush, _startPosX.Value + 10, _startPosY.Value + 45, 20, 20);
g.DrawEllipse(pen, _startPosX.Value + 10, _startPosY.Value + 45, 20, 20);
g.FillEllipse(bodyBrush, _startPosX.Value + 35, _startPosY.Value + 45, 20, 20);
g.DrawEllipse(pen, _startPosX.Value + 35, _startPosY.Value + 45, 20, 20);
g.FillEllipse(bodyBrush, _startPosX.Value + 97, _startPosY.Value + 45, 20, 20);
g.DrawEllipse(pen, _startPosX.Value + 97, _startPosY.Value + 45, 20, 20);
}
}