From aef37af39e3e7caa1ba9cb58a6c58f8871c5eb2d Mon Sep 17 00:00:00 2001 From: 5_fG Date: Sun, 31 Mar 2024 16:05:49 +0400 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=80=D0=BE=D0=B4=D0=B8=D1=82=D0=B5=D0=BB?= =?UTF-8?q?=D0=B5=D0=B9=20=D0=B8=20=D0=B2=D0=B2=D0=BE=D0=B4=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BD=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=82=D0=BE=D1=80=D0=BE?= =?UTF-8?q?=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProjectExcavator/DrawningExcavator.cs | 328 ------------------ .../{ => Drawnings}/DirectionType.cs | 2 +- .../Drawnings/DrawningBaseExcavator.cs | 250 +++++++++++++ .../Drawnings/DrawningExcavator.cs | 127 +++++++ .../Entities/EntityBaseExcavator.cs | 41 +++ .../Entities/EntityExcavator.cs | 37 ++ .../ProjectExcavator/EntityExcavator.cs | 60 ---- .../FormExcavator.Designer.cs | 17 +- .../ProjectExcavator/FormExcavator.cs | 157 +++++---- 9 files changed, 560 insertions(+), 459 deletions(-) delete mode 100644 ProjectExcavator/ProjectExcavator/DrawningExcavator.cs rename ProjectExcavator/ProjectExcavator/{ => Drawnings}/DirectionType.cs (91%) create mode 100644 ProjectExcavator/ProjectExcavator/Drawnings/DrawningBaseExcavator.cs create mode 100644 ProjectExcavator/ProjectExcavator/Drawnings/DrawningExcavator.cs create mode 100644 ProjectExcavator/ProjectExcavator/Entities/EntityBaseExcavator.cs create mode 100644 ProjectExcavator/ProjectExcavator/Entities/EntityExcavator.cs delete mode 100644 ProjectExcavator/ProjectExcavator/EntityExcavator.cs diff --git a/ProjectExcavator/ProjectExcavator/DrawningExcavator.cs b/ProjectExcavator/ProjectExcavator/DrawningExcavator.cs deleted file mode 100644 index 8c3f28d..0000000 --- a/ProjectExcavator/ProjectExcavator/DrawningExcavator.cs +++ /dev/null @@ -1,328 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net.Sockets; -using System.Text; -using System.Threading.Tasks; - -namespace ProjectExcavator; - -/// -/// Класс, отвечающий за прорисовку и перемещение объекта-сущности -/// -public class DrawningExcavator -{ - /// - /// Класс-сущность - /// - public EntityExcavator? EntityExcavator { get; private set; } - - /// - /// Ширина окна - /// - private int? _pictureWidth; - - /// - /// Высота окна - /// - private int? _pictureHeight; - - /// - /// Левая координата прорисовки Экскаватора - /// - private int? _startPosX; - - /// - /// Верхняя кооридната прорисовки Экскаватора - /// - private int? _startPosY; - - /// - /// Ширина прорисовки Экскаватора - /// - private readonly int _drawningExcavatorWidth = 135; - - /// - /// Высота прорисовки Экскаватора - /// - private readonly int _drawningExcavatorHeight = 82; - - /// - /// Инициализация свойств - /// - /// Скорость - /// Вес - /// Основной цвет - /// Дополнительный цвет - /// Признак наличия ковша - /// Признак наличия поддержки - public void Init(int speed, double weight, Color bodyColor, Color additionalColor, bool bucket, bool supports) - { - EntityExcavator = new EntityExcavator(); - EntityExcavator.Init(speed, weight, bodyColor, additionalColor, bucket,supports); - _pictureWidth = null; - _pictureHeight = null; - _startPosX = null; - _startPosY = null; - } - - /// - /// Установка границ поля - /// - /// Ширина поля - /// Высота поля - /// true - границы заданы, false - проверка не пройдена, нельзя разместить объект в этих размерах - public bool SetPictureSize(int width, int height) - { - //проверка, что объект "влезает" в размеры поля - if (_drawningExcavatorWidth > width || _drawningExcavatorHeight > height) - { - EntityExcavator = null; - return false; - } - - // если влезает, сохраняем границы и корректируем позицию объекта, если она была уже установлена - else - { - _pictureWidth = width; - _pictureHeight = height; - - if (_startPosX.HasValue && (_startPosX.Value + _drawningExcavatorWidth > _pictureWidth)) - { - _startPosX = _pictureWidth - _drawningExcavatorWidth; - } - - if (_startPosY.HasValue && (_startPosY + _drawningExcavatorHeight > _pictureHeight)) - { - _startPosY = _pictureHeight - _drawningExcavatorHeight; - } - - return true; - } - } - - /// - /// Установка позиции - /// - /// Координата X - /// Координата Y - public void SetPosition(int x, int y) - { - // если при установке объекта в эти координаты, он будет "выходить" за границы формы - // то надо изменить координаты, чтобы он оставался в этих границах - _startPosX = x; - _startPosY = y; - if (_startPosX + _drawningExcavatorWidth > _pictureWidth) - { - _startPosX = _pictureWidth - _drawningExcavatorWidth; - } - - if (_startPosX < 0) - { - _startPosX = 0; - } - - if (_startPosY + _drawningExcavatorHeight > _pictureHeight) - { - _startPosY = _pictureHeight - _drawningExcavatorHeight; - } - - if (_startPosY < 0) - { - _startPosY = 0; - } - } - - /// - /// Изменение направления перемещения - /// - /// Направление - /// true - перемещене выполнено, false - перемещение невозможно - public bool MoveTransport(DirectionType direction) - { - if (EntityExcavator == null || !_startPosX.HasValue || !_startPosY.HasValue) - { - return false; - } - - switch (direction) - { - //влево - case DirectionType.Left: - if (_startPosX.Value - EntityExcavator.Step > 0) - { - _startPosX -= (int)EntityExcavator.Step; - } - return true; - //вверх - case DirectionType.Up: - if (_startPosY.Value - EntityExcavator.Step > 0) - { - _startPosY -= (int)EntityExcavator.Step; - } - return true; - // вправо - case DirectionType.Right: - if (_startPosX.Value + EntityExcavator.Step < _pictureWidth - _drawningExcavatorWidth) - { - _startPosX += (int)EntityExcavator.Step; - } - return true; - //вниз - case DirectionType.Down: - if (_startPosY.Value + EntityExcavator.Step < _pictureHeight - _drawningExcavatorHeight) - { - _startPosY += (int)EntityExcavator.Step; - } - return true; - default: - return false; - } - } - - /// - /// Прорисовка объекта - /// - /// - public void DrawTransport(Graphics g) - { - if (EntityExcavator == null || !_startPosX.HasValue || !_startPosY.HasValue) - { - return; - } - - Pen pen = new(Color.Black); - Brush additionalBrush = new SolidBrush(EntityExcavator.AdditionalColor); - Pen blackPen = new Pen(Color.Black, 2); - Brush brBrown = new SolidBrush(Color.DarkSlateGray); - - //Ковш со стрелой - if (EntityExcavator.Bucket) - { - //стрела - Point point1 = new Point(_startPosX.Value + 70, _startPosY.Value + 11); - Point point2 = new Point(_startPosX.Value + 110, _startPosY.Value + 3); - Point point3 = new Point(_startPosX.Value + 120, _startPosY.Value + 4); - Point point4 = new Point(_startPosX.Value + 120, _startPosY.Value + 7); - Point point5 = new Point(_startPosX.Value + 70, _startPosY.Value + 28); - Point[] BucketPart1= - { - point1, - point2, - point3, - point4, - point5 - }; - g.DrawPolygon(blackPen, BucketPart1); - g.FillPolygon(additionalBrush, BucketPart1); - - Point point6 = new Point(_startPosX.Value + 112, _startPosY.Value + 2); - Point point7 = new Point(_startPosX.Value + 120, _startPosY.Value + 3); - Point point8 = new Point(_startPosX.Value + 125, _startPosY.Value + 7); - Point point9 = new Point(_startPosX.Value + 135, _startPosY.Value + 35); - Point point10 = new Point(_startPosX.Value + 132, _startPosY.Value + 35); - Point[] BucketPart2 = - { - point6, - point7, - point8, - point9, - point10 - }; - g.DrawPolygon(pen, BucketPart2); - g.FillPolygon(additionalBrush, BucketPart2); - - //ковш - Point point21 = new Point(_startPosX.Value + 130, _startPosY.Value + 35); - Point point22 = new Point(_startPosX.Value + 135, _startPosY.Value + 35); - Point point23 = new Point(_startPosX.Value + 135, _startPosY.Value + 40 ); - Point point24 = new Point(_startPosX.Value + 125, _startPosY.Value + 45); - Point point25 = new Point(_startPosX.Value + 115, _startPosY.Value + 40); - Point[] BucketPart3 = - { - point21, - point22, - point23, - point24, - point25, - }; - g.DrawPolygon(blackPen, BucketPart3); - g.FillPolygon(brBrown, BucketPart3); - - //шарниры - g.DrawEllipse(pen, _startPosX.Value + 114, _startPosY.Value + 3, 6, 6); - g.FillEllipse(brBrown, _startPosX.Value + 114, _startPosY.Value + 3, 6, 6); - - g.FillEllipse(brBrown, _startPosX.Value + 127, _startPosY.Value + 32, 6, 6); - } - - //контур и заливка основы - Brush br = new SolidBrush(EntityExcavator.BodyColor); - g.FillRectangle(br, _startPosX.Value + 65, _startPosY.Value + 10, 25, 25);//кабина - g.DrawRectangle(pen, _startPosX.Value + 65, _startPosY.Value + 10, 25, 25); - - g.FillRectangle(br, _startPosX.Value + 20, _startPosY.Value + 35, 70, 20);//основа - g.DrawRectangle(pen, _startPosX.Value + 20, _startPosY.Value + 35, 70, 20); - - Brush brBlue = new SolidBrush(Color.LightBlue); - g.FillRectangle(brBlue, _startPosX.Value + 72, _startPosY.Value + 12, 15, 15);//окно - g.DrawRectangle(pen, _startPosX.Value + 72, _startPosY.Value + 12, 15, 15); - - g.FillRectangle(br, _startPosX.Value + 40, _startPosY.Value + 13, 5, 22);//труба - g.DrawRectangle(pen, _startPosX.Value + 40, _startPosY.Value + 13, 5, 22); - - g.FillEllipse(brBrown, _startPosX.Value + 17, _startPosY.Value + 59, 13, 13);//большое правое колесо - g.DrawEllipse(pen, _startPosX.Value + 17, _startPosY.Value + 59, 13, 13); - - g.FillEllipse(brBrown, _startPosX.Value + 80, _startPosY.Value + 59, 13, 13);//большое левое колесо - g.DrawEllipse(pen, _startPosX.Value + 80, _startPosY.Value + 59, 13, 13); - - g.FillEllipse(brBrown, _startPosX.Value + 34, _startPosY.Value + 63, 9, 9);//среднее правое колесо - g.DrawEllipse(pen, _startPosX.Value + 34, _startPosY.Value + 63, 9, 9); - - g.FillEllipse(brBrown, _startPosX.Value + 50, _startPosY.Value + 63, 9, 9);//средние колесо в середине - g.DrawEllipse(pen, _startPosX.Value + 50, _startPosY.Value + 63, 9, 9); - - g.FillEllipse(brBrown, _startPosX.Value + 66, _startPosY.Value + 63, 9, 9);//среднее левое колесо - g.DrawEllipse(pen, _startPosX.Value + 66, _startPosY.Value + 63, 9, 9); - - g.FillEllipse(brBrown, _startPosX.Value + 44, _startPosY.Value + 59, 5, 5);//маленькое правое колесо - g.DrawEllipse(pen, _startPosX.Value + 44, _startPosY.Value + 59, 5, 5); - - g.FillEllipse(brBrown, _startPosX.Value + 59, _startPosY.Value + 59, 5, 5);//маленькое левое колесо - g.DrawEllipse(pen, _startPosX.Value + 59, _startPosY.Value + 59, 5, 5); - - //гусеницы - g.DrawArc(blackPen, _startPosX.Value + 14, _startPosY.Value + 56, 20, 20, 125, 125);//правая дуга - g.DrawArc(blackPen, _startPosX.Value + 76, _startPosY.Value + 56, 20, 20, 290, 125);//левая дуга - g.DrawLine(blackPen, _startPosX.Value + 20, _startPosY.Value + 57, _startPosX.Value + 90, _startPosY.Value + 57); - g.DrawLine(blackPen, _startPosX.Value + 19, _startPosY.Value + 74, _startPosX.Value + 91, _startPosY.Value + 74); - - // Поддержка - if (EntityExcavator.Supports) - { - Point point1 = new Point(_startPosX.Value + 22 , _startPosY.Value + 55); - Point point2 = new Point(_startPosX.Value + 22, _startPosY.Value + 50); - Point point3 = new Point(_startPosX.Value + 15, _startPosY.Value + 50); - Point point4 = new Point(_startPosX.Value + 8 , _startPosY.Value + 80); - Point point5 = new Point(_startPosX.Value, _startPosY.Value + 82); - Point point6 = new Point(_startPosX.Value + 12, _startPosY.Value + 82); - Point[] BuckePoint = - { - point1, - point2, - point3, - point4, - point5, - point6 - }; - g.DrawPolygon(pen, BuckePoint); - g.FillPolygon(additionalBrush, BuckePoint); - - g.DrawEllipse(blackPen, _startPosX.Value + 17, _startPosY.Value + 47, 6, 6); - g.FillEllipse(brBrown, _startPosX.Value + 17, _startPosY.Value + 47, 6, 6); - } - - - } -} diff --git a/ProjectExcavator/ProjectExcavator/DirectionType.cs b/ProjectExcavator/ProjectExcavator/Drawnings/DirectionType.cs similarity index 91% rename from ProjectExcavator/ProjectExcavator/DirectionType.cs rename to ProjectExcavator/ProjectExcavator/Drawnings/DirectionType.cs index 20f68ec..26e6f72 100644 --- a/ProjectExcavator/ProjectExcavator/DirectionType.cs +++ b/ProjectExcavator/ProjectExcavator/Drawnings/DirectionType.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace ProjectExcavator; +namespace ProjectExcavator.Drawnings; public enum DirectionType { diff --git a/ProjectExcavator/ProjectExcavator/Drawnings/DrawningBaseExcavator.cs b/ProjectExcavator/ProjectExcavator/Drawnings/DrawningBaseExcavator.cs new file mode 100644 index 0000000..a761b9e --- /dev/null +++ b/ProjectExcavator/ProjectExcavator/Drawnings/DrawningBaseExcavator.cs @@ -0,0 +1,250 @@ +using ProjectExcavator.Entities; + +namespace ProjectExcavator.Drawnings; + +/// +/// Класс, отвечающий за прорисовку и перемещение объекта-сущности +/// +public class DrawningBaseExcavator +{ + /// + /// Класс-сущность + /// + public EntityBaseExcavator? EntityBaseExcavator { get; protected set; } + + /// + /// Ширина окна + /// + private int? _pictureWidth; + + /// + /// Высота окна + /// + private int? _pictureHeight; + + /// + /// Левая координата прорисовки Экскаватора + /// + protected int? _startPosX; + + /// + /// Верхняя кооридната прорисовки Экскаватора + /// + protected int? _startPosY; + + /// + /// Ширина прорисовки Экскаватора + /// + private readonly int _drawningExcavatorWidth = 78; + + /// + /// Высота прорисовки Экскаватора + /// + private readonly int _drawningExcavatorHeight = 63; + + /// + /// Пустой конструктор + /// + private DrawningBaseExcavator() + { + _pictureWidth = null; + _pictureHeight = null; + _startPosX = null; + _startPosY = null; + } + + /// + /// Конструктор + /// + /// Скорость + /// Вес + /// Основной цвет + public DrawningBaseExcavator(int speed, double weight, Color bodyColor) : this() + { + EntityBaseExcavator = new EntityBaseExcavator(speed, weight, bodyColor); + } + + /// + /// Конструктор для наследников + /// + /// Ширина прорисовки Экскаватора + /// Высота прорисовки Экскаватора + protected DrawningBaseExcavator(int drawningExcavatorWidth, int drawningExcavatorHeight) : this() + { + _drawningExcavatorWidth = drawningExcavatorWidth; + _drawningExcavatorHeight = drawningExcavatorHeight; + } + + /// + /// Установка границ поля + /// + /// Ширина поля + /// Высота поля + /// true - границы заданы, false - проверка не пройдена, нельзя разместить объект в этих размерах + public bool SetPictureSize(int width, int height) + { + //проверка, что объект "влезает" в размеры поля + if (_drawningExcavatorWidth > width || _drawningExcavatorHeight > height) + { + EntityBaseExcavator = null; + return false; + } + + // если влезает, сохраняем границы и корректируем позицию объекта, если она была уже установлена + else + { + _pictureWidth = width; + _pictureHeight = height; + + if (_startPosX.HasValue && (_startPosX.Value + _drawningExcavatorWidth > _pictureWidth)) + { + _startPosX = _pictureWidth - _drawningExcavatorWidth; + } + + if (_startPosY.HasValue && (_startPosY + _drawningExcavatorHeight > _pictureHeight)) + { + _startPosY = _pictureHeight - _drawningExcavatorHeight; + } + + return true; + } + } + + /// + /// Установка позиции + /// + /// Координата X + /// Координата Y + public void SetPosition(int x, int y) + { + // если при установке объекта в эти координаты, он будет "выходить" за границы формы + // то надо изменить координаты, чтобы он оставался в этих границах + _startPosX = x; + _startPosY = y; + if (_startPosX + _drawningExcavatorWidth > _pictureWidth) + { + _startPosX = _pictureWidth - _drawningExcavatorWidth; + } + + if (_startPosX < 0) + { + _startPosX = 0; + } + + if (_startPosY + _drawningExcavatorHeight > _pictureHeight) + { + _startPosY = _pictureHeight - _drawningExcavatorHeight; + } + + if (_startPosY < 0) + { + _startPosY = 0; + } + } + + /// + /// Изменение направления перемещения + /// + /// Направление + /// true - перемещене выполнено, false - перемещение невозможно + public bool MoveTransport(DirectionType direction) + { + if (EntityBaseExcavator == null || !_startPosX.HasValue || !_startPosY.HasValue) + { + return false; + } + + switch (direction) + { + //влево + case DirectionType.Left: + if (_startPosX.Value - EntityBaseExcavator.Step > 0) + { + _startPosX -= (int)EntityBaseExcavator.Step; + } + return true; + //вверх + case DirectionType.Up: + if (_startPosY.Value - EntityBaseExcavator.Step > 0) + { + _startPosY -= (int)EntityBaseExcavator.Step; + } + return true; + // вправо + case DirectionType.Right: + if (_startPosX.Value + EntityBaseExcavator.Step < _pictureWidth - _drawningExcavatorWidth) + { + _startPosX += (int)EntityBaseExcavator.Step; + } + return true; + //вниз + case DirectionType.Down: + if (_startPosY.Value + EntityBaseExcavator.Step < _pictureHeight - _drawningExcavatorHeight) + { + _startPosY += (int)EntityBaseExcavator.Step; + } + return true; + default: + return false; + } + } + + /// + /// Прорисовка объекта + /// + /// + public virtual void DrawTransport(Graphics g) + { + if (EntityBaseExcavator == null || !_startPosX.HasValue || !_startPosY.HasValue) + { + return; + } + + Pen pen = new(Color.Black); + Pen blackPen = new Pen(Color.Black, 2); + Brush brBrown = new SolidBrush(Color.DarkSlateGray); + + //контур и заливка основы + Brush br = new SolidBrush(EntityBaseExcavator.BodyColor); + g.FillRectangle(br, _startPosX.Value + 65-14, _startPosY.Value + 10-10, 25, 25);//кабина + g.DrawRectangle(pen, _startPosX.Value + 65 - 14, _startPosY.Value + 10-10, 25, 25); + + g.FillRectangle(br, _startPosX.Value + 20 - 14, _startPosY.Value + 35 - 10, 70, 20);//основа + g.DrawRectangle(pen, _startPosX.Value + 20 - 14, _startPosY.Value + 35 - 10, 70, 20); + + Brush brBlue = new SolidBrush(Color.LightBlue); + g.FillRectangle(brBlue, _startPosX.Value + 72 - 14, _startPosY.Value + 12 - 10, 15, 15);//окно + g.DrawRectangle(pen, _startPosX.Value + 72 - 14, _startPosY.Value + 12 - 10, 15, 15); + + g.FillRectangle(br, _startPosX.Value + 40 - 14, _startPosY.Value + 13 - 10, 5, 22);//труба + g.DrawRectangle(pen, _startPosX.Value + 40 - 14, _startPosY.Value + 13 - 10, 5, 22); + + g.FillEllipse(brBrown, _startPosX.Value + 17 - 14, _startPosY.Value + 59 - 10, 13, 13);//большое правое колесо + g.DrawEllipse(pen, _startPosX.Value + 17 - 14, _startPosY.Value + 59 - 10, 13, 13); + + g.FillEllipse(brBrown, _startPosX.Value + 80 - 14, _startPosY.Value + 59 - 10, 13, 13);//большое левое колесо + g.DrawEllipse(pen, _startPosX.Value + 80 - 14, _startPosY.Value + 59 - 10, 13, 13); + + g.FillEllipse(brBrown, _startPosX.Value + 34 - 14, _startPosY.Value + 63 - 10, 9, 9);//среднее правое колесо + g.DrawEllipse(pen, _startPosX.Value + 34 - 14, _startPosY.Value + 63 - 10, 9, 9); + + g.FillEllipse(brBrown, _startPosX.Value + 50 - 14, _startPosY.Value + 63 - 10, 9, 9);//средние колесо в середине + g.DrawEllipse(pen, _startPosX.Value + 50 - 14, _startPosY.Value + 63 - 10, 9, 9); + + g.FillEllipse(brBrown, _startPosX.Value + 66 - 14, _startPosY.Value + 63 - 10, 9, 9);//среднее левое колесо + g.DrawEllipse(pen, _startPosX.Value + 66 - 14, _startPosY.Value + 63 - 10, 9, 9); + + g.FillEllipse(brBrown, _startPosX.Value + 44 - 14, _startPosY.Value + 59 - 10, 5, 5);//маленькое правое колесо + g.DrawEllipse(pen, _startPosX.Value + 44 - 14, _startPosY.Value + 59 - 10, 5, 5); + + g.FillEllipse(brBrown, _startPosX.Value + 59 - 14, _startPosY.Value + 59 - 10, 5, 5);//маленькое левое колесо + g.DrawEllipse(pen, _startPosX.Value + 59 - 14, _startPosY.Value + 59 - 10, 5, 5); + + //гусеницы + g.DrawArc(blackPen, _startPosX.Value + 14 - 14, _startPosY.Value + 56 - 10, 20, 20, 125, 125);//правая дуга + g.DrawArc(blackPen, _startPosX.Value + 76 - 14, _startPosY.Value + 56 - 10, 20, 20, 290, 125);//левая дуга + g.DrawLine(blackPen, _startPosX.Value + 20 - 14, _startPosY.Value + 57 - 10, _startPosX.Value + 90 - 14, _startPosY.Value + 57 - 10); + g.DrawLine(blackPen, _startPosX.Value + 19 - 14, _startPosY.Value + 74 - 10, _startPosX.Value + 91 - 14, _startPosY.Value + 74 - 10); + + } +} \ No newline at end of file diff --git a/ProjectExcavator/ProjectExcavator/Drawnings/DrawningExcavator.cs b/ProjectExcavator/ProjectExcavator/Drawnings/DrawningExcavator.cs new file mode 100644 index 0000000..2496c52 --- /dev/null +++ b/ProjectExcavator/ProjectExcavator/Drawnings/DrawningExcavator.cs @@ -0,0 +1,127 @@ +using ProjectExcavator.Entities; +namespace ProjectExcavator.Drawnings; + +/// +/// Класс, отвечающий за прорисовку и перемещение объекта-сущности +/// +public class DrawningExcavator : DrawningBaseExcavator +{ + /// + /// Конструктор + /// + /// Скорость + /// Вес + /// Основной цвет + /// Дополнительный цвет + /// Признак наличия ковша + /// Признак наличия поддержки + public DrawningExcavator(int speed, double weight, Color bodyColor, Color additionalColor, bool bucket, bool supports) : base(135, 82) + { + EntityBaseExcavator = new EntityExcavator(speed, weight, bodyColor, additionalColor, bucket, supports); + } + + public override void DrawTransport(Graphics g) + { + if (EntityBaseExcavator == null|| EntityBaseExcavator is not EntityExcavator excavator || !_startPosX.HasValue || !_startPosY.HasValue) + { + return; + } + + Pen pen = new(Color.Black); + Brush additionalBrush = new SolidBrush(excavator.AdditionalColor); + Pen blackPen = new Pen(Color.Black, 2); + Brush brBrown = new SolidBrush(Color.DarkSlateGray); + + //Ковш со стрелой + if (excavator.Bucket) + { + //стрела + Point point1 = new Point(_startPosX.Value + 70, _startPosY.Value + 11); + Point point2 = new Point(_startPosX.Value + 110, _startPosY.Value + 3); + Point point3 = new Point(_startPosX.Value + 120, _startPosY.Value + 4); + Point point4 = new Point(_startPosX.Value + 120, _startPosY.Value + 7); + Point point5 = new Point(_startPosX.Value + 70, _startPosY.Value + 28); + Point[] BucketPart1 = + { + point1, + point2, + point3, + point4, + point5 + }; + g.DrawPolygon(blackPen, BucketPart1); + g.FillPolygon(additionalBrush, BucketPart1); + + Point point6 = new Point(_startPosX.Value + 112, _startPosY.Value + 2); + Point point7 = new Point(_startPosX.Value + 120, _startPosY.Value + 3); + Point point8 = new Point(_startPosX.Value + 125, _startPosY.Value + 7); + Point point9 = new Point(_startPosX.Value + 135, _startPosY.Value + 35); + Point point10 = new Point(_startPosX.Value + 132, _startPosY.Value + 35); + Point[] BucketPart2 = + { + point6, + point7, + point8, + point9, + point10 + }; + g.DrawPolygon(pen, BucketPart2); + g.FillPolygon(additionalBrush, BucketPart2); + + //ковш + Point point21 = new Point(_startPosX.Value + 130, _startPosY.Value + 35); + Point point22 = new Point(_startPosX.Value + 135, _startPosY.Value + 35); + Point point23 = new Point(_startPosX.Value + 135, _startPosY.Value + 40); + Point point24 = new Point(_startPosX.Value + 125, _startPosY.Value + 45); + Point point25 = new Point(_startPosX.Value + 115, _startPosY.Value + 40); + Point[] BucketPart3 = + { + point21, + point22, + point23, + point24, + point25, + }; + g.DrawPolygon(blackPen, BucketPart3); + g.FillPolygon(brBrown, BucketPart3); + + //шарниры + g.DrawEllipse(pen, _startPosX.Value + 114, _startPosY.Value + 3, 6, 6); + g.FillEllipse(brBrown, _startPosX.Value + 114, _startPosY.Value + 3, 6, 6); + + g.FillEllipse(brBrown, _startPosX.Value + 127, _startPosY.Value + 32, 6, 6); + } + + _startPosX += 14; + _startPosY += 10; + base.DrawTransport(g); + _startPosX -= 14; + _startPosY -= 10; + + //поддержка + if (excavator.Supports) + { + Point point1 = new Point(_startPosX.Value + 22, _startPosY.Value + 55); + Point point2 = new Point(_startPosX.Value + 22, _startPosY.Value + 50); + Point point3 = new Point(_startPosX.Value + 15, _startPosY.Value + 50); + Point point4 = new Point(_startPosX.Value + 8, _startPosY.Value + 80); + Point point5 = new Point(_startPosX.Value, _startPosY.Value + 82); + Point point6 = new Point(_startPosX.Value + 12, _startPosY.Value + 82); + Point[] BuckePoint = + { + point1, + point2, + point3, + point4, + point5, + point6 + }; + g.DrawPolygon(pen, BuckePoint); + g.FillPolygon(additionalBrush, BuckePoint); + + g.DrawEllipse(blackPen, _startPosX.Value + 17, _startPosY.Value + 47, 6, 6); + g.FillEllipse(brBrown, _startPosX.Value + 17, _startPosY.Value + 47, 6, 6); + } + } + +} diff --git a/ProjectExcavator/ProjectExcavator/Entities/EntityBaseExcavator.cs b/ProjectExcavator/ProjectExcavator/Entities/EntityBaseExcavator.cs new file mode 100644 index 0000000..47c3061 --- /dev/null +++ b/ProjectExcavator/ProjectExcavator/Entities/EntityBaseExcavator.cs @@ -0,0 +1,41 @@ +namespace ProjectExcavator.Entities; + +/// +/// Класс-сущность "Базовый Экскаватор" +/// +public class EntityBaseExcavator +{ + /// + /// Скорость + /// + public int Speed { get; private set; } + + /// + /// Вес + /// + public double Weight { get; private set; } + + /// + /// Основной цвет + /// + public Color BodyColor { get; private set; } + + /// + /// Шаг перемещения автомобиля + /// + public double Step => Speed * 100 / Weight; + + /// + /// Конструктор сущности + /// + /// Скорость + /// Вес автомобиля + /// Основной цвет + + public EntityBaseExcavator(int speed, double weight, Color bodyColor) + { + Speed = speed; + Weight = weight; + BodyColor = bodyColor; + } +} diff --git a/ProjectExcavator/ProjectExcavator/Entities/EntityExcavator.cs b/ProjectExcavator/ProjectExcavator/Entities/EntityExcavator.cs new file mode 100644 index 0000000..ffacd21 --- /dev/null +++ b/ProjectExcavator/ProjectExcavator/Entities/EntityExcavator.cs @@ -0,0 +1,37 @@ +namespace ProjectExcavator.Entities; + +/// +/// Класс-сущность "Экскаватор" +/// +public class EntityExcavator : EntityBaseExcavator +{ + public Color AdditionalColor { get; private set; } + + /// + /// Признак (опция) наличия ковша + /// + public bool Bucket { get; private set; } + + /// + /// Признак (опция) наличия опоры для фиксации + /// + public bool Supports { get; private set; } + + + /// + /// Конструктор сущности + /// + /// Скорость + /// Вес автомобиля + /// Основной цвет + /// Дополнительный цвет + /// Признак (опция) наличия ковша + /// Признак (опция) наличия поддержки + + public EntityExcavator(int speed, double weight, Color bodyColor, Color additionalColor, bool bucket, bool supports) : base (speed, weight,bodyColor) + { + AdditionalColor = additionalColor; + Bucket = bucket; + Supports = supports; + } +} diff --git a/ProjectExcavator/ProjectExcavator/EntityExcavator.cs b/ProjectExcavator/ProjectExcavator/EntityExcavator.cs deleted file mode 100644 index 64c297b..0000000 --- a/ProjectExcavator/ProjectExcavator/EntityExcavator.cs +++ /dev/null @@ -1,60 +0,0 @@ -namespace ProjectExcavator; - -public class EntityExcavator -{ - /// - /// Скорость - /// - public int Speed { get; private set; } - - /// - /// Вес - /// - public double Weight { get; private set; } - - /// - /// Основной цвет - /// - public Color BodyColor { get; private set; } - - /// - /// Дополнительный цвет (для опциональных элементов) - /// - public Color AdditionalColor { get; private set; } - - /// - /// Признак (опция) наличия ковша - /// - public bool Bucket { get; private set; } - - /// - /// Признак (опция) наличия опоры для фиксации - /// - public bool Supports { get; private set; } - - /// - /// Шаг перемещения автомобиля - /// - public double Step => Speed * 100 / Weight; - - - /// - /// Инициализация полей объекта-класса спортивного автомобиля - /// - /// Скорость - /// Вес автомобиля - /// Основной цвет - /// Дополнительный цвет - /// Признак (опция) наличия ковша - - - public void Init(int speed, double weight, Color bodyColor, Color additionalColor, bool bucket, bool supports) - { - Speed = speed; - Weight = weight; - BodyColor = bodyColor; - AdditionalColor = additionalColor; - Bucket = bucket; - Supports = supports; - } -} diff --git a/ProjectExcavator/ProjectExcavator/FormExcavator.Designer.cs b/ProjectExcavator/ProjectExcavator/FormExcavator.Designer.cs index 3512515..004a1c5 100644 --- a/ProjectExcavator/ProjectExcavator/FormExcavator.Designer.cs +++ b/ProjectExcavator/ProjectExcavator/FormExcavator.Designer.cs @@ -34,6 +34,7 @@ buttonDown = new Button(); buttonUp = new Button(); buttonRight = new Button(); + ButtonCreateBaseExcavator = new Button(); ((System.ComponentModel.ISupportInitialize)pictureBoxExcavator).BeginInit(); SuspendLayout(); // @@ -51,9 +52,9 @@ buttonCreateExcavator.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; buttonCreateExcavator.Location = new Point(12, 540); buttonCreateExcavator.Name = "buttonCreateExcavator"; - buttonCreateExcavator.Size = new Size(100, 45); + buttonCreateExcavator.Size = new Size(250, 45); buttonCreateExcavator.TabIndex = 0; - buttonCreateExcavator.Text = "Создать"; + buttonCreateExcavator.Text = "Создать усиленный экскаватор"; buttonCreateExcavator.Click += ButtonCreateExcavator_Click; // // buttonLeft @@ -104,11 +105,22 @@ buttonRight.UseVisualStyleBackColor = true; buttonRight.Click += ButtonMove_Click; // + // ButtonCreateBaseExcavator + // + ButtonCreateBaseExcavator.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + ButtonCreateBaseExcavator.Location = new Point(265, 540); + ButtonCreateBaseExcavator.Name = "ButtonCreateBaseExcavator"; + ButtonCreateBaseExcavator.Size = new Size(250, 45); + ButtonCreateBaseExcavator.TabIndex = 5; + ButtonCreateBaseExcavator.Text = "Создать обычный экскаватор"; + ButtonCreateBaseExcavator.Click += ButtonCreateBaseExcavator_Click; + // // FormExcavator // AutoScaleDimensions = new SizeF(8F, 20F); AutoScaleMode = AutoScaleMode.Font; ClientSize = new Size(905, 597); + Controls.Add(ButtonCreateBaseExcavator); Controls.Add(buttonRight); Controls.Add(buttonUp); Controls.Add(buttonDown); @@ -129,5 +141,6 @@ private Button buttonDown; private Button buttonUp; private Button buttonRight; + private Button ButtonCreateBaseExcavator; } } \ No newline at end of file diff --git a/ProjectExcavator/ProjectExcavator/FormExcavator.cs b/ProjectExcavator/ProjectExcavator/FormExcavator.cs index fefa2a2..ec015c8 100644 --- a/ProjectExcavator/ProjectExcavator/FormExcavator.cs +++ b/ProjectExcavator/ProjectExcavator/FormExcavator.cs @@ -1,83 +1,104 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Forms; +using ProjectExcavator.Drawnings; -namespace ProjectExcavator +namespace ProjectExcavator; + +public partial class FormExcavator : Form { - public partial class FormExcavator : Form + private DrawningBaseExcavator? _drawningBaseExcavator; + public FormExcavator() { - private DrawningExcavator? _drawningExcavator; - public FormExcavator() + InitializeComponent(); + } + + private void Draw() + { + if (_drawningBaseExcavator == null) { - InitializeComponent(); + return; } - private void Draw() + Bitmap bmp = new(pictureBoxExcavator.Width, pictureBoxExcavator.Height); + Graphics gr = Graphics.FromImage(bmp); + _drawningBaseExcavator.DrawTransport(gr); + pictureBoxExcavator.Image = bmp; + } + + /// + /// Создание объекта класса-перемещения + /// + /// Тип создаваемого объекта + private void CreateObject(string type) + { + Random random = new(); + switch (type) { - if (_drawningExcavator == null) - { + case nameof(DrawningBaseExcavator): + _drawningBaseExcavator = new DrawningBaseExcavator(random.Next(100, 300), random.Next(1000, 3000), + Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256))); + break; + case nameof(DrawningExcavator): + _drawningBaseExcavator = new DrawningExcavator(random.Next(100, 300), random.Next(1000, 3000), + Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)), + Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)), + Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2))); + break; + default: return; - } - - Bitmap bmp = new(pictureBoxExcavator.Width, pictureBoxExcavator.Height); - Graphics gr = Graphics.FromImage(bmp); - _drawningExcavator.DrawTransport(gr); - pictureBoxExcavator.Image = bmp; } - private void ButtonCreateExcavator_Click(object sender, EventArgs e) + _drawningBaseExcavator.SetPictureSize(pictureBoxExcavator.Width, pictureBoxExcavator.Height); + _drawningBaseExcavator.SetPosition(random.Next(10, 100), random.Next(10, 100)); + Draw(); + } + + /// + /// Создать усиленный экскаватор + /// + /// + /// + private void ButtonCreateExcavator_Click(object sender, EventArgs e) => CreateObject(nameof(DrawningExcavator)); + + /// + /// Создать обычный экскаватор + /// + /// + /// + private void ButtonCreateBaseExcavator_Click(object sender, EventArgs e) => CreateObject(nameof(DrawningBaseExcavator)); + + /// + /// Перемещение объекта по форме (нажатие кнопок навигации) + /// + /// + /// + private void ButtonMove_Click(object sender, EventArgs e) + { + if (_drawningBaseExcavator == null) + { + return; + } + + string name = ((Button)sender)?.Name ?? string.Empty; + bool result = false; + switch (name) + { + case "buttonUp": + result = _drawningBaseExcavator.MoveTransport(DirectionType.Up); + break; + case "buttonDown": + result = _drawningBaseExcavator.MoveTransport(DirectionType.Down); + break; + case "buttonLeft": + result = _drawningBaseExcavator.MoveTransport(DirectionType.Left); + break; + case "buttonRight": + result = _drawningBaseExcavator.MoveTransport(DirectionType.Right); + break; + } + + if (result) { - Random random = new(); - _drawningExcavator = new DrawningExcavator(); - _drawningExcavator.Init(random.Next(100, 300), random.Next(1000, 3000), - Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)), - Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)), - Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2))); - _drawningExcavator.SetPictureSize(pictureBoxExcavator.Width, pictureBoxExcavator.Height); - _drawningExcavator.SetPosition(random.Next(10, 100), random.Next(10, 100)); Draw(); } - - /// - /// Перемещение объекта по форме (нажатие кнопок навигации) - /// - /// - /// - private void ButtonMove_Click(object sender, EventArgs e) - { - if (_drawningExcavator == null) - { - return; - } - - string name = ((Button)sender)?.Name ?? string.Empty; - bool result = false; - switch (name) - { - case "buttonUp": - result = _drawningExcavator.MoveTransport(DirectionType.Up); - break; - case "buttonDown": - result = _drawningExcavator.MoveTransport(DirectionType.Down); - break; - case "buttonLeft": - result = _drawningExcavator.MoveTransport(DirectionType.Left); - break; - case "buttonRight": - result = _drawningExcavator.MoveTransport(DirectionType.Right); - break; - } - - if (result) - { - Draw(); - } - } } + }