using ProjectStormtrooper.Entites; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ProjectStormtrooper.Drawnings; public class DrawningAirplane { /// /// Класс-сущность /// public EntityAirplane? EntityAirplane { get; protected set; } /// /// Ширина окна /// private int? _pictureWidth; /// /// Высота окна /// private int? _pictureHeight; /// /// Левая координата прорисовки самолета /// protected int? _startPosX; /// /// Верхняя кооридната прорисовки самолета /// protected int? _startPosY; /// /// Ширина прорисовки самолета /// private readonly int _drawningAirplaneWidth = 153; /// /// Высота прорисовки самолета /// private readonly int _drawningAirplaneHeight = 110; /// /// Координата X объекта /// public int? GetPosX => _startPosX; /// /// Координата Y объекта /// public int? GetPosY => _startPosY; /// /// Ширина объекта /// public int GetWidth => _drawningAirplaneWidth; /// /// Высота объекта /// public int GetHeight => _drawningAirplaneHeight; /// /// пустой конструктор /// private DrawningAirplane() { _pictureWidth = null; _pictureHeight = null; _startPosX = null; _startPosY = null; } /// /// конструктор /// /// Скорость /// Вес /// Основной цвет public DrawningAirplane(int speed, double weight, Color bodyColor) : this() { EntityAirplane = new EntityAirplane(speed, weight, bodyColor); } /// /// конструктор для наследников /// /// Ширина прорисовки самолета /// Высота прорисовки самолета protected DrawningAirplane(int drawningAirplaneWidth, int drawningAirplaneHeight) : this() { _drawningAirplaneWidth = drawningAirplaneWidth; _pictureHeight = drawningAirplaneHeight; } /// /// Установка границ поля /// /// Ширина поля /// Высота поля /// true - границы заданы, false - проверка не пройдена, нельзя разместить объект в этих размерах public bool SetPictureSize(int width, int height) { // TODO проверка, что объект "влезает" в размеры поля // если влезает, сохраняем границы и корректируем позицию объекта, если она была уже установлена _pictureWidth = width; _pictureHeight = height; return true; } /// /// Установка позиции /// /// Координата X /// Координата Y public void SetPosition(int x, int y) { if (!_pictureHeight.HasValue || !_pictureWidth.HasValue) { return; } // TODO если при установке объекта в эти координаты, он будет "выходить" за границы формы // то надо изменить координаты, чтобы он оставался в этих границах _startPosX = x; _startPosY = y; } /// /// Изменение направления перемещения /// /// Направление /// true - перемещене выполнено, false - перемещение невозможно public bool MoveTransport(DirectionType direction) { if (EntityAirplane == null || !_startPosX.HasValue || !_startPosY.HasValue) { return false; } switch (direction) { //влево case DirectionType.Left: if (_startPosX.Value - EntityAirplane.Step > 0) _startPosX -= (int)EntityAirplane.Step; return true; //вверх case DirectionType.Up: if (_startPosY.Value - EntityAirplane.Step > 0) _startPosY -= (int)EntityAirplane.Step; return true; // вправо case DirectionType.Right: if (_startPosX.Value + _drawningAirplaneWidth + EntityAirplane.Step < _pictureWidth) _startPosX += (int)EntityAirplane.Step; return true; //вниз case DirectionType.Down: if (_startPosY.Value + _drawningAirplaneHeight + EntityAirplane.Step < _pictureHeight) _startPosY += (int)EntityAirplane.Step; return true; default: return false; } } /// /// Прорисовка объекта /// /// public virtual void DrawTransport(Graphics g) { if (EntityAirplane == null || !_startPosX.HasValue || !_startPosY.HasValue) { return; } Pen pen = new(Color.Black); ///отрисовка носа Point p = new Point(_startPosX.Value, _startPosY.Value + 50); Point p2 = new Point(_startPosX.Value + 20, _startPosY.Value + 40); Point p3 = new Point(_startPosX.Value + 20, _startPosY.Value + 60); Point p4 = new Point(_startPosX.Value, _startPosY.Value + 50); Brush bortBrush = new SolidBrush(EntityAirplane.BodyColor); ///отрисовка борта g.FillRectangle(bortBrush, _startPosX.Value + 20, _startPosY.Value + 40, 120, 20); g.DrawRectangle(pen, _startPosX.Value + 20, _startPosY.Value + 40, 120, 20); ///отрисовка вепхнего крыла Point p5 = new Point(_startPosX.Value + 40, _startPosY.Value); Point p6 = new Point(_startPosX.Value + 55, _startPosY.Value); Point p7 = new Point(_startPosX.Value + 70, _startPosY.Value + 40); Point p8 = new Point(_startPosX.Value + 40, _startPosY.Value + 40); Point p9 = new Point(_startPosX.Value + 40, _startPosY.Value); ///отрисовка нижнего крыла Point p10 = new Point(_startPosX.Value + 40, _startPosY.Value + 60); Point p11 = new Point(_startPosX.Value + 70, _startPosY.Value + 60); Point p12 = new Point(_startPosX.Value + 55, _startPosY.Value + 110); Point p13 = new Point(_startPosX.Value + 40, _startPosY.Value + 110); Point p14 = new Point(_startPosX.Value + 40, _startPosY.Value + 60); ///отрисовка верхнего хвоста Point p15 = new Point(_startPosX.Value + 115, _startPosY.Value + 40); Point p16 = new Point(_startPosX.Value + 115, _startPosY.Value + 27); Point p17 = new Point(_startPosX.Value + 140, _startPosY.Value + 10); Point p18 = new Point(_startPosX.Value + 140, _startPosY.Value + 40); Point p19 = new Point(_startPosX.Value + 115, _startPosY.Value + 40); ///отрисовка нижнего хвоста Point p20 = new Point(_startPosX.Value + 115, _startPosY.Value + 60); Point p21 = new Point(_startPosX.Value + 115, _startPosY.Value + 73); Point p22 = new Point(_startPosX.Value + 140, _startPosY.Value + 90); Point p23 = new Point(_startPosX.Value + 140, _startPosY.Value + 60); Point p24 = new Point(_startPosX.Value + 115, _startPosY.Value + 60); Point[] p_nos = { p, p2, p3, p4, }; Point[] p_krilo1 = { p5, p6, p7, p8, p9 }; Point[] p_krilo2 = { p10, p11, p12, p13, p14 }; Point[] p_hvost1 = { p15, p16, p17, p18, p19 }; Point[] p_hvost2 = { p20, p21, p22, p23, p24 }; g.FillPolygon(bortBrush, p_nos); g.FillPolygon(bortBrush, p_krilo1); g.FillPolygon(bortBrush, p_krilo2); g.FillPolygon(bortBrush, p_hvost1); g.FillPolygon(bortBrush, p_hvost2); g.DrawPolygon(pen, p_nos); g.DrawPolygon(pen, p_krilo1); g.DrawPolygon(pen, p_krilo2); g.DrawPolygon(pen, p_hvost1); g.DrawPolygon(pen, p_hvost2); } }