using ProjectCruiser.Entities; namespace ProjectCruiser.Drawnings; /// /// Класс, отвечающий за прорисовку и перемещение объекта-сущности /// public class DrawningCruiser { /// /// Класс-сущность /// public EntityCruiser? EntityCruiser { get; protected set; } /// /// Ширина окна /// private int? _pictureWidth; /// /// Высота окна /// private int? _pictureHeight; /// /// Левая координата прорисовки автомобиля /// protected int? _startPosX; /// /// Верхняя кооридната прорисовки автомобиля /// protected int? _startPosY; /// /// Ширина прорисовки крейсера /// private readonly int _drawningCruiserWidth = 150; /// /// Высота прорисовки крейсера /// private readonly int _drawningCruiserHeight = 50; private readonly int _drawningEnginesWidth = 3; /// /// Координата X объекта /// public int? GetPosX => _startPosX; /// /// Координата Y объекта /// public int? GetPosY => _startPosY; /// /// Ширина объекта /// public int GetWidth => _drawningCruiserWidth; /// /// Высота объекта /// public int GetHeight => _drawningCruiserHeight; /// /// Пустой онструктор /// private DrawningCruiser() { _pictureWidth = null; _pictureHeight = null; _startPosX = null; _startPosY = null; } /// /// Конструктор /// /// Скорость /// Вес /// Основной цвет public DrawningCruiser(int speed, double weight, Color bodyColor) : this() { EntityCruiser = new EntityCruiser(speed, weight, bodyColor); } /// /// Конструктор для наследников /// /// Ширина прорисовки автомобиля /// Высота прорисовки автомобиля protected DrawningCruiser(int drawningCarWidth, int drawningCarHeight) : this() { _drawningCruiserWidth = drawningCarWidth; _pictureHeight = drawningCarHeight; } /// /// Установка границ поля /// /// Ширина поля /// Высота поля /// true - границы заданы, false - проверка не пройдена, нельзя разместить объект в этих размерах public bool SetPictureSize(int width, int height) { // TODO проверка, что объект "влезает" в размеры поля // если влезает, сохраняем границы и корректируем позицию объекта,если она была уже установлена if (_drawningCruiserHeight > height || _drawningCruiserWidth > width) { return false; } _pictureWidth = width; _pictureHeight = height; if (_startPosX.HasValue && _startPosY.HasValue) { SetPosition(_startPosX.Value, _startPosY.Value); } return true; } /// /// Установка позиции /// /// Координата X /// Координата Y public void SetPosition(int x, int y) { if (!_pictureHeight.HasValue || !_pictureWidth.HasValue) { return; } if (x < 0 || x + _drawningCruiserWidth > _pictureWidth || y < 0 || y + _drawningCruiserHeight > _pictureHeight) { _startPosX = _pictureWidth - _drawningCruiserWidth; _startPosY = _pictureHeight - _drawningCruiserHeight; } else { _startPosX = x; _startPosY = y; } } /// /// Изменение направления перемещения /// /// Направление /// true - перемещене выполнено, false - перемещение невозможно public bool MoveTransport(DirectionType direction) { if (EntityCruiser == null || !_startPosX.HasValue || !_startPosY.HasValue) { return false; } switch (direction) { //влево case DirectionType.Left: if (_startPosX.Value - EntityCruiser.Step - _drawningEnginesWidth > 0) { _startPosX -= (int)EntityCruiser.Step; } return true; //вверх case DirectionType.Up: if (_startPosY.Value - EntityCruiser.Step > 0) { _startPosY -= (int)EntityCruiser.Step; } return true; // вправо case DirectionType.Right: //TODO прописать логику сдвига в право if (_startPosX.Value + EntityCruiser.Step + _drawningCruiserWidth < _pictureWidth) { _startPosX += (int)EntityCruiser.Step; } return true; //вниз case DirectionType.Down: if (_startPosY.Value + EntityCruiser.Step + _drawningCruiserHeight < _pictureHeight) { _startPosY += (int)EntityCruiser.Step; } return true; default: return false; } } /// /// Прорисовка объекта /// /// public virtual void DrawTransport(Graphics g) { if (EntityCruiser == null || !_startPosX.HasValue || !_startPosY.HasValue) { return; } Pen pen = new(EntityCruiser.BodyColor, 2); Brush additionalBrush = new SolidBrush(Color.Black); //границы круисера g.DrawLine(pen, _startPosX.Value, _startPosY.Value, _startPosX.Value + 105, _startPosY.Value); g.DrawLine(pen, _startPosX.Value + 105, _startPosY.Value, _startPosX.Value + 147, _startPosY.Value + 24); g.DrawLine(pen, _startPosX.Value, _startPosY.Value + 49, _startPosX.Value + 105, _startPosY.Value + 49); g.DrawLine(pen, _startPosX.Value + 105, _startPosY.Value + 49, _startPosX.Value + 147, _startPosY.Value + 24); g.DrawLine(pen, _startPosX.Value, _startPosY.Value, _startPosX.Value, _startPosY.Value + 49); //внутренности круисера g.DrawEllipse(pen, _startPosX.Value + 94, _startPosY.Value + 14, 19, 19); g.DrawRectangle(pen, _startPosX.Value + 63, _startPosY.Value + 11, 21, 28); g.DrawRectangle(pen, _startPosX.Value + 35, _startPosY.Value + 17, 28, 14); //зад g.FillRectangle(additionalBrush, _startPosX.Value - 3, _startPosY.Value + 7, 3, 14); g.FillRectangle(additionalBrush, _startPosX.Value - 3, _startPosY.Value + 26, 3, 14); } }