2025-02-18 18:18:19 +04:00

259 lines
9.3 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.

namespace ProjectAirbus;
/// <summary>
/// Класс, отвечающий за прорисовку и перемещение объекта-сущности
/// </summary>
public class DrawningAirbus
{
/// <summary>
/// Класс-сущность
/// </summary>
public EntityAirbus? EntityAirbus { get; private set; }
/// <summary>
/// Ширина окна
/// </summary>
private int? _pictureWidth;
/// <summary>
/// Высота окна
/// </summary>
private int? _pictureHeight;
/// <summary>
/// Левая координата прорисовки аэробуса
/// </summary>
private int? _startPosX;
/// <summary>
/// Верхняя кооридната прорисовки аэробуса
/// </summary>
private int? _startPosY;
/// <summary>
/// Ширина прорисовки аэробуса
/// </summary>
private readonly int _drawningAirbusWidth = 155;
/// <summary>
/// Высота прорисовки аэробуса
/// </summary>
private readonly int _drawningAirbusHeight = 70;
/// <summary>
/// Инициализация свойств
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес</param>
/// <param name="bodyColor">Основной цвет</param>
/// <param name="additionalColor">Дополнительный цвет</param>
/// <param name="passengerSection">Признак наличия пассажирского отсека</param>
/// <param name="engines">Признак наличия двигателя</param>
public void Init(int speed, double weight, Color bodyColor, Color additionalColor, bool passengerSection, bool engines)
{
EntityAirbus = new EntityAirbus();
EntityAirbus.Init(speed, weight, bodyColor, additionalColor, passengerSection, engines);
_pictureWidth = null;
_pictureHeight = null;
_startPosX = null;
_startPosY = null;
}
/// <summary>
/// Установка границ поля
/// </summary>
/// <param name="width">Ширина поля</param>
/// <param name="height">Высота поля</param>
/// <returns>true - границы заданы, false - проверка не пройдена, нельзя разместить объект в этих размерах</returns>
public bool SetPictureSize(int width, int height)
{
if (_drawningAirbusWidth <= width && _drawningAirbusHeight <= height)
{
_pictureHeight = height;
_pictureWidth = width;
if (_startPosX.HasValue && _startPosY.HasValue)
{
if (_startPosX.Value + _drawningAirbusWidth > _pictureWidth)
{
_startPosX = _pictureWidth - _drawningAirbusWidth;
}
if (_startPosY.Value + _drawningAirbusHeight > _pictureHeight)
{
_startPosY = _pictureHeight - _drawningAirbusHeight;
}
}
return true;
}
else
{
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;
}
if (x + _drawningAirbusWidth > _pictureWidth)
{
_startPosX = _pictureWidth - _drawningAirbusWidth;
}
else if (x < 0)
{
_startPosX = 0;
}
else
{
_startPosX = x;
}
if (y + _drawningAirbusHeight > _pictureHeight)
{
_startPosY = _pictureHeight - _drawningAirbusHeight;
}
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 (EntityAirbus == null || !_startPosX.HasValue || !_startPosY.HasValue)
{
return false;
}
switch (direction)
{
//влево
case DirectionType.Left:
if (_startPosX.Value - EntityAirbus.Step > 0)
{
_startPosX -= (int)EntityAirbus.Step;
}
return true;
//вверх
case DirectionType.Up:
if (_startPosY.Value - EntityAirbus.Step > 0)
{
_startPosY -= (int)EntityAirbus.Step;
}
return true;
// вправо
case DirectionType.Right:
if (_startPosX.Value + EntityAirbus.Step + _drawningAirbusWidth < _pictureWidth)
{
_startPosX += (int)EntityAirbus.Step;
}
return true;
//вниз
case DirectionType.Down:
if (_startPosY.Value + EntityAirbus.Step + _drawningAirbusHeight < _pictureHeight)
{
_startPosY += (int)EntityAirbus.Step;
}
return true;
default:
return false;
}
}
/// <summary>
/// Прорисовка объекта
/// </summary>
/// <param name="g"></param>
public void DrawTransport(Graphics g)
{
if (EntityAirbus == null || !_startPosX.HasValue || !_startPosY.HasValue)
{
return;
}
Pen pen = new(Color.Black, 3);
Brush additionalBrush = new SolidBrush(EntityAirbus.AdditionalColor);
Point[] pointsSection =
{
new Point(_startPosX.Value + 45, _startPosY.Value + 30),
new Point(_startPosX.Value + 65, _startPosY.Value + 20),
new Point(_startPosX.Value + 95, _startPosY.Value + 20),
new Point(_startPosX.Value + 115, _startPosY.Value + 30)
};
// доп. отсек для пассажиров
if (EntityAirbus.PassengerSection)
{
g.FillPolygon(additionalBrush, pointsSection);
g.DrawPolygon(pen, pointsSection);
}
//границы аэробуса
Point[] pointsWing =
{
new Point(_startPosX.Value + 1, _startPosY.Value + 1),
new Point(_startPosX.Value + 1, _startPosY.Value + 44),
new Point(_startPosX.Value + 45, _startPosY.Value + 44),
new Point(_startPosX.Value + 45, _startPosY.Value + 33),
new Point(_startPosX.Value + 25, _startPosY.Value + 33)
};
Point[] pointsWindow =
{
new Point(_startPosX.Value + 115, _startPosY.Value + 33),
new Point(_startPosX.Value + 115, _startPosY.Value + 40),
new Point(_startPosX.Value + 155, _startPosY.Value + 40)
};
g.DrawLine(pen, _startPosX.Value, _startPosY.Value, _startPosX.Value, _startPosY.Value + 47);
g.DrawLine(pen, _startPosX.Value, _startPosY.Value + 30, _startPosX.Value + 90, _startPosY.Value + 30);
g.DrawLine(pen, _startPosX.Value + 25, _startPosY.Value + 30, _startPosX.Value, _startPosY.Value);
g.DrawArc(pen, _startPosX.Value, _startPosY.Value + 30, 150, 30, -45, 225);
//закраска
Brush br = new SolidBrush(EntityAirbus.BodyColor);
g.FillEllipse(br, _startPosX.Value + 1, _startPosY.Value + 31, 149, 29);
g.FillPolygon(br, pointsWing);
g.DrawLine(new Pen(Color.Black, 5), _startPosX.Value + 45, _startPosY.Value + 45, _startPosX.Value + 100, _startPosY.Value + 45);
//шасси
g.DrawLine(pen, _startPosX.Value + 35, _startPosY.Value + 60, _startPosX.Value + 35, _startPosY.Value + 70);
g.DrawLine(pen, _startPosX.Value + 110, _startPosY.Value + 60, _startPosX.Value + 110, _startPosY.Value + 70);
g.DrawRectangle(pen, _startPosX.Value + 26, _startPosY.Value + 68, 8, 8);
g.DrawRectangle(pen, _startPosX.Value + 36, _startPosY.Value + 68, 8, 8);
g.DrawRectangle(pen, _startPosX.Value + 101, _startPosY.Value + 68, 8, 8);
g.DrawRectangle(pen, _startPosX.Value + 111, _startPosY.Value + 68, 8, 8);
//Окно
Brush brBlue = new SolidBrush(Color.LightBlue);
g.FillPolygon(brBlue, pointsWindow);
g.DrawLine(pen, _startPosX.Value + 115, _startPosY.Value + 33, _startPosX.Value + 115, _startPosY.Value + 40);
g.DrawLine(pen, _startPosX.Value + 115, _startPosY.Value + 40, _startPosX.Value + 150, _startPosY.Value + 40);
g.DrawLine(pen, _startPosX.Value + 150, _startPosY.Value + 40, _startPosX.Value + 115, _startPosY.Value + 33);
//доп. двигатель
if (EntityAirbus.Engines)
{
g.FillEllipse(additionalBrush, _startPosX.Value, _startPosY.Value + 30, 35, 15);
g.DrawEllipse(pen, _startPosX.Value, _startPosY.Value + 30, 35, 15);
}
}
}