using ProjectAirplaneWithRadar.Entities; namespace ProjectAirplaneWithRadar.Drawnings { public class DrawningAirplane { /// /// Класс-сущность /// public EntityAirplane? EntityAirplane { get; protected set; } /// /// Ширина окна /// private int? _pictureWidth; /// /// Высота окна /// private int? _pictureHeight; /// /// Левая координата прорисовки /// protected int? _startPosX; /// /// Верхняя кооридната прорисовки /// protected int? _startPosY; /// /// Ширина прорисовки самолета /// private readonly int PlaneWidth = 150; /// /// Высота прорисовки самолета /// private readonly int PlaneHeight = 85; /// /// Координата X объекта /// public int? GetPosX => _startPosX; /// /// Координата Y объекта /// public int? GetPosY => _startPosY; /// /// Ширина объекта /// public int GetWidth => PlaneWidth; /// /// Высота объекта /// public int GetHeight => PlaneHeight; /// /// Пустой конструктор /// private DrawningAirplane() { _pictureWidth = null; _pictureHeight = null; _startPosX = null; _startPosY = null; } /// /// Конструктор /// /// Скорость /// Вес /// Основной цвет public DrawningAirplane(int speed, double weight, Color bodyColor) : this() { EntityAirplane = new EntityAirplane(speed, weight, bodyColor); } /// /// Конструктор для метода создания объекта из строки (ExtentionDrawningAirplane) /// /// public DrawningAirplane(EntityAirplane? airplane) : this() { EntityAirplane = airplane; } /// /// Конструктор для наследников /// /// Ширина прорисовки самолета /// Высота прорисовки самолета protected DrawningAirplane(int planeWidth, int planeHeight) : this() { PlaneWidth = planeWidth; PlaneHeight = planeHeight; } /// /// Установка границ поля /// /// Ширина поля /// Высота поля /// true - границы заданы, false - проверка не пройдена, нельзя разместить объект в этих размерах public bool SetPictureSize(int width, int height) { if (PlaneWidth < width && PlaneHeight < height) { _pictureWidth = width; _pictureHeight = height; if (_startPosX != null && _startPosY != null) { if (_startPosX.Value < 0) { _startPosX = 0; } if (_startPosY.Value < 0) { _startPosY = 0; } if (_startPosX.Value + PlaneWidth > _pictureWidth) { _startPosX = _pictureWidth - PlaneWidth; } if (_startPosY.Value + PlaneHeight > _pictureHeight) { _startPosY = _pictureHeight - PlaneHeight; } } } return false; } /// /// Установка позиции /// /// Координата X /// Координата Y public void SetPosition(int x, int y) { if (!_pictureHeight.HasValue || !_pictureWidth.HasValue) { return; } _startPosX = x; _startPosY = y; if (_startPosX.Value < 0) { _startPosX = 0; } if (_startPosY.Value < 0) { _startPosY = 0; } if (_startPosX.Value + PlaneWidth > _pictureWidth) { _startPosX = _pictureWidth - PlaneWidth; } if (_startPosY.Value + PlaneHeight > _pictureHeight) { _startPosY = _pictureHeight - PlaneHeight; } } /// /// Изменение направления перемещения /// /// Направление /// true - перемещене выполнено, false - перемещение невозможно public bool MoveTransport(DirectionType direction) { if (EntityAirplane == null || !_startPosX.HasValue || !_startPosY.HasValue) { return false; } int step = (int)EntityAirplane.Step; switch (direction) { //влево case DirectionType.Left: if (_startPosX.Value - step > 0) { _startPosX -= step; } break; //вверх case DirectionType.Up: if (_startPosY.Value - step > 0) { _startPosY -= step; } break; // вправо case DirectionType.Right: if (_startPosX.Value + step < _pictureWidth - PlaneWidth) { _startPosX += step; } break; //вниз case DirectionType.Down: if (_startPosY.Value + step < _pictureHeight - PlaneHeight) { _startPosY += step; } break; default: return false; } return true; } /// /// Прорисовка объекта /// /// public virtual void DrawTransport(Graphics g) { if (EntityAirplane == null || !_startPosX.HasValue || !_startPosY.HasValue) { return; } Pen pen = new(Color.Black); //Корпус g.DrawRectangle(pen, _startPosX.Value + 10, _startPosY.Value + 40, 100, 30); //Хвост Point[] points = { new Point(_startPosX.Value + 10, _startPosY.Value), new Point(_startPosX.Value + 10, _startPosY.Value + 40), new Point(_startPosX.Value + 50, _startPosY.Value + 40) }; g.DrawPolygon(pen, points); //Кабина Point[] points2 = { new Point(_startPosX.Value + 110, _startPosY.Value + 35), new Point(_startPosX.Value + 110, _startPosY.Value + 55), new Point(_startPosX.Value + 150, _startPosY.Value + 55) }; g.DrawPolygon(pen, points2); Point[] points3 = { new Point(_startPosX.Value + 110, _startPosY.Value + 55), new Point(_startPosX.Value + 110, _startPosY.Value + 75), new Point(_startPosX.Value + 150, _startPosY.Value + 55) }; g.DrawPolygon(pen, points3); //Крыло Brush brBlack = new SolidBrush(EntityAirplane.BodyColor); g.DrawEllipse(pen, _startPosX.Value + 30, _startPosY.Value + 50, 70, 10); g.FillEllipse(brBlack, _startPosX.Value + 30, _startPosY.Value + 50, 70, 10); //Хвостовой элерон g.DrawEllipse(pen, _startPosX.Value, _startPosY.Value + 35, 30, 10); g.FillEllipse(brBlack, _startPosX.Value, _startPosY.Value + 35, 30, 10); } } }