using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Liner.Entities; using Liner.MovingStrategies; namespace Liner.Drawing { public class DrawingLiner { /// /// Класс-сущность /// public EntityLiner? EntityLiner { get; protected set; } /// /// Ширина окна /// private int _pictureWidth; /// /// Высота окна /// private int _pictureHeight; /// /// Левая координата прорисовки лайнера /// protected int _startPosX; /// /// Верхняя координата прорисовки лайнера /// protected int _startPosY; /// /// Ширина прорисовки лайнера /// protected readonly int _linerWidth = 100; /// /// Высота прорисовки лайнера /// protected readonly int _linerHeight = 60; /// /// Координата X объекта /// public int GetPosX => _startPosX; /// /// Координата Y объекта /// public int GetPosY => _startPosY; /// /// Ширина объекта /// public int GetWidth => _linerWidth; /// /// Высота объекта /// public int GetHeight => _linerHeight; /// /// Получение объекта IMoveableObject из объекта DrawingLiner /// public IMoveableObject GetMoveableObject => new DrawingObjectLiner(this); /// /// Конструктор /// /// Скорость /// Вес лайнера /// Основной цвет /// Ширина картинки /// Высота картинки public DrawingLiner(int speed, double weight, Color bodyColor, Color bottomColor, int width, int height) { _pictureWidth = width; _pictureHeight = height; EntityLiner = new EntityLiner(speed, weight, bodyColor, bottomColor); } /// /// Конструктор /// /// Скорость /// Вес лайнера /// Основной цвет /// Ширина картинки /// Высота картинки /// Ширина прорисовки лайнера /// Высота прорисовки лайнера protected DrawingLiner(int speed, double weight, Color bodyColor, Color bottomColor, int width, int height,int linerWidth,int linerHeight) { _linerHeight = linerHeight; _linerWidth = linerWidth; _pictureWidth = width; _pictureHeight = height; EntityLiner = new EntityLiner(speed, weight, bodyColor, bottomColor); } /// /// Установка позиции /// /// Координата X /// Координата Y public void SetPosition(int x, int y) { if (x > _pictureWidth || y > _pictureHeight || x < 0 || y < 0) { _startPosX = 0; _startPosY = 0; } _startPosX = x; _startPosY = y; } // высота палубы - 20 пикселей public virtual void DrawTransport(Graphics g) { if (EntityLiner == null) { return; } Pen pen = new(Color.Black); Brush bottomBrush = new SolidBrush(EntityLiner.BottomColor); Brush deckBrush = new SolidBrush(EntityLiner.BodyColor); // палуба Point[] firstDeck = {new Point(_startPosX + 30, _startPosY), new Point(_startPosX + 30 + 60, _startPosY), new Point(_startPosX + 30 + 60, _startPosY + 20), new Point(_startPosX + 30, _startPosY + 20)}; // нижний корпус Point[] bottom = {new Point(_startPosX, _startPosY), new Point(_startPosX + 100, _startPosY), new Point(_startPosX+80, _startPosY + 40), new Point(_startPosX + 20, _startPosY + 40)}; // бассейн g.FillPolygon(deckBrush, firstDeck); g.DrawPolygon(pen, firstDeck);//рисуем палубу for (int i = 0; i < 4; i++) //сдвигаем элементы вниз на кол-во палуб { bottom[i].Y += 20; } g.FillPolygon(bottomBrush, bottom); g.DrawPolygon(pen, bottom);//рисуем нижний корпус } /// /// Проверка, что объект может переместится по указанному направлению /// /// Направление /// true - можно переместится по указанному направлению public bool CanMove(DirectionType direction) { if (EntityLiner == null) { return false; } return direction switch { //влево DirectionType.Left => _startPosX - EntityLiner.Step > 0, //вверх DirectionType.Up => _startPosY - EntityLiner.Step > 0, //вправо DirectionType.Right => _startPosX + EntityLiner.Step + _linerWidth < _pictureWidth, //вниз DirectionType.Down => _startPosY + EntityLiner.Step + _linerHeight < _pictureHeight }; } /// /// Изменение направления перемещения /// /// Направление public void MoveTransport(DirectionType direction) { if (!CanMove(direction) || EntityLiner == null) { return; } switch (direction) { //влево case DirectionType.Left: _startPosX -= (int)EntityLiner.Step; break; //вверх case DirectionType.Up: _startPosY -= (int)EntityLiner.Step; break; // вправо case DirectionType.Right: _startPosX += (int)EntityLiner.Step; break; //вниз case DirectionType.Down: _startPosY += (int)EntityLiner.Step; break; } } } }