using Cruiser.Entities; using Cruiser.MovementStrategy; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Cruiser.Drawing { public class DrawingCruiser { /// /// Класс-сущность /// public EntityCruiser? EntityCruiser { get; set; } /// /// Ширина окна /// public int _pictureWidth;// изменил уровень доступа для починки отрисовки на форме коллекций /// /// Высота окна /// public int _pictureHeight;// изменил уровень доступа для починки отрисовки на форме коллекций /// /// Левая координата прорисовки Крейсера /// protected static int _startPosX; /// /// Верхняя кооридната прорисовки Крейсера /// protected static int _startPosY; /// /// Ширина прорисовки Крейсера /// private readonly int _cruiserWidth = 150; /// /// Высота прорисовки Крейсера /// private readonly int _cruiserHeight = 60; /// /// Координата X объекта /// public int GetPosX => _startPosX; /// /// Координата Y объекта /// public int GetPosY => _startPosY; /// /// Ширина объекта /// public int GetWidth => _cruiserWidth; /// /// Высота объекта /// public int GetHeight => _cruiserHeight; /// /// Конструктор /// /// Скорость /// Вес автомобиля /// Основной цвет /// Элементов цвет /// Ширина картинки /// Высота картинки public DrawingCruiser(int speed, double weight, Color bodyColor, int width, int height) { if (width < _cruiserWidth || height < _cruiserHeight) { _pictureHeight = _cruiserHeight + 100; _pictureWidth = _cruiserWidth + 100; } _pictureWidth = width; _pictureHeight = height; EntityCruiser = new EntityCruiser(speed, weight, bodyColor);//переделал конструктор, т.к. secColor не использовался в конечном результате для отрисовки } /// /// Конструктор /// /// Скорость /// Вес автомобиля /// Основной цвет /// Ширина картинки /// Высота картинки /// Ширина прорисовки крейсера /// Высота прорисовки крейсера public DrawingCruiser(int speed, double weight, Color bodyColor, int width, int height, int cruiserWidth, int cruiserHeight) { _pictureWidth = width; _pictureHeight = height; _cruiserHeight = cruiserHeight; _cruiserWidth = cruiserWidth; EntityCruiser = new EntityCruiser(speed, weight, bodyColor); //переделал конструктор, т.к. secColor не использовался в конечном результате для отрисовки } /// /// Установка позиции /// /// Координата X /// Координата Y /// /// Получение объекта IMoveableObject из объекта DrawningCar /// public IMoveableObject GetMoveableObject => new DrawningObjectCar(this); public void SetPosition(int x, int y) { if (x < 0 || y < 0) { return; } if (x > _pictureWidth || y > _pictureHeight) { return; } _startPosX = x; _startPosY = y; } /// /// Установка цвета /// public void setBodyColor(Color color) { EntityCruiser.BodyColor = color; } /// /// Проверка, что объект может переместится по указанному направлению /// /// Направление /// true - можно переместится по указанному направлению public bool CanMove(Direction direction) { if (EntityCruiser == null) { return false; } return direction switch { //влево Direction.Left => _startPosX - EntityCruiser.Step > 0, //вверх Direction.Up => _startPosY - EntityCruiser.Step > 0, // вправо Direction.Right => _startPosX + EntityCruiser.Step + _cruiserWidth < _pictureWidth, //вниз Direction.Down => _startPosY + EntityCruiser.Step + _cruiserHeight < _pictureHeight, }; } /// /// Изменение направления перемещения /// /// Направление public void MoveTransport(Direction direction) { if (!CanMove(direction) || EntityCruiser == null) { return; } switch (direction) { //влево case Direction.Left: _startPosX -= (int)EntityCruiser.Step; break; //вверх case Direction.Up: _startPosY -= (int)EntityCruiser.Step; break; // вправо case Direction.Right: _startPosX += (int)EntityCruiser.Step; break; //вниз case Direction.Down: _startPosY += (int)EntityCruiser.Step; break; } } /// /// Прорисовка объекта /// /// public virtual void DrawTransport(Graphics g) { if (EntityCruiser == null) { return; } // палуба Point[] Paluba = new Point[5] { new Point(_startPosX + 10,_startPosY), new Point(_startPosX + 110,_startPosY), new Point(_startPosX + 160,_startPosY + 30), new Point(_startPosX + 110,_startPosY + 60), new Point(_startPosX + 10,_startPosY + 60) }; Brush brush = new SolidBrush(EntityCruiser.BodyColor); g.FillPolygon(brush, Paluba); // элементы Brush colForElem = new SolidBrush(Color.Black); //поменял цвет для элементов(ОСНОВНЫХ) на чёрный, т.к. secColor не использовался Point[] Elements = new Point[8] { new Point(_startPosX + 50,_startPosY + 20), new Point(_startPosX + 70,_startPosY + 20), new Point(_startPosX + 70,_startPosY + 10), new Point(_startPosX + 90,_startPosY + 10), new Point(_startPosX + 90,_startPosY + 50), new Point(_startPosX + 70,_startPosY + 50), new Point(_startPosX + 70,_startPosY + 40), new Point(_startPosX + 50,_startPosY + 40), }; // шар на корабле g.FillPolygon(colForElem, Elements); g.FillEllipse(colForElem, _startPosX + 100, _startPosY + 20, 20, 20); // турбины g.FillRectangle(colForElem, _startPosX, _startPosY + 10, 10, 20); g.FillRectangle(colForElem, _startPosX, _startPosY + 35, 10, 20); } } }