using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using ProjectFighterJet.Entities; namespace ProjectFighterJet.Drawnings; public class DrawningJet { /// /// Класс-сущность /// public EntityJet? EntityJet { get; protected set; } /// /// Ширина окна /// private int? _pictureWidth; /// /// Высота окна /// private int? _pictureHeight; /// /// Левая координата прорисовки истрибителя /// protected int? _startPosX; /// /// Верхняя кооридната прорисовки истрибителя /// protected int? _startPosY; /// /// Ширина прорисовки истрибителя /// private readonly int _drawningJetrWidth = 140; /// /// Высота прорисовки истрибителя /// private readonly int _drawningJetrHeight = 135; /// /// Координата X объекта /// public int? GetPosX => _startPosX; /// /// Координата Y объекта /// public int? GetPosY => _startPosY; /// /// Ширина объекта /// public int GetWidth => _drawningJetrWidth; /// /// Высота объекта /// public int GetHeight => _drawningJetrHeight; /// /// Пустой коструктор /// public DrawningJet() { _pictureWidth = null; _pictureHeight = null; _startPosX = null; _startPosY = null; } /// /// Коструктор /// /// Скорость /// Вес /// Основной цвет public DrawningJet(int speed, double weight, Color bodyColor) : this() { EntityJet = new EntityJet(speed, weight, bodyColor); } /// /// Коструктор для наследников /// /// Ширина прорисовки истрибителя /// Высота прорисовки истрибителя protected DrawningJet (int drawningJetrWidth, int drawningJetrHeight) : this() { _drawningJetrWidth = drawningJetrWidth; _drawningJetrHeight = drawningJetrHeight; } /// /// Установка границ поля /// /// Ширина поля /// Высота поля /// true - границы заданы, false - проверка не пройдена, нельзя разместить объект в этих размерах public bool SetPictureSize(int width, int height) { // TODO проверка, что объект "влезает" в размеры поля // если влезает, сохраняем границы и корректируем позицию объекта, если она была уже установлена if (width < _drawningJetrWidth || height < _drawningJetrHeight) return false; _pictureWidth = width; _pictureHeight = height; if (_startPosX != null && _startPosY != null) { if (_startPosX + _drawningJetrWidth > _pictureWidth) { _startPosX = -_drawningJetrWidth + _pictureWidth; } else if (_startPosX < 0) { _startPosX = 0; } if (_startPosY + _drawningJetrHeight > _pictureHeight) { _startPosY = -_drawningJetrHeight + _pictureHeight; } else if (_startPosY < 0) { _startPosY = 0; } } return true; } /// /// Установка позиции /// /// Координата X /// Координата Y public void SetPosition(int x, int y) { if (!_pictureHeight.HasValue || !_pictureWidth.HasValue) { return; } // TODO если при установке объекта в эти координаты, он будет "выходить" за границы формы // то надо изменить координаты, чтобы он оставался в этих границах if (x + _drawningJetrWidth > _pictureWidth) { _startPosX = x - (x + _drawningJetrWidth - _pictureWidth); } else if (x < 0) { _startPosX = 0; } else { _startPosX = x; } if (y + _drawningJetrHeight > _pictureHeight) { _startPosY = y - (y + _drawningJetrHeight - _pictureHeight); } else if (y < 0) { _startPosY = 0; } else { _startPosY = y; } _startPosX = x; _startPosY = y; } /// /// Изменение направления перемещения /// /// Направление /// true - перемещене выполнено, false - перемещение невозможно public bool MoveTransport(DirectionType direction) { if (EntityJet == null || !_startPosX.HasValue || !_startPosY.HasValue) { return false; } switch (direction) { //влево case DirectionType.Left: if (_startPosX.Value - EntityJet.Step > 0) { _startPosX -= (int)EntityJet.Step; } return true; //вверх case DirectionType.Up: if (_startPosY.Value - EntityJet.Step > 0) { _startPosY -= (int)EntityJet.Step; } return true; // вправо case DirectionType.Right: if (_startPosX + _drawningJetrWidth + EntityJet.Step < _pictureWidth) { _startPosX += (int)EntityJet.Step; } return true; //вниз case DirectionType.Down: if (_startPosY + _drawningJetrHeight + EntityJet.Step < _pictureHeight) { _startPosY += (int)EntityJet.Step; } return true; default: return false; } } public virtual void DrawTransport(Graphics g) { if (EntityJet == null || !_startPosX.HasValue || !_startPosY.HasValue) { return; } Brush bodyBrush = new SolidBrush(EntityJet.BodyColor); Pen pen = new(Color.Black); Brush brBlack = new SolidBrush(Color.Black); //Нос бомбардировщика Point[] pointsNose = { new Point(_startPosX.Value + 20, _startPosY.Value + 60), new Point(_startPosX.Value + 5, _startPosY.Value + 70), new Point(_startPosX.Value + 20, _startPosY.Value + 80) }; g.FillPolygon(brBlack, pointsNose); //Тело бомбардировщика g.DrawRectangle(pen, _startPosX.Value + 20, _startPosY.Value + 60, 120, 20); Point[] pointsBodyJet = { new Point(_startPosX.Value + 20, _startPosY.Value + 80 ), new Point(_startPosX.Value + 120, _startPosY.Value + 80), new Point(_startPosX.Value + 120, _startPosY.Value + 60), new Point(_startPosX.Value + 20, _startPosY.Value + 60) }; g.DrawPolygon(pen, pointsBodyJet); g.FillPolygon(bodyBrush, pointsBodyJet); g.DrawLine(pen, _startPosX.Value + 20, _startPosY.Value + 60, _startPosX.Value + 120, _startPosY.Value + 60); //Задние крылья бомбардировщика Point[] pointsBackWings = { new Point(_startPosX.Value + 140, _startPosY.Value + 30 ), new Point(_startPosX.Value + 140, _startPosY.Value + 110), new Point(_startPosX.Value + 120, _startPosY.Value + 90), new Point(_startPosX.Value + 120, _startPosY.Value + 50), }; g.DrawPolygon(pen, pointsBackWings); g.FillPolygon(bodyBrush, pointsBackWings); g.DrawLine(pen, _startPosX.Value + 140, _startPosY.Value + 30, _startPosX.Value + 140, _startPosY.Value + 110); g.DrawLine(pen, _startPosX.Value + 140, _startPosY.Value + 110, _startPosX.Value + 120, _startPosY.Value + 90); g.DrawLine(pen, _startPosX.Value + 120, _startPosY.Value + 90, _startPosX.Value + 120, _startPosY.Value + 80); g.DrawLine(pen, _startPosX.Value + 120, _startPosY.Value + 60, _startPosX.Value + 120, _startPosY.Value + 50); g.DrawLine(pen, _startPosX.Value + 120, _startPosY.Value + 50, _startPosX.Value + 140, _startPosY.Value + 30); //Крылья бомбардировщика Point[] pointsWings = { new Point(_startPosX.Value + 50, _startPosY.Value ), new Point(_startPosX.Value + 50, _startPosY.Value + 135), new Point(_startPosX.Value + 60, _startPosY.Value + 135), new Point(_startPosX.Value + 65, _startPosY.Value + 80), new Point(_startPosX.Value + 65, _startPosY.Value + 60), new Point(_startPosX.Value + 60, _startPosY.Value ) }; g.FillPolygon(bodyBrush, pointsWings); g.DrawLine(pen, _startPosX.Value + 50, _startPosY.Value, _startPosX.Value + 50, _startPosY.Value + 60); g.DrawLine(pen, _startPosX.Value + 50, _startPosY.Value + 80, _startPosX.Value + 50, _startPosY.Value + 135); g.DrawLine(pen, _startPosX.Value + 50, _startPosY.Value + 135, _startPosX.Value + 60, _startPosY.Value + 135); g.DrawLine(pen, _startPosX.Value + 60, _startPosY.Value + 135, _startPosX.Value + 65, _startPosY.Value + 80); g.DrawLine(pen, _startPosX.Value + 50, _startPosY.Value, _startPosX.Value + 60, _startPosY.Value); g.DrawLine(pen, _startPosX.Value + 60, _startPosY.Value, _startPosX.Value + 65, _startPosY.Value + 60); } }