using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace AirBomber { internal class DrawingAirBomber { /// /// Класс-сущность /// public EntityAirBomber AirBomber { private set; get; } /// /// Левая координата отрисовки бомбардировщика /// private float _startPosX; /// /// Верхняя кооридната отрисовки бомбардировщика /// private float _startPosY; /// /// Ширина окна отрисовки /// private int? _pictureWidth = null; /// /// Высота окна отрисовки /// private int? _pictureHeight = null; /// /// Ширина отрисовки бомбардировщика /// private readonly int _airBomberWidth = 110; /// /// Высота отрисовки бомбардировщика /// private readonly int _airBomberHeight = 100; /// /// Инициализация свойств /// /// Скорость /// Вес бомбардировщика /// Цвет корпуса public void Init(int speed, float weight, Color bodyColor) { AirBomber = new EntityAirBomber(); AirBomber.Init(speed, weight, bodyColor); } /// /// Установка позиции омбардировщика /// /// Координата X /// Координата Y /// Ширина картинки /// Высота картинки public void SetPosition(int x, int y, int width, int height) { _pictureWidth = width; _pictureHeight = height; if (!_pictureWidth.HasValue || !_pictureHeight.HasValue) { return; } Random rd = new Random(); _startPosX = x + _airBomberWidth >= _pictureWidth ? rd.Next(0, _pictureWidth.Value - 1 - _airBomberWidth) : x; _startPosY = y + _airBomberHeight >= _pictureHeight ? rd.Next(0, _pictureHeight.Value - 1 - _airBomberHeight) : y; } /// /// Изменение направления перемещения /// /// Направление public void MoveTransport(Direction direction) { if (!_pictureWidth.HasValue || !_pictureHeight.HasValue) { return; } switch (direction) { // вправо case Direction.Right: if (_startPosX + _airBomberWidth + AirBomber.Step < _pictureWidth) { _startPosX += AirBomber.Step; } break; //влево case Direction.Left: if (_startPosX - AirBomber.Step > 0) { _startPosX -= AirBomber.Step; } break; //вверх case Direction.Up: if (_startPosY - AirBomber.Step > 0) { _startPosY -= AirBomber.Step; } break; //вниз case Direction.Down: if (_startPosY + _airBomberHeight + AirBomber.Step < _pictureHeight) { _startPosY += AirBomber.Step; } break; } } /// /// Отрисовка бомбардировщика /// /// public void DrawTransport(Graphics g) { if (_startPosX < 0 || _startPosY < 0 || !_pictureHeight.HasValue || !_pictureWidth.HasValue) { return; } Pen pen = new(Color.Black); Brush br = new SolidBrush(AirBomber?.BodyColor ?? Color.Black); int _startPosXInt = Convert.ToInt32(_startPosX); int _startPosYInt = Convert.ToInt32(_startPosY); //отрисовка кабины g.DrawLine(pen, _startPosXInt, _startPosYInt + 50, _startPosXInt + 5, _startPosYInt + 50); Point[] cabin = { new Point(_startPosXInt + 5, _startPosYInt + 50), new Point(_startPosXInt + 20, _startPosYInt + 40), new Point(_startPosXInt + 20, _startPosYInt + 60) }; g.FillPolygon(Brushes.Black, cabin); //отрисовка корпуса g.FillRectangle(br, _startPosXInt + 20, _startPosYInt + 40, 90, 20); g.DrawRectangle(pen, _startPosXInt + 20, _startPosYInt + 40, 90, 20); //отрисовка правого крыла Point[] rightWing = { new Point(_startPosXInt + 50, _startPosYInt + 40), new Point(_startPosXInt + 50, _startPosYInt), new Point(_startPosXInt + 60, _startPosYInt), new Point(_startPosXInt + 70, _startPosYInt + 40) }; g.FillPolygon(br, rightWing); g.DrawPolygon(pen, rightWing); //отрисовка левого крыла Point[] leftWing = { new Point(_startPosXInt + 50, _startPosYInt + 60), new Point(_startPosXInt + 50, _startPosYInt + 100), new Point(_startPosXInt + 60, _startPosYInt + 100), new Point(_startPosXInt + 70, _startPosYInt + 60) }; g.FillPolygon(br, leftWing); g.DrawPolygon(pen, leftWing); //отрисовка хвоста (справа) Point[] rightTail = { new Point(_startPosXInt + 95, _startPosYInt + 40), new Point(_startPosXInt + 95, _startPosYInt + 30), new Point(_startPosXInt + 110, _startPosYInt + 15), new Point(_startPosXInt + 110, _startPosYInt + 40) }; g.FillPolygon(br, rightTail); g.DrawPolygon(pen, rightTail); //отрисовка хвоста (слева) Point[] leftTail = { new Point(_startPosXInt + 95, _startPosYInt + 60), new Point(_startPosXInt + 95, _startPosYInt + 70), new Point(_startPosXInt + 110, _startPosYInt + 85), new Point(_startPosXInt + 110, _startPosYInt + 60) }; g.FillPolygon(br, leftTail); g.DrawPolygon(pen, leftTail); } /// /// Смена границ формы отрисовки /// /// Ширина картинки /// Высота картинки public void ChangeBorders(int width, int height) { _pictureWidth = width; _pictureHeight = height; if (_pictureWidth <= _airBomberWidth || _pictureHeight <= _airBomberHeight) { _pictureWidth = null; _pictureHeight = null; return; } if (_startPosX + _airBomberWidth > _pictureWidth) { _startPosX = _pictureWidth.Value - _airBomberWidth; } if (_startPosY + _airBomberHeight > _pictureHeight) { _startPosY = _pictureHeight.Value - _airBomberHeight; } } } }