using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Sailboat { /// /// Класс, отвечающий за прорисовку и перемещение объекта-сущности /// internal class DrawingBoat { /// /// Класс-сущность /// public Boat Boat{ protected set; get; } /// ` /// Левая координата отрисовки автомобиля /// protected float _startPosX; /// /// Верхняя кооридната отрисовки автомобиля /// protected float _startPosY; /// /// Ширина окна отрисовки /// private int? _pictureWidth = null; /// /// Высота окна отрисовки /// private int? _pictureHeight = null; /// /// Ширина отрисовки автомобиля /// private readonly int _boatWidth = 125; /// /// Высота отрисовки автомобиля /// private readonly int _boatHeight = 40; /// /// Инициализация свойств /// /// Скорость /// Вес автомобиля /// Цвет кузова public DrawingBoat(int speed, float weight, Color bodyColor) { Boat = new Boat(speed, weight, bodyColor); } public DrawingBoat(int speed, float weight, Color bodyColor, int boatHeight, int boatWith): this(speed, weight, bodyColor) { _boatHeight = boatHeight; _boatWidth = boatWith; } /// /// Установка позиции автомобиля /// /// Координата X /// Координата Y /// Ширина картинки /// Высота картинки public void SetPosition(int x, int y, int width, int height) { if (x >= 0 && y >= 0 && x < width - _boatWidth && y < height - _boatHeight) { _startPosX = x; _startPosY = y; _pictureWidth = width; _pictureHeight = height; } } /// /// Изменение направления перемещения /// /// Направление public void MoveTransport(Direction direction) { if (!_pictureWidth.HasValue || !_pictureHeight.HasValue) { return; } switch (direction) { // вправо case Direction.Right: if (_startPosX + _boatWidth + ((int)Boat.Step) < _pictureWidth) { _startPosX += ((int)Boat.Step); } break; //влево case Direction.Left: if (_startPosX > ((int)Boat.Step)) { _startPosX -= ((int)Boat.Step); } break; //вверх case Direction.Up: if (_startPosY > ((int)Boat.Step)) { _startPosY -= ((int)Boat.Step); } break; //вниз case Direction.Down: if (_startPosY + _boatHeight + ((int)Boat.Step) < _pictureHeight) { _startPosY += ((int)Boat.Step); } break; } } /// /// Отрисовка лодки /// /// public virtual void DrawTransport(Graphics g) { if (_startPosX < 0 || _startPosY < 0 || !_pictureHeight.HasValue || !_pictureWidth.HasValue) { return; } Pen pen = new(Color.Black); //корма g.DrawLine(pen, _startPosX, _startPosY, _startPosX + 70, _startPosY); g.DrawLine(pen, _startPosX, _startPosY, _startPosX, _startPosY+40); g.DrawLine(pen, _startPosX, _startPosY + 40, _startPosX + 70, _startPosY+40); //нос g.DrawLine(pen, _startPosX + 70, _startPosY + 40, _startPosX + 120, _startPosY+20); g.DrawLine(pen, _startPosX + 70, _startPosY, _startPosX + 120, _startPosY+20); //внутренность Rectangle rect = new Rectangle((int)_startPosX + 5, (int)_startPosY + 5, 60, 30); g.DrawRectangle(pen, rect); Brush br = new SolidBrush(Boat.BodyColor); g.FillRectangle(br, rect); } /// /// Смена границ формы отрисовки /// /// Ширина картинки /// Высота картинки public void ChangeBorders(int width, int height) { _pictureWidth = width; _pictureHeight = height; if (_pictureWidth <= _boatWidth || _pictureHeight <= _boatHeight) { _pictureWidth = null; _pictureHeight = null; return; } if (_startPosX + _boatWidth > _pictureWidth) { _startPosX = _pictureWidth.Value - _boatWidth; } if (_startPosY + _boatHeight > _pictureHeight) { _startPosY = _pictureHeight.Value - _boatHeight; } } /// /// Получение текущей позиции объекта /// /// public (float Left, float Right, float Top, float Bottom) GetCurrentPosition() { return (_startPosX, _startPosY, _startPosX + _boatWidth, _startPosY + _boatHeight); } } }