using ProjectElectroTrans.Entities; namespace ProjectElectroTrans.Drawnings; public class DrawingTrans { /// /// Класс-сущность /// public EntityTrans? EntityTrans { get; protected set; } /// /// Ширина окна /// private int? _pictureWidth; /// /// Высота окна /// private int? _pictureHeight; /// /// Левая координата прорисовки автомобиля /// protected int? _startPosX; /// /// Верхняя кооридната прорисовки автомобиля /// protected int? _startPosY; /// /// Ширина прорисовки автомобиля /// private readonly int _drawningTransWidth = 80; /// /// Высота прорисовки автомобиля /// private readonly int _drawningTransHeight = 60; /// /// Координата X объекта /// public int? GetPosX => _startPosX; /// /// Координата Y объекта /// public int? GetPosY => _startPosY; /// /// Ширина объекта /// public int GetWidth => _drawningTransWidth; /// /// Высота объекта /// public int GetHeight => _drawningTransHeight; /// /// Пустой конструктор /// private DrawingTrans() { _pictureWidth = null; _pictureHeight = null; _startPosX = null; _startPosY = null; } /// /// Конструктор /// /// Скорость /// Вес /// Основной цвет public DrawingTrans(int speed, double weight, Color bodyColor) : this() { EntityTrans = new EntityTrans(speed, weight, bodyColor); } /// /// Конструктор /// /// Класс-сущность public DrawingTrans(EntityTrans trans) : this() { if (trans != null) { EntityTrans = new EntityTrans(trans.Speed, trans.Weight, trans.BodyColor); } } /// /// Конструктор для наследников /// /// Ширина прорисовки автомобиля /// Высота прорисовки автомобиля protected DrawingTrans(int drawningTransWidth, int drawningTransHeight) : this() { _drawningTransWidth = drawningTransWidth; _pictureHeight = drawningTransHeight; } /// /// Установка границ поля /// /// Ширина поля /// Высота поля /// true - границы заданы, false - проверка не пройдена, нельзя разместить объект в этих размерах public bool SetPictureSize(int width, int height) { if (width >= _drawningTransWidth || height >= _drawningTransWidth) { _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 - _drawningTransWidth) { x = _pictureWidth.Value - _drawningTransWidth; } if (y < 0) { y = 0; } else if (y > _pictureHeight - _drawningTransHeight) { y = _pictureHeight.Value - _drawningTransHeight; } _startPosX = x; _startPosY = y; } /// /// Изменение направления перемещения /// /// Направление /// true - перемещене выполнено, false - перемещениеневозможно public bool MoveTransport(DirectionType direction) { if (EntityTrans == null || !_startPosX.HasValue || !_startPosY.HasValue) { return false; } switch (direction) { //влево case DirectionType.Left: if (_startPosX.Value - EntityTrans.Step > 0) { _startPosX -= (int)EntityTrans.Step; } return true; //вверх case DirectionType.Up: if (_startPosY.Value - EntityTrans.Step > 0) { _startPosY -= (int)EntityTrans.Step; } return true; // вправо case DirectionType.Right: if (_startPosX.Value + EntityTrans.Step < _pictureWidth - _drawningTransWidth) { _startPosX += (int)EntityTrans.Step; } return true; //вниз case DirectionType.Down: if (_startPosY.Value + EntityTrans.Step < _pictureHeight - _drawningTransHeight) { _startPosY += (int)EntityTrans.Step; } return true; default: return false; } } /// /// Прорисовка объекта /// /// public virtual void DrawTransport(Graphics g) { if (EntityTrans == null || !_startPosX.HasValue || !_startPosY.HasValue) { return; } Pen pen = new(EntityTrans.BodyColor); // Тело g.DrawPolygon(pen, new Point[] { new Point(_startPosX.Value, _startPosY.Value + 30), new Point(_startPosX.Value + 10, _startPosY.Value + 10), new Point(_startPosX.Value + 70, _startPosY.Value + 10), new Point(_startPosX.Value + 80, _startPosY.Value + 30), new Point(_startPosX.Value + 80, _startPosY.Value + 50), new Point(_startPosX.Value, _startPosY.Value + 50), }); // Колеса for (int i = 0; i < 4; i++) { g.DrawEllipse(pen, new Rectangle((_startPosX.Value) + (70 / 4) * (i + 1) + -4, _startPosY.Value + 46, 8, 8)); } // Стекла g.DrawPolygon(pen, new Point[] { new Point(_startPosX.Value + 2, _startPosY.Value + 30), new Point(_startPosX.Value + 10, _startPosY.Value + 13), new Point(_startPosX.Value + 70, _startPosY.Value + 13), new Point(_startPosX.Value + 78, _startPosY.Value + 30), }); } }