using ProjectStormtrooper.Entities; namespace ProjectStormtrooper.Drawnings; public class DrawningStormtrooperBase { /// /// Класс-сущность /// public EntityStormtrooperBase? EntityStormtrooperBase { get; protected set; } /// /// Ширина окна /// private int? _pictureWidth; /// /// Высота окна /// private int? _pictureHeight; /// /// Левая координата начала прорисовки /// protected int? _startPosX; /// /// Верхняя координата начала прорисовки /// protected int? _startPosY; /// /// Ширина прорисовки /// private readonly int _drawningStormtrooperWidth = 140; /// /// Высота прорисовки /// private readonly int _drawningStormtooperHeight = 135; /// /// Координата Х объекта /// /// public int? GetPosX => _startPosX; /// /// Координата У объекта /// /// public int? GetPosY => _startPosY; /// /// Ширина объекта /// /// public int GetWidth => _drawningStormtrooperWidth; /// /// Высота объекта /// /// public int GetHeight => _drawningStormtooperHeight; /// /// Пустой конструктор /// private DrawningStormtrooperBase() { _pictureHeight = null; _pictureWidth = null; _startPosX = null; _startPosY = null; } /// /// Конструктор /// /// скорость /// вес /// основной цвет public DrawningStormtrooperBase(int speed, double weight, Color bodyColor):this() { EntityStormtrooperBase = new EntityStormtrooperBase(speed, weight, bodyColor); } /// /// Конструктор для наследников /// /// Ширина прорисовки /// Высота прорисовки protected DrawningStormtrooperBase(int drawningStormtrooperWidth, int drawningStormtooperHeight) : this() { _drawningStormtrooperWidth = drawningStormtrooperWidth; _drawningStormtooperHeight = drawningStormtooperHeight; } public DrawningStormtrooperBase(EntityStormtrooperBase entityStormtrooperBase) : this() { EntityStormtrooperBase = new EntityStormtrooperBase(entityStormtrooperBase.Speed, entityStormtrooperBase.Weight, entityStormtrooperBase.BodyColor); } /// /// Установка границ поля /// /// Ширина поля /// Высота поля /// true - граница задана, false - проверка не пройдена, нельзя разместить объект в этих размерах public bool SetPictureSize(int width, int height) { if (width >= _drawningStormtrooperWidth || height >= _drawningStormtooperHeight) { _pictureWidth = width; _pictureHeight = height; if (_startPosX != null && _startPosY != null) { SetPosition(_startPosX.Value, _startPosY.Value); } return true; } return false; } /// /// Установка позиции /// /// Координата Х /// Координата У public void SetPosition(int x, int y) { if (!_pictureHeight.HasValue || !_pictureWidth.HasValue) { return; } // TODO если при установке объекта в эти координаты, он будет "выходить" за границы формы // то надо изменить координаты, чтобы он оставался в этих границах if (x < 0) { x = 0; } else if (x > _pictureWidth - _drawningStormtrooperWidth) { x = _pictureWidth.Value - _drawningStormtrooperWidth; } if (y < 0) { y = 0; } else if (y > _pictureHeight - _drawningStormtooperHeight) { y = _pictureHeight.Value - _drawningStormtooperHeight; } _startPosX = x; _startPosY = y; } /// /// Изменение направления перемещения /// /// направление /// true - перемещение выполнено, false - перемещение невозможно public bool MoveTransport(DirectionType direction) { if (EntityStormtrooperBase == null || !_startPosX.HasValue || !_startPosY.HasValue) { return false; } switch (direction) { //влево case DirectionType.Left: if (_startPosX.Value - EntityStormtrooperBase.Step > 0) { _startPosX -= (int)EntityStormtrooperBase.Step; } return true; //Вверх case DirectionType.Up: if (_startPosY.Value - EntityStormtrooperBase.Step > 0) { _startPosY -= (int)EntityStormtrooperBase.Step; } return true; //Вправо case DirectionType.Right: if (_startPosX.Value + EntityStormtrooperBase.Step + _drawningStormtrooperWidth < _pictureWidth) { _startPosX += (int)EntityStormtrooperBase.Step; } return true; //Вниз case DirectionType.Down: if (_startPosY.Value + EntityStormtrooperBase.Step + _drawningStormtooperHeight < _pictureHeight) { _startPosY += (int)EntityStormtrooperBase.Step; } return true; default: return false; } } /// /// Прорисовка объекта /// /// public virtual void DrawTransport(Graphics g) { if (EntityStormtrooperBase == null || !_startPosX.HasValue || !_startPosY.HasValue) { return; } Pen pen = new(Color.Black); Brush bodyColorBrush = new SolidBrush(EntityStormtrooperBase.BodyColor); //нос штурмовика Brush brBlack = new SolidBrush(Color.Black); Point[] Nose = new Point[3]; Nose[0].X = _startPosX.Value + 20; Nose[0].Y = _startPosY.Value + 85; Nose[1].X = _startPosX.Value + 20; Nose[1].Y = _startPosY.Value + 65; Nose[2].X = _startPosX.Value; Nose[2].Y = _startPosY.Value + 75; g.FillPolygon(brBlack, Nose); g.DrawPolygon(pen, Nose); //Заднии крылья штурмовика Point[] pflybtwings = new Point[6]; pflybtwings[0].X = _startPosX.Value + 120; pflybtwings[0].Y = _startPosY.Value + 65; pflybtwings[1].X = _startPosX.Value + 120; pflybtwings[1].Y = _startPosY.Value + 55; pflybtwings[2].X = _startPosX.Value + 140; pflybtwings[2].Y = _startPosY.Value + 35; pflybtwings[3].X = _startPosX.Value + 140; pflybtwings[3].Y = _startPosY.Value + 115; pflybtwings[4].X = _startPosX.Value + 120; pflybtwings[4].Y = _startPosY.Value + 95; pflybtwings[5].X = _startPosX.Value + 120; pflybtwings[5].Y = _startPosY.Value + 85; g.FillPolygon(bodyColorBrush, pflybtwings); g.DrawPolygon(pen, pflybtwings); //Тело штурмовика g.FillRectangle(bodyColorBrush, _startPosX.Value + 20, _startPosY.Value + 65, 120, 20); g.DrawRectangle(pen, _startPosX.Value + 20, _startPosY.Value + 65, 120, 20); //Крылья штурмовика Point[] frontwings = new Point[4]; frontwings[0].X = _startPosX.Value + 60; frontwings[0].Y = _startPosY.Value + 65; frontwings[1].X = _startPosX.Value + 60; frontwings[1].Y = _startPosY.Value + 5; frontwings[2].X = _startPosX.Value + 70; frontwings[2].Y = _startPosY.Value + 5; frontwings[3].X = _startPosX.Value + 80; frontwings[3].Y = _startPosY.Value + 65; g.FillPolygon(bodyColorBrush, frontwings); g.DrawPolygon(pen, frontwings); Point[] frontwings2 = new Point[4]; frontwings2[0].X = _startPosX.Value + 60; frontwings2[0].Y = _startPosY.Value + 85; frontwings2[1].X = _startPosX.Value + 60; frontwings2[1].Y = _startPosY.Value + 145; frontwings2[2].X = _startPosX.Value + 70; frontwings2[2].Y = _startPosY.Value + 145; frontwings2[3].X = _startPosX.Value + 80; frontwings2[3].Y = _startPosY.Value + 85; g.FillPolygon(bodyColorBrush, frontwings2); g.DrawPolygon(pen, frontwings2); } }