using lab1.Entities; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace lab1.Drawnings; /// /// Класс, отвечающий за прорисовку и перемещение объекта-сущности /// public class DrawningTrackedVehicle { /// /// Класс-сущность /// public EntityTrackedVehicle? EntityTrackedVehicle { get; protected set; } /// /// Ширина окна /// private int? _pictureWidth; /// /// Высота окна /// private int? _pictureHeight; /// /// Левая координата прорисовки истребителя /// protected int? _startPosX; /// /// Верхняя координата прорисовки истребителя /// protected int? _startPosY; /// /// Ширина прорисовки истребителя /// private readonly int _drawningFighterWidth = 63; /// /// Высота прорисовки истребителя /// private readonly int _drawningFighterHeight = 69; /// /// Координата Х объекта /// /// public int? GetPosX => _startPosX; /// /// Координата У объекта /// /// public int? GetPosY => _startPosY; /// /// Ширина объекта /// /// public int GetWidth => _drawningFighterWidth; /// /// Высота объекта /// /// public int GetHeight => _drawningFighterHeight; /// /// Пустой конструктор /// private DrawningTrackedVehicle() { _pictureWidth = null; _pictureHeight = null; _startPosX = null; _startPosY = null; } /// /// Конструктор /// /// Скорость /// >Вес истребителя /// Основной цвет public DrawningTrackedVehicle(int speed, double weight, Color bodyColor) : this() { EntityTrackedVehicle = new EntityTrackedVehicle(speed, weight, bodyColor); } /// /// Конструктор для наследников /// /// Ширина прорисовки истребителя /// >Высота прорисовки истребителя protected DrawningTrackedVehicle(int drawningFighterWidth, int drawningFighterHeight) : this() { _drawningFighterWidth = drawningFighterWidth; _drawningFighterHeight = drawningFighterHeight; } /// /// Установка границ поля /// /// Ширина поля /// Высота поля /// true - границы заданы, false - проверка не пройдена, нельзя разместить объект в этих размерах public bool SetPictureSize(int width, int height) { if (width >= _drawningFighterWidth && height >= _drawningFighterHeight) { _pictureWidth = width; _pictureHeight = height; if (_startPosX.HasValue && _startPosY.HasValue) { SetPosition(_startPosX.Value, _startPosY.Value); } return true; } return false; } /// /// Установка позиции /// /// Координата X /// Координата Y public void SetPosition(int x, int y) { if (!_pictureHeight.HasValue || !_pictureWidth.HasValue) { return; } if (x < 0) { x = 0; } else if (x > _pictureWidth.Value - _drawningFighterWidth) { x = _pictureWidth.Value - _drawningFighterWidth; } if (y < 0) { y = 0; } else if (y > _pictureHeight.Value - _drawningFighterHeight) { y = _pictureHeight.Value - _drawningFighterHeight; } _startPosX = x; _startPosY = y; } /// /// Изменение направления перемещения /// /// Направление /// true - перемещене выполнено, false - перемещение невозможно public bool MoveTransport(DirectionType direction) { if (EntityTrackedVehicle == null || !_startPosX.HasValue || !_startPosY.HasValue) { return false; } switch (direction) { //влево case DirectionType.Left: if (_startPosX.Value - EntityTrackedVehicle.Step > 0) { _startPosX -= (int)EntityTrackedVehicle.Step; } return true; //Вверх case DirectionType.Up: if (_startPosY.Value - EntityTrackedVehicle.Step > 0) { _startPosY -= (int)EntityTrackedVehicle.Step; } return true; //Вправо case DirectionType.Right: if (_startPosX.Value + EntityTrackedVehicle.Step + _drawningFighterWidth < _pictureWidth) { _startPosX += (int)EntityTrackedVehicle.Step; } return true; //Вниз case DirectionType.Down: if (_startPosY.Value + EntityTrackedVehicle.Step + _drawningFighterHeight < _pictureHeight) { _startPosY += (int)EntityTrackedVehicle.Step; } return true; default: return false; } } /// /// Прорисовка объекта /// /// public virtual void DrawTransport(Graphics g) { if (EntityTrackedVehicle == null || !_startPosX.HasValue || !_startPosY.HasValue) { return; } Pen pen = new(Color.Black); Brush BodyBrush = new SolidBrush(EntityTrackedVehicle.BodyColor); //корпус g.FillRectangle(BodyBrush, _startPosX.Value, _startPosY.Value + 5, 62, 12); g.DrawRectangle(pen, _startPosX.Value, _startPosY.Value + 5, 62, 12); g.FillRectangle(BodyBrush, _startPosX.Value + 12, _startPosY.Value - 9, 4, 15); g.DrawRectangle(pen, _startPosX.Value +12, _startPosY.Value - 9, 4, 14); g.FillRectangle(BodyBrush, _startPosX.Value + 27, _startPosY.Value - 24, 5, 30); g.DrawRectangle(pen, _startPosX.Value + 27, _startPosY.Value - 24, 5, 30); //стекло g.FillRectangle(BodyBrush, _startPosX.Value + 42, _startPosY.Value - 11, 21, 16); g.DrawRectangle(pen, _startPosX.Value + 42, _startPosY.Value -11, 20, 16); //гусеницы g.DrawLine(pen, _startPosX.Value - 2, _startPosY.Value + 17, _startPosX.Value, _startPosY.Value + 17); g.DrawLine(pen, _startPosX.Value - 3, _startPosY.Value + 18, _startPosX.Value - 3, _startPosY.Value + 28); g.DrawLine(pen, _startPosX.Value - 2, _startPosY.Value + 29, _startPosX.Value + 2, _startPosY.Value + 29); g.DrawLine(pen, _startPosX.Value + 3, _startPosY.Value + 30, _startPosX.Value + 59, _startPosY.Value + 30); g.DrawLine(pen, _startPosX.Value + 60, _startPosY.Value + 29, _startPosX.Value + 63, _startPosY.Value + 29); g.DrawLine(pen, _startPosX.Value + 64, _startPosY.Value + 28, _startPosX.Value + 64, _startPosY.Value + 18); g.DrawLine(pen, _startPosX.Value + 61, _startPosY.Value + 17, _startPosX.Value + 63, _startPosY.Value + 17); //колеса g.FillEllipse(BodyBrush, _startPosX.Value, _startPosY.Value + 19, 9, 9); g.DrawEllipse(pen, _startPosX.Value, _startPosY.Value + 19, 9, 9); g.FillEllipse(BodyBrush, _startPosX.Value + 53, _startPosY.Value + 19, 9, 9); g.DrawEllipse(pen, _startPosX.Value + 53, _startPosY.Value + 19, 9, 9); g.FillEllipse(BodyBrush, _startPosX.Value + 15, _startPosY.Value + 23, 6, 6); g.DrawEllipse(pen, _startPosX.Value + 15, _startPosY.Value + 23, 6, 6); g.FillEllipse(BodyBrush, _startPosX.Value + 28, _startPosY.Value + 23, 6, 6); g.DrawEllipse(pen, _startPosX.Value + 28, _startPosY.Value + 23, 6, 6); g.FillEllipse(BodyBrush, _startPosX.Value + 40, _startPosY.Value + 23, 6, 6); g.DrawEllipse(pen, _startPosX.Value + 40, _startPosY.Value + 23, 6, 6); g.FillEllipse(BodyBrush, _startPosX.Value + 23, _startPosY.Value + 19, 4, 4); g.DrawEllipse(pen, _startPosX.Value + 23, _startPosY.Value + 19, 4, 4); g.FillEllipse(BodyBrush, _startPosX.Value + 35, _startPosY.Value + 19, 4, 4); g.DrawEllipse(pen, _startPosX.Value + 35, _startPosY.Value + 19, 4, 4); } }