namespace ProjectAirplaneWithRadar { /// /// Класс, отвечающий за прорисовку и перемещение объекта-сущности /// public class DrawingAirplaneWithRadar { /// /// Класс-сущность /// public EntityAirplaneWithRadar? EntityAirplaneWithRadar { get; private set; } /// /// Ширина окна /// private int? _pictureWidth; /// /// Высота окна /// private int? _pictureHeight; /// /// Левая координата прорисовки /// private int? _startPosX; /// /// Верхняя кооридната прорисовки /// private int? _startPosY; /// /// Ширина прорисовки автомобиля /// public const int PlaneWidth = 260; /// /// Высота прорисовки автомобиля /// public const int PlaneHeight = 95; public const int FormPadding = 30; /// /// Инициализация свойств /// /// Скорость /// Вес /// Основной цвет /// Дополнительный цвет /// Признак наличия обвеса /// Признак наличия антикрыла /// Признак наличия гоночной полосы public void Init(int speed, double weight, Color bodyColor, Color additionalColor, bool bodyKit, bool wing, bool sportLine) { EntityAirplaneWithRadar = new EntityAirplaneWithRadar(); EntityAirplaneWithRadar.Init(speed, weight, bodyColor, additionalColor, bodyKit, wing, sportLine); _pictureWidth = null; _pictureHeight = null; _startPosX = null; _startPosY = null; } /// /// Установка границ поля /// /// Ширина поля /// Высота поля /// true - границы заданы, false - проверка не пройдена, нельзя разместить объект в этих размерах public bool SetPictureSize(int width, int height) { // TODO проверка, что объект "влезает" в размеры поля // если влезает, сохраняем границы и корректируем позицию объекта, если она была уже установлена _pictureWidth = width; _pictureHeight = height; if (_startPosX is null || _startPosY is null) { return false; } return SetPosition(_startPosX!.Value, _startPosY!.Value); } /// /// Установка позиции /// /// Координата X /// Координата Y public bool SetPosition(int x, int y) { if (!_pictureHeight.HasValue || !_pictureWidth.HasValue) { return true; } int height = _pictureHeight.Value - PlaneHeight; int width = _pictureWidth.Value - PlaneWidth; // TODO если при установке объекта в эти координаты, он будет "выходить" за границы формы // то надо изменить координаты, чтобы он оставался в этих границах _startPosX = x < 0 ? 0 : x > width ? width : x; _startPosY = y < 0 ? 0 : y > height ? height : y; return (x < 0 || x > width || y < 0 || y > height) == false; } /// /// Изменение направления перемещения /// /// Направление /// true - перемещене выполнено, false - перемещение невозможно public bool MoveTransport(DirectionType direction) { if (EntityAirplaneWithRadar == null || !_startPosX.HasValue || !_startPosY.HasValue) { return false; } int step = (int)EntityAirplaneWithRadar.Step; switch (direction) { //влево case DirectionType.Left: if (_startPosX.Value - step > 0) { _startPosX -= step; } break; //вверх case DirectionType.Up: if (_startPosY.Value - step > 0) { _startPosY -= step; } break; // вправо case DirectionType.Right: if (_startPosX.Value + step < _pictureWidth - PlaneWidth) { _startPosX += step; } break; //вниз case DirectionType.Down: if (_startPosY.Value + step < _pictureHeight - PlaneHeight) { _startPosY += step; } break; default: return false; } return true; } /// /// Прорисовка объекта /// /// public void DrawTransport(Graphics g) { if (EntityAirplaneWithRadar == null || !_startPosX.HasValue || !_startPosY.HasValue) { return; } Pen pen = new(Color.Black); Brush additionalBrush = new SolidBrush(EntityAirplaneWithRadar.AdditionalColor); //Шасси if (EntityAirplaneWithRadar.Wheels) { //Задняя стойка g.DrawRectangle(pen, _startPosX.Value + 70, _startPosY.Value + 90, 5, 10); g.FillRectangle(additionalBrush, _startPosX.Value + 70, _startPosY.Value + 90, 5, 10); g.DrawEllipse(pen, _startPosX.Value + 60, _startPosY.Value + 100, 10, 10); g.FillEllipse(additionalBrush, _startPosX.Value + 60, _startPosY.Value + 100, 10, 10); g.DrawEllipse(pen, _startPosX.Value + 75, _startPosY.Value + 100, 10, 10); g.FillEllipse(additionalBrush, _startPosX.Value + 75, _startPosY.Value + 100, 10, 10); //Передняя стойка g.DrawRectangle(pen, _startPosX.Value + 180, _startPosY.Value + 90, 5, 10); g.FillRectangle(additionalBrush, _startPosX.Value + 180, _startPosY.Value + 90, 5, 10); g.DrawEllipse(pen, _startPosX.Value + 177, _startPosY.Value + 100, 10, 10); g.FillEllipse(additionalBrush, _startPosX.Value + 177, _startPosY.Value + 100, 10, 10); } //Ракета воздух-воздух if (EntityAirplaneWithRadar.Rocket) { g.DrawRectangle(pen, _startPosX.Value + 100, _startPosY.Value + 80, 2, 5); g.FillRectangle(additionalBrush, _startPosX.Value + 100, _startPosY.Value + 80, 2, 5); g.DrawRectangle(pen, _startPosX.Value + 140, _startPosY.Value + 80, 2, 5); g.FillRectangle(additionalBrush, _startPosX.Value + 140, _startPosY.Value + 80, 2, 5); g.DrawRectangle(pen, _startPosX.Value + 80, _startPosY.Value + 85, 80, 5); g.FillRectangle(additionalBrush, _startPosX.Value + 80, _startPosY.Value + 85, 80, 5); } //Корпус g.DrawRectangle(pen, _startPosX.Value + 10, _startPosY.Value + 60,200,30); //Хвост Point[] points = { new Point(_startPosX.Value + 10, _startPosY.Value + 10), new Point(_startPosX.Value + 10, _startPosY.Value + 60), new Point(_startPosX.Value + 60, _startPosY.Value + 60) }; g.DrawPolygon(pen, points); //Кабина Point[] points2 = { new Point(_startPosX.Value + 210, _startPosY.Value + 55), new Point(_startPosX.Value + 210, _startPosY.Value + 75), new Point(_startPosX.Value + 260, _startPosY.Value + 75) }; g.DrawPolygon(pen, points2); Point[] points3 = { new Point(_startPosX.Value + 210, _startPosY.Value + 75), new Point(_startPosX.Value + 210, _startPosY.Value + 95), new Point(_startPosX.Value + 260, _startPosY.Value + 75) }; g.DrawPolygon(pen, points3); //Крыло Brush brBlack = new SolidBrush(Color.Black); g.DrawEllipse(pen, _startPosX.Value + 70, _startPosY.Value + 70, 100, 10); g.FillEllipse(brBlack, _startPosX.Value + 70, _startPosY.Value + 70, 100, 10); //Хвостовой элерон g.DrawEllipse(pen, _startPosX.Value, _startPosY.Value + 55, 40, 10); g.FillEllipse(brBlack, _startPosX.Value, _startPosY.Value + 55, 40, 10); } } }