namespace AntiAircraftGun; /// /// Класс отвечающий за прорисовку и перемещение объекта - сущности /// public class DrawningAntiAircraftGun { /// /// Класс - сущность /// public EntityAntiAircraftGun? EntityAntiAircraftGun { get; set; } /// /// Ширина окна /// private int? _pictureWidth; /// /// Высота окна /// private int? _pictureHeight; /// /// Левая координата прорисовки гидросамолета /// private int? _startPosX; /// /// Верхняя координата прорисовки гидросамолета /// private int? _startPosY; /// /// Ширина прорисовки гидросамолета /// private readonly int _drawningGunWidth = 130; /// /// Высота прорисовки гидросамолета /// private readonly int _drawningGunHeight = 50; /// /// Инициализация полей объекта-класса гидросамолета /// /// Скорость /// Вес /// Основной цвет /// Дополнительный цвет /// Наличие обвеса /// Наличие башни /// Наличие радара public void Init(int speed, double weight, Color bodyColor, Color additionalColor, bool bodyKit, bool tower, bool radar) { EntityAntiAircraftGun = new EntityAntiAircraftGun(); EntityAntiAircraftGun.Init(speed, weight, bodyColor, additionalColor, bodyKit, tower, radar); _pictureWidth = null; _pictureHeight = null; _startPosX = null; _startPosY = null; } /// /// Установка границ поля /// /// /// /// public bool SetPictureSize(int width, int height) { // TODO проверка, что объект "влезает" в размеры поля // если влезает, сохраняем границы и корректируем позицию объекта,если она была уже установлена if (width < _drawningGunWidth || height < _drawningGunHeight) { return false; }; _pictureWidth = width; _pictureHeight = height; if (_startPosX != null || _startPosY != null) { if (_startPosX + _drawningGunWidth > _pictureWidth) { _startPosX = -_drawningGunWidth + _pictureWidth; } else if (_startPosX < 0) { _startPosX = 0; } if (_startPosY + _drawningGunHeight > _pictureHeight) { _startPosY = -_drawningGunHeight + _pictureHeight; } else if (_startPosY < 0) { _startPosY = 0; } } return true; } /// /// Установка позиций /// /// /// public void SetPosition(int x, int y) { // TODO если при установке объекта в эти координаты, он будет "выходить" за границы формы // то надо изменить координаты, чтобы он оставался в этих границах if (!_pictureHeight.HasValue || !_pictureWidth.HasValue) { return; } if (x + _drawningGunWidth > _pictureWidth) { _startPosX = _pictureWidth - _drawningGunWidth; } else if (x < 0) { _startPosX = 0; } else { _startPosX = x; } if (y + _drawningGunHeight > _pictureHeight) { _startPosY = _pictureHeight - _drawningGunHeight; } else if (y < 0) { _startPosY = 0; } else { _startPosY = y; } } /// /// Изменение направления перемещения /// /// Направление /// public bool MoveTransport(DirectionType direction) { if (EntityAntiAircraftGun == null || !_startPosX.HasValue || !_startPosY.HasValue) { return false; } switch (direction) { case DirectionType.Left: if (_startPosX.Value - EntityAntiAircraftGun.Step > 0) { _startPosX -= (int)EntityAntiAircraftGun.Step; } return true; case DirectionType.Right: if (_startPosX.Value + _drawningGunWidth + EntityAntiAircraftGun.Step < _pictureWidth) { _startPosX += (int)EntityAntiAircraftGun.Step; } return true; case DirectionType.Down: if (_startPosY.Value + _drawningGunHeight + EntityAntiAircraftGun.Step < _pictureHeight) { _startPosY += (int)EntityAntiAircraftGun.Step; } return true; case DirectionType.Up: //вверх if (_startPosY - EntityAntiAircraftGun.Step > 0) { _startPosY -= (int)EntityAntiAircraftGun.Step; } return true; default: return false; } } /// /// Прорисовка объекта /// /// public void DrawTransport(Graphics g) { if (EntityAntiAircraftGun == null || !_startPosX.HasValue || !_startPosY.HasValue) { return; } Pen pen = new(Color.Black); Brush additionalBrush = new SolidBrush(EntityAntiAircraftGun.AdditionalColor); g.DrawEllipse(pen, _startPosX.Value + 10, _startPosY.Value + 75, 30, 30); g.DrawEllipse(pen, _startPosX.Value + 100, _startPosY.Value + 75, 30, 30); g.DrawRectangle(pen, _startPosX.Value + 25, _startPosY.Value + 75, 90, 30); //границы ЦВЕТ Brush brDarkSlateGray = new SolidBrush(EntityAntiAircraftGun.BodyColor); g.FillRectangle(brDarkSlateGray, _startPosX.Value + 35, _startPosY.Value + 40, 35, 30); g.FillEllipse(brDarkSlateGray, _startPosX.Value + 10, _startPosY.Value + 75, 30, 30); g.FillEllipse(brDarkSlateGray, _startPosX.Value + 100, _startPosY.Value + 75, 30, 30); g.FillRectangle(brDarkSlateGray, _startPosX.Value + 25, _startPosY.Value + 75, 90, 30); // границы арт. установки g.DrawRectangle(pen, _startPosX.Value + 35, _startPosY.Value + 40, 35, 30); g.DrawRectangle(pen, _startPosX.Value + 10, _startPosY.Value + 65, 120, 13); //нижние катки ЦВЕТ Brush brDimGray = new SolidBrush(Color.SlateGray); g.FillEllipse(brDimGray, _startPosX.Value + 40, _startPosY.Value + 90, 15, 15); g.FillEllipse(brDimGray, _startPosX.Value + 55, _startPosY.Value + 90, 15, 15); g.FillEllipse(brDimGray, _startPosX.Value + 70, _startPosY.Value + 90, 15, 15); g.FillEllipse(brDimGray, _startPosX.Value + 85, _startPosY.Value + 90, 15, 15); //нижние катки ОТРИСОВКА g.DrawEllipse(pen, _startPosX.Value + 40, _startPosY.Value + 90, 15, 15); g.DrawEllipse(pen, _startPosX.Value + 55, _startPosY.Value + 90, 15, 15); g.DrawEllipse(pen, _startPosX.Value + 70, _startPosY.Value + 90, 15, 15); g.DrawEllipse(pen, _startPosX.Value + 85, _startPosY.Value + 90, 15, 15); //Большие катки ЦВЕТ Brush brSlateGray = new SolidBrush(Color.SlateGray); g.FillEllipse(brSlateGray, _startPosX.Value + 13, _startPosY.Value + 78, 24, 24); g.FillEllipse(brSlateGray, _startPosX.Value + 103, _startPosY.Value + 78, 24, 24); //Большие катки ОТРИСОВКА g.DrawEllipse(pen, _startPosX.Value + 13, _startPosY.Value + 78, 24, 24); g.DrawEllipse(pen, _startPosX.Value + 103, _startPosY.Value + 78, 24, 24); g.FillRectangle(brDarkSlateGray, _startPosX.Value + 10, _startPosY.Value + 65, 120, 13); if (EntityAntiAircraftGun.Tower) { g.DrawLine(pen, _startPosX.Value + 45, _startPosY.Value + 50, _startPosX.Value + 90, _startPosY.Value + 20); g.DrawLine(pen, _startPosX.Value + 60, _startPosY.Value + 50, _startPosX.Value + 95, _startPosY.Value + 27); g.DrawLine(pen, _startPosX.Value + 45, _startPosY.Value + 50, _startPosX.Value + 60, _startPosY.Value + 50); } if (EntityAntiAircraftGun.Radar) { g.DrawLine(pen, _startPosX.Value + 20, _startPosY.Value + 65, _startPosX.Value + 20, _startPosY.Value + 40); g.FillRectangle(additionalBrush, _startPosX.Value + 10, _startPosY.Value + 40, 20, 20); g.DrawRectangle(pen, _startPosX.Value + 10, _startPosY.Value + 40, 20, 20); } } }