From 976bf76ff8ab8daedf5944e058d50fa3f301d6b4 Mon Sep 17 00:00:00 2001 From: LESN1K <vl-taras73@mail.ru> Date: Sat, 9 Mar 2024 20:03:38 +0400 Subject: [PATCH 1/3] =?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 --- ProjectSportCar/FormMonorail.Designer.cs | 53 ++++--- ProjectSportCar/FormMonorail.cs | 87 ++++++---- .../{ => Monorail/Drawnings}/DirectionType.cs | 2 +- .../Drawnings/DrawingModernMonorail.cs | 137 ++++++++++++++++ .../DrawingMonorail.cs} | 150 +++++------------- .../EntityModernMonorail.cs} | 32 +--- .../Monorail/Entities/EntityMonorail.cs | 41 +++++ 7 files changed, 317 insertions(+), 185 deletions(-) rename ProjectSportCar/Scripts/{ => Monorail/Drawnings}/DirectionType.cs (89%) create mode 100644 ProjectSportCar/Scripts/Monorail/Drawnings/DrawingModernMonorail.cs rename ProjectSportCar/Scripts/Monorail/{DrawMonorail.cs => Drawnings/DrawingMonorail.cs} (57%) rename ProjectSportCar/Scripts/Monorail/{EntityMonorail.cs => Entities/EntityModernMonorail.cs} (62%) create mode 100644 ProjectSportCar/Scripts/Monorail/Entities/EntityMonorail.cs diff --git a/ProjectSportCar/FormMonorail.Designer.cs b/ProjectSportCar/FormMonorail.Designer.cs index 3a375e4..61d6b4e 100644 --- a/ProjectSportCar/FormMonorail.Designer.cs +++ b/ProjectSportCar/FormMonorail.Designer.cs @@ -33,6 +33,7 @@ buttonMove_Left = new Button(); buttonMove_Up = new Button(); pictureBoxMonorail = new PictureBox(); + buttonCreateModernMonorail = new Button(); buttonCreateMonorail = new Button(); ((System.ComponentModel.ISupportInitialize)pictureBoxMonorail).BeginInit(); SuspendLayout(); @@ -42,10 +43,9 @@ buttonMove_Right.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; buttonMove_Right.BackgroundImage = Properties.Resources.ArrowRight; buttonMove_Right.BackgroundImageLayout = ImageLayout.Stretch; - buttonMove_Right.Location = new Point(875, 569); - buttonMove_Right.Margin = new Padding(3, 4, 3, 4); + buttonMove_Right.Location = new Point(766, 427); buttonMove_Right.Name = "buttonMove_Right"; - buttonMove_Right.Size = new Size(40, 47); + buttonMove_Right.Size = new Size(35, 35); buttonMove_Right.TabIndex = 0; buttonMove_Right.UseVisualStyleBackColor = true; buttonMove_Right.Click += ButtonMove_Click; @@ -55,10 +55,9 @@ buttonMove_Down.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; buttonMove_Down.BackgroundImage = Properties.Resources.ArrowDown; buttonMove_Down.BackgroundImageLayout = ImageLayout.Stretch; - buttonMove_Down.Location = new Point(829, 569); - buttonMove_Down.Margin = new Padding(3, 4, 3, 4); + buttonMove_Down.Location = new Point(725, 427); buttonMove_Down.Name = "buttonMove_Down"; - buttonMove_Down.Size = new Size(40, 47); + buttonMove_Down.Size = new Size(35, 35); buttonMove_Down.TabIndex = 1; buttonMove_Down.UseVisualStyleBackColor = true; buttonMove_Down.Click += ButtonMove_Click; @@ -68,10 +67,9 @@ buttonMove_Left.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; buttonMove_Left.BackgroundImage = Properties.Resources.ArrowLeft; buttonMove_Left.BackgroundImageLayout = ImageLayout.Stretch; - buttonMove_Left.Location = new Point(782, 569); - buttonMove_Left.Margin = new Padding(3, 4, 3, 4); + buttonMove_Left.Location = new Point(684, 427); buttonMove_Left.Name = "buttonMove_Left"; - buttonMove_Left.Size = new Size(40, 47); + buttonMove_Left.Size = new Size(35, 35); buttonMove_Left.TabIndex = 2; buttonMove_Left.UseVisualStyleBackColor = true; buttonMove_Left.Click += ButtonMove_Click; @@ -81,10 +79,9 @@ buttonMove_Up.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; buttonMove_Up.BackgroundImage = Properties.Resources.ArrowUp; buttonMove_Up.BackgroundImageLayout = ImageLayout.Stretch; - buttonMove_Up.Location = new Point(829, 515); - buttonMove_Up.Margin = new Padding(3, 4, 3, 4); + buttonMove_Up.Location = new Point(725, 386); buttonMove_Up.Name = "buttonMove_Up"; - buttonMove_Up.Size = new Size(40, 47); + buttonMove_Up.Size = new Size(35, 35); buttonMove_Up.TabIndex = 3; buttonMove_Up.UseVisualStyleBackColor = true; buttonMove_Up.Click += ButtonMove_Click; @@ -94,36 +91,45 @@ pictureBoxMonorail.Dock = DockStyle.Fill; pictureBoxMonorail.ImageLocation = ""; pictureBoxMonorail.Location = new Point(0, 0); - pictureBoxMonorail.Margin = new Padding(3, 4, 3, 4); pictureBoxMonorail.Name = "pictureBoxMonorail"; - pictureBoxMonorail.Size = new Size(929, 632); + pictureBoxMonorail.Size = new Size(813, 474); pictureBoxMonorail.TabIndex = 4; pictureBoxMonorail.TabStop = false; // + // buttonCreateModernMonorail + // + buttonCreateModernMonorail.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + buttonCreateModernMonorail.Location = new Point(12, 439); + buttonCreateModernMonorail.Name = "buttonCreateModernMonorail"; + buttonCreateModernMonorail.Size = new Size(220, 23); + buttonCreateModernMonorail.TabIndex = 5; + buttonCreateModernMonorail.Text = "Создать современный монорельс"; + buttonCreateModernMonorail.UseVisualStyleBackColor = true; + buttonCreateModernMonorail.Click += ButtonCreateModernMonorail_Click; + // // buttonCreateMonorail // buttonCreateMonorail.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; - buttonCreateMonorail.Location = new Point(14, 585); - buttonCreateMonorail.Margin = new Padding(3, 4, 3, 4); + buttonCreateMonorail.Location = new Point(238, 439); buttonCreateMonorail.Name = "buttonCreateMonorail"; - buttonCreateMonorail.Size = new Size(86, 31); - buttonCreateMonorail.TabIndex = 5; - buttonCreateMonorail.Text = "Создать"; + buttonCreateMonorail.Size = new Size(194, 23); + buttonCreateMonorail.TabIndex = 6; + buttonCreateMonorail.Text = "Создать монорельс"; buttonCreateMonorail.UseVisualStyleBackColor = true; - buttonCreateMonorail.Click += ButtonCreateMonorail_Click; + buttonCreateMonorail.Click += buttonCreateMonorail_Click; // // FormMonorail // - AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleMode = AutoScaleMode.Font; - ClientSize = new Size(929, 632); + ClientSize = new Size(813, 474); Controls.Add(buttonCreateMonorail); + Controls.Add(buttonCreateModernMonorail); Controls.Add(buttonMove_Up); Controls.Add(buttonMove_Left); Controls.Add(buttonMove_Down); Controls.Add(buttonMove_Right); Controls.Add(pictureBoxMonorail); - Margin = new Padding(3, 4, 3, 4); Name = "FormMonorail"; Text = "Монорельс"; ((System.ComponentModel.ISupportInitialize)pictureBoxMonorail).EndInit(); @@ -137,6 +143,7 @@ private Button buttonMove_Left; private Button buttonMove_Up; private PictureBox pictureBoxMonorail; + private Button buttonCreateModernMonorail; private Button buttonCreateMonorail; } } \ No newline at end of file diff --git a/ProjectSportCar/FormMonorail.cs b/ProjectSportCar/FormMonorail.cs index 0f6ac8e..b86977a 100644 --- a/ProjectSportCar/FormMonorail.cs +++ b/ProjectSportCar/FormMonorail.cs @@ -1,10 +1,10 @@ -using ProjectMonorail.Scripts.Locomative; +using ProjectMonorail.Scripts.Monorail.Drawnings; namespace ProjectMonorail { public partial class FormMonorail : Form { - private DrawMonorail? _drawningMonorail; + private DrawingMonorail? _drawningMonorail; public FormMonorail() { @@ -14,7 +14,7 @@ namespace ProjectMonorail /// <summary> /// Метод для прорисовки автомобиля /// </summary> - private void Draw () + private void Draw() { if (_drawningMonorail == null) return; @@ -24,26 +24,6 @@ namespace ProjectMonorail pictureBoxMonorail.Image = bmp; } - /// <summary> - /// Обработка нажатия кнопки "Создать" - /// </summary> - private void ButtonCreateMonorail_Click(object sender, EventArgs e) - { - Random random = new(); - _drawningMonorail = new DrawMonorail(); - - _drawningMonorail.Initialization(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))); - - _drawningMonorail.SetPictureSize(pictureBoxMonorail.Width, pictureBoxMonorail.Height); - _drawningMonorail.SetPosition(random.Next(10, 100), random.Next(10, 100)); - - Draw(); - } - /// <summary> /// Обработка кнопок перемешения /// </summary> @@ -53,23 +33,74 @@ namespace ProjectMonorail string name = ((Button)sender).Name ?? string.Empty; bool result = false; - switch(name) + switch (name) { case "buttonMove_Up": - result = _drawningMonorail.MoveTransport(Scripts.DirectionType.Up); + result = _drawningMonorail.MoveTransport(DirectionType.Up); break; case "buttonMove_Down": - result = _drawningMonorail.MoveTransport(Scripts.DirectionType.Down); + result = _drawningMonorail.MoveTransport(DirectionType.Down); break; case "buttonMove_Right": - result = _drawningMonorail.MoveTransport(Scripts.DirectionType.Right); + result = _drawningMonorail.MoveTransport(DirectionType.Right); break; case "buttonMove_Left": - result = _drawningMonorail.MoveTransport(Scripts.DirectionType.Left); + result = _drawningMonorail.MoveTransport(DirectionType.Left); break; } if (result) Draw(); } + + /// <summary> + /// Создание объекта класса-перемещения + /// </summary> + /// <param name="type">Тип создоваемого объекта</param> + private void CreateObject(string type) + { + Random random = new(); + + switch (type) + { + case nameof(DrawingMonorail): + _drawningMonorail = new DrawingMonorail(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(DrawingModernMonorail): + bool randomTrack = Convert.ToBoolean(random.Next(0, 2)); + _drawningMonorail = new DrawingModernMonorail(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)), + randomTrack, + (randomTrack? Convert.ToBoolean(random.Next(0, 2)) : true)); + break; + default: + return; + } + + _drawningMonorail.SetPictureSize(pictureBoxMonorail.Width, pictureBoxMonorail.Height); + _drawningMonorail.SetPosition(random.Next(10, 100), random.Next(10, 100)); + + Draw(); + } + + /// <summary> + /// Обработка нажатия кнопки "Создать современный монорельс" + /// </summary> + private void ButtonCreateModernMonorail_Click(object sender, EventArgs e) + { + CreateObject(nameof(DrawingModernMonorail)); + } + + /// <summary> + /// Обработка нажатия кнопки "Создать монорельс" + /// </summary> + /// <param name="sender"></param> + /// <param name="e"></param> + private void buttonCreateMonorail_Click(object sender, EventArgs e) + { + CreateObject(nameof(DrawingMonorail)); + } + } } diff --git a/ProjectSportCar/Scripts/DirectionType.cs b/ProjectSportCar/Scripts/Monorail/Drawnings/DirectionType.cs similarity index 89% rename from ProjectSportCar/Scripts/DirectionType.cs rename to ProjectSportCar/Scripts/Monorail/Drawnings/DirectionType.cs index b3c2733..1851297 100644 --- a/ProjectSportCar/Scripts/DirectionType.cs +++ b/ProjectSportCar/Scripts/Monorail/Drawnings/DirectionType.cs @@ -1,4 +1,4 @@ -namespace ProjectMonorail.Scripts +namespace ProjectMonorail.Scripts.Monorail.Drawnings { /// <summary> /// Направление перемещения diff --git a/ProjectSportCar/Scripts/Monorail/Drawnings/DrawingModernMonorail.cs b/ProjectSportCar/Scripts/Monorail/Drawnings/DrawingModernMonorail.cs new file mode 100644 index 0000000..be1faf7 --- /dev/null +++ b/ProjectSportCar/Scripts/Monorail/Drawnings/DrawingModernMonorail.cs @@ -0,0 +1,137 @@ +using System.Drawing.Drawing2D; +using ProjectMonorail.Scripts.Monorail.Entities; + +namespace ProjectMonorail.Scripts.Monorail.Drawnings +{ + /// <summary> + /// Класс, отвечающий за прорисовку и перемещение объекта-сущности + /// </summary> + public class DrawingModernMonorail : DrawingMonorail + { + /// <summary> + /// Конструктор + /// </summary> + /// <param name="speed">Скорость</param> + /// <param name="weight">Вес</param> + /// <param name="bodyColor">Основной цвет</param> + /// <param name="additionalColor">Дополнительный цвет</param> + /// <param name="monorailTrack">Признак наличия монорельсового пути</param> + /// <param name="cabin">Признак наличия кабиныы</param> + public DrawingModernMonorail(int speed, double weight, Color bodyColor, Color additionalColor, bool monorailTrack, bool cabin) : base((cabin ? 170 : 90), 40) + { + EntityMonorail = new EntityModernMonorail(speed, weight, bodyColor, additionalColor, monorailTrack, cabin); + } + + /// <summary> + /// Прорисовка объекта + /// </summary> + public override void DrawTransport(Graphics g) + { + if (EntityMonorail == null || EntityMonorail is not EntityModernMonorail entityModernMonorail || !_startPositionX.HasValue || !_startPositionY.HasValue) return; + + Pen pen_Body = new Pen(EntityMonorail.BodyColor, 1.5f); + Pen pen_Additional = new Pen(entityModernMonorail.AdditionalColor, 1.5f); + + Brush brush_Body = new SolidBrush(EntityMonorail.BodyColor); + Brush brush_Additional = new SolidBrush(entityModernMonorail.AdditionalColor); + + + base.DrawTransport(g); + + //Перекраска окон первого монорельса + g.DrawRectangle(pen_Additional, _startPositionX.Value + 14, _startPositionY.Value + 2, 5, 6); + g.DrawRectangle(pen_Additional, _startPositionX.Value + 21, _startPositionY.Value + 2, 5, 6); + g.DrawRectangle(pen_Additional, _startPositionX.Value + 70, _startPositionY.Value + 2, 5, 6); + + if (entityModernMonorail.MonorailTrack) + { + if (entityModernMonorail.Cabin) + { + g.FillRectangle(brush_Additional, _startPositionX.Value, _startPositionY.Value + 35, 170, 5); + } + else + { + g.FillRectangle(brush_Additional, _startPositionX.Value, _startPositionY.Value + 35, 86, 5); + } + } + + //Колеса + Brush brush_White = new SolidBrush(Color.White); + g.FillEllipse(brush_White, _startPositionX.Value + 10, _startPositionY.Value + 30, 10, 10); + g.DrawEllipse(pen_Body, _startPositionX.Value + 10, _startPositionY.Value + 30, 10, 10); + + g.FillEllipse(brush_White, _startPositionX.Value + 25, _startPositionY.Value + 30, 10, 10); + g.DrawEllipse(pen_Body, _startPositionX.Value + 25, _startPositionY.Value + 30, 10, 10); + + g.FillEllipse(brush_White, _startPositionX.Value + 65, _startPositionY.Value + 30, 10, 10); + g.DrawEllipse(pen_Body, _startPositionX.Value + 65, _startPositionY.Value + 30, 10, 10); + + g.FillEllipse(brush_White, _startPositionX.Value + 50, _startPositionY.Value + 30, 10, 10); + g.DrawEllipse(pen_Body, _startPositionX.Value + 50, _startPositionY.Value + 30, 10, 10); + + + if (entityModernMonorail.Cabin) + { + int offset = 170; + //Кузов монорельса + GraphicsPath pointsMonorailBody_RightBody = new GraphicsPath(); + pointsMonorailBody_RightBody.AddLine(_startPositionX.Value - 8 + offset, _startPositionY.Value + 10, _startPositionX.Value - 13 + offset, _startPositionY.Value); + pointsMonorailBody_RightBody.AddLine(_startPositionX.Value - 13 + offset, _startPositionY.Value, _startPositionX.Value - 80 + offset, _startPositionY.Value); + pointsMonorailBody_RightBody.AddLine(_startPositionX.Value - 80 + offset, _startPositionY.Value, _startPositionX.Value - 80 + offset, _startPositionY.Value + 25); + pointsMonorailBody_RightBody.AddLine(_startPositionX.Value - 80 + offset, _startPositionY.Value + 25, _startPositionX.Value - 8 + offset, _startPositionY.Value + 25); + pointsMonorailBody_RightBody.AddLine(_startPositionX.Value - 8 + offset, _startPositionY.Value + 25, _startPositionX.Value - 8 + offset, _startPositionY.Value + 10); + g.DrawLine(pen_Body, _startPositionX.Value - 8 + offset, _startPositionY.Value + 10, _startPositionX.Value - 30 + offset, _startPositionY.Value + 10); + g.DrawLine(pen_Body, _startPositionX.Value - 39 + offset, _startPositionY.Value + 10, _startPositionX.Value - 80 + offset, _startPositionY.Value + 10); + g.DrawPath(pen_Body, pointsMonorailBody_RightBody); + + //Дверь + g.DrawRectangle(pen_Body, _startPositionX.Value - 39 + offset, _startPositionY.Value + 5, 9, 15); + + //Окна + g.DrawRectangle(pen_Additional, _startPositionX.Value - 20 + offset, _startPositionY.Value + 2, 5, 6); + g.DrawRectangle(pen_Additional, _startPositionX.Value - 27 + offset, _startPositionY.Value + 2, 5, 6); + g.DrawRectangle(pen_Additional, _startPositionX.Value - 76 + offset, _startPositionY.Value + 2, 5, 6); + + //Связка монорельса + g.FillRectangle(brush_Body, _startPositionX.Value - 87 + offset, _startPositionY.Value + 2, 7, 22); + + //Нижняя часть монорельса + PointF[] pointsLowerPartMonorail_2_LeftSide = new PointF[8]; + pointsLowerPartMonorail_2_LeftSide[0] = new PointF(_startPositionX.Value + offset, _startPositionY.Value + 30); + pointsLowerPartMonorail_2_LeftSide[1] = new PointF(_startPositionX.Value - 8 + offset, _startPositionY.Value + 25); + pointsLowerPartMonorail_2_LeftSide[2] = new PointF(_startPositionX.Value - 72 + offset, _startPositionY.Value + 25); + pointsLowerPartMonorail_2_LeftSide[3] = new PointF(_startPositionX.Value - 36 + offset, _startPositionY.Value + 25); + pointsLowerPartMonorail_2_LeftSide[4] = new PointF(_startPositionX.Value - 36 + offset, _startPositionY.Value + 32); + pointsLowerPartMonorail_2_LeftSide[5] = new PointF(_startPositionX.Value - 15 + offset, _startPositionY.Value + 32); + pointsLowerPartMonorail_2_LeftSide[6] = new PointF(_startPositionX.Value - 15 + offset, _startPositionY.Value + 35); + pointsLowerPartMonorail_2_LeftSide[7] = new PointF(_startPositionX.Value + offset, _startPositionY.Value + 32); + g.FillPolygon(brush_Body, pointsLowerPartMonorail_2_LeftSide); + + PointF[] pointsLowerPartMonorail_2_RightSide = new PointF[7]; + pointsLowerPartMonorail_2_RightSide[0] = new PointF(_startPositionX.Value - 86 + offset, _startPositionY.Value + 30); + pointsLowerPartMonorail_2_RightSide[1] = new PointF(_startPositionX.Value - 80 + offset, _startPositionY.Value + 25); + pointsLowerPartMonorail_2_RightSide[2] = new PointF(_startPositionX.Value - 50 + offset, _startPositionY.Value + 25); + pointsLowerPartMonorail_2_RightSide[3] = new PointF(_startPositionX.Value - 50 + offset, _startPositionY.Value + 32); + pointsLowerPartMonorail_2_RightSide[4] = new PointF(_startPositionX.Value - 69 + offset, _startPositionY.Value + 32); + pointsLowerPartMonorail_2_RightSide[5] = new PointF(_startPositionX.Value - 79 + offset, _startPositionY.Value + 35); + pointsLowerPartMonorail_2_RightSide[6] = new PointF(_startPositionX.Value - 86 + offset, _startPositionY.Value + 32); + g.FillPolygon(brush_Body, pointsLowerPartMonorail_2_RightSide); + g.FillRectangle(brush_Body, _startPositionX.Value - 80 + offset, _startPositionY.Value + 25, 70, 3); + + + //Колеса + g.FillEllipse(brush_White, _startPositionX.Value - 20 + offset, _startPositionY.Value + 30, 10, 10); + g.DrawEllipse(pen_Body, _startPositionX.Value - 20 + offset, _startPositionY.Value + 30, 10, 10); + + g.FillEllipse(brush_White, _startPositionX.Value - 35 + offset, _startPositionY.Value + 30, 10, 10); + g.DrawEllipse(pen_Body, _startPositionX.Value - 35 + offset, _startPositionY.Value + 30, 10, 10); + + g.FillEllipse(brush_White, _startPositionX.Value - 75 + offset, _startPositionY.Value + 30, 10, 10); + g.DrawEllipse(pen_Body, _startPositionX.Value - 75 + offset, _startPositionY.Value + 30, 10, 10); + + g.FillEllipse(brush_White, _startPositionX.Value - 60 + offset, _startPositionY.Value + 30, 10, 10); + g.DrawEllipse(pen_Body, _startPositionX.Value - 60 + offset, _startPositionY.Value + 30, 10, 10); + } + } + } +} diff --git a/ProjectSportCar/Scripts/Monorail/DrawMonorail.cs b/ProjectSportCar/Scripts/Monorail/Drawnings/DrawingMonorail.cs similarity index 57% rename from ProjectSportCar/Scripts/Monorail/DrawMonorail.cs rename to ProjectSportCar/Scripts/Monorail/Drawnings/DrawingMonorail.cs index 5e26aba..aadc1e3 100644 --- a/ProjectSportCar/Scripts/Monorail/DrawMonorail.cs +++ b/ProjectSportCar/Scripts/Monorail/Drawnings/DrawingMonorail.cs @@ -1,13 +1,17 @@ -using System.Drawing.Drawing2D; +using ProjectMonorail.Scripts.Monorail.Entities; +using System.Drawing.Drawing2D; -namespace ProjectMonorail.Scripts.Locomative +namespace ProjectMonorail.Scripts.Monorail.Drawnings { - public class DrawMonorail + /// <summary> + /// Класс, отвечающий за прорисовку и перемещение базового объекта-сущности + /// </summary> + public class DrawingMonorail { /// <summary> /// Класс-сущность /// </summary> - public EntityMonorail? EntityMonorail { get; private set; } + public EntityMonorail? EntityMonorail { get; protected set; } /// <summary> /// Ширина окна @@ -20,45 +24,55 @@ namespace ProjectMonorail.Scripts.Locomative private int? _pictureHeight; /// <summary> - /// Левая координата прорисовки автомобиля + /// Левая координата прорисовки монорельса /// </summary> - private int? _startPositionX; + protected int? _startPositionX; /// <summary> - /// Верхняя кооридната прорисовки автомобиля + /// Верхняя кооридната прорисовки монорельса /// </summary> - private int? _startPositionY; + protected int? _startPositionY; /// <summary> - /// Ширина прорисовки автомобиля + /// Ширина прорисовки монорельса /// </summary> - private int _drawningMonorailWidth = 110; + private readonly int _drawningMonorailWidth = 90; /// <summary> - /// Высота прорисовки автомобиля + /// Высота прорисовки монорельса /// </summary> private readonly int _drawningMonorailHeight = 40; - /// <summary> - /// Инициализация свойств - /// </summary> - /// <param name="speed">Скорость</param> - /// <param name="weight">Вес</param> - /// <param name="bodyColor">Основной цвет</param> - /// <param name="additionalColor">Дополнительный цвет</param> - /// <param name="monorailTrack">Признак наличия монорельсового пути</param> - /// <param name="cabin">Признак наличия кабиныы</param> - public void Initialization(int speed, double weight, Color bodyColor, Color additionalColor, bool monorailTrack, bool cabin) + private DrawingMonorail() { - EntityMonorail = new EntityMonorail(); - EntityMonorail.Initialization(speed, weight, bodyColor, additionalColor, monorailTrack, cabin); - _drawningMonorailWidth = cabin ? 170 : 90; _pictureWidth = null; _pictureHeight = null; _startPositionX = null; _startPositionY = null; } + /// <summary> + /// Конструктор + /// </summary> + /// <param name="speed">Скорость</param> + /// <param name="weight">Вес</param> + /// <param name="bodyColor">Основной цвет</param> + public DrawingMonorail(int speed, double weight, Color bodyColor) : this() + { + EntityMonorail = new EntityMonorail(speed, weight, bodyColor); + } + + /// <summary> + /// Конструктор для наследников + /// </summary> + /// <param name="drawningMonorailWidth">Ширина прорисовки монорельса</param> + /// <param name="drawningMonorailHeight">Высота прорисовки монорельса</param> + protected DrawingMonorail(int drawningMonorailWidth, int drawningMonorailHeight) : this() + { + _drawningMonorailWidth = drawningMonorailWidth; + _drawningMonorailHeight = drawningMonorailHeight; + } + /// <summary> /// Установка границ поля /// </summary> @@ -69,7 +83,7 @@ namespace ProjectMonorail.Scripts.Locomative { // TODO проверка, что объект "влезает" в размеры поля // если влезает, сохраняем границы и корректируем позицию объекта, если она была уже установлена - if (_drawningMonorailWidth > width || _drawningMonorailHeight > height) return false; + if (_drawningMonorailWidth > width || _drawningMonorailHeight > height) return false; if (_startPositionX.HasValue && _startPositionY.HasValue) { @@ -164,15 +178,13 @@ namespace ProjectMonorail.Scripts.Locomative /// <summary> /// Прорисовка объекта /// </summary> - public void DrawTransport(Graphics g) + public virtual void DrawTransport(Graphics g) { if (EntityMonorail == null || !_startPositionX.HasValue || !_startPositionY.HasValue) return; Pen pen_Body = new Pen(EntityMonorail.BodyColor, 1.5f); - Pen pen_Additional = new Pen(EntityMonorail.AdditionalColor, 1.5f); Brush brush_Body = new SolidBrush(EntityMonorail.BodyColor); - Brush brush_Additional = new SolidBrush(EntityMonorail.AdditionalColor); //Кузов монорельса @@ -190,9 +202,9 @@ namespace ProjectMonorail.Scripts.Locomative g.DrawRectangle(pen_Body, _startPositionX.Value + 30, _startPositionY.Value + 5, 9, 15); //Окна - g.DrawRectangle(pen_Additional, _startPositionX.Value + 14, _startPositionY.Value + 2, 5, 6); - g.DrawRectangle(pen_Additional, _startPositionX.Value + 21, _startPositionY.Value + 2, 5, 6); - g.DrawRectangle(pen_Additional, _startPositionX.Value + 70, _startPositionY.Value + 2, 5, 6); + g.DrawRectangle(pen_Body, _startPositionX.Value + 14, _startPositionY.Value + 2, 5, 6); + g.DrawRectangle(pen_Body, _startPositionX.Value + 21, _startPositionY.Value + 2, 5, 6); + g.DrawRectangle(pen_Body, _startPositionX.Value + 70, _startPositionY.Value + 2, 5, 6); //Связка монорельса g.FillRectangle(brush_Body, _startPositionX.Value + 80, _startPositionY.Value + 2, 7, 22); @@ -220,18 +232,6 @@ namespace ProjectMonorail.Scripts.Locomative g.FillPolygon(brush_Body, pointsLowerPartMonorail_RightSide); g.FillRectangle(brush_Body, _startPositionX.Value + 8, _startPositionY.Value + 25, 70, 3); - if (EntityMonorail.MonorailTrack) - { - if (EntityMonorail.Cabin) - { - g.FillRectangle(brush_Additional, _startPositionX.Value, _startPositionY.Value + 35, 170, 5); - } - else - { - g.FillRectangle(brush_Additional, _startPositionX.Value, _startPositionY.Value + 35, 86, 5); - } - } - //Колеса Brush brush_White = new SolidBrush(Color.White); g.FillEllipse(brush_White, _startPositionX.Value + 10, _startPositionY.Value + 30, 10, 10); @@ -245,70 +245,6 @@ namespace ProjectMonorail.Scripts.Locomative g.FillEllipse(brush_White, _startPositionX.Value + 50, _startPositionY.Value + 30, 10, 10); g.DrawEllipse(pen_Body, _startPositionX.Value + 50, _startPositionY.Value + 30, 10, 10); - - - if (EntityMonorail.Cabin) - { - int offset = 170; - //Кузов монорельса - GraphicsPath pointsMonorailBody_RightBody = new GraphicsPath(); - pointsMonorailBody_RightBody.AddLine(_startPositionX.Value - 8 + offset, _startPositionY.Value + 10, _startPositionX.Value - 13 + offset, _startPositionY.Value); - pointsMonorailBody_RightBody.AddLine(_startPositionX.Value - 13 + offset, _startPositionY.Value, _startPositionX.Value - 80 + offset, _startPositionY.Value); - pointsMonorailBody_RightBody.AddLine(_startPositionX.Value - 80 + offset, _startPositionY.Value, _startPositionX.Value - 80 + offset, _startPositionY.Value + 25); - pointsMonorailBody_RightBody.AddLine(_startPositionX.Value - 80 + offset, _startPositionY.Value + 25, _startPositionX.Value - 8 + offset, _startPositionY.Value + 25); - pointsMonorailBody_RightBody.AddLine(_startPositionX.Value - 8 + offset, _startPositionY.Value + 25, _startPositionX.Value - 8 + offset, _startPositionY.Value + 10); - g.DrawLine(pen_Body, _startPositionX.Value - 8 + offset, _startPositionY.Value + 10, _startPositionX.Value - 30 + offset, _startPositionY.Value + 10); - g.DrawLine(pen_Body, _startPositionX.Value - 39 + offset, _startPositionY.Value + 10, _startPositionX.Value - 80 + offset, _startPositionY.Value + 10); - g.DrawPath(pen_Body, pointsMonorailBody_RightBody); - - //Дверь - g.DrawRectangle(pen_Body, _startPositionX.Value - 39 + offset, _startPositionY.Value + 5, 9, 15); - - //Окна - g.DrawRectangle(pen_Additional, _startPositionX.Value - 20 + offset, _startPositionY.Value + 2, 5, 6); - g.DrawRectangle(pen_Additional, _startPositionX.Value - 27 + offset, _startPositionY.Value + 2, 5, 6); - g.DrawRectangle(pen_Additional, _startPositionX.Value - 76 + offset, _startPositionY.Value + 2, 5, 6); - - //Связка монорельса - g.FillRectangle(brush_Body, _startPositionX.Value - 87 + offset, _startPositionY.Value + 2, 7, 22); - - //Нижняя часть монорельса - PointF[] pointsLowerPartMonorail_2_LeftSide = new PointF[8]; - pointsLowerPartMonorail_2_LeftSide[0] = new PointF(_startPositionX.Value + offset, _startPositionY.Value + 30); - pointsLowerPartMonorail_2_LeftSide[1] = new PointF(_startPositionX.Value - 8 + offset, _startPositionY.Value + 25); - pointsLowerPartMonorail_2_LeftSide[2] = new PointF(_startPositionX.Value - 72 + offset, _startPositionY.Value + 25); - pointsLowerPartMonorail_2_LeftSide[3] = new PointF(_startPositionX.Value - 36 + offset, _startPositionY.Value + 25); - pointsLowerPartMonorail_2_LeftSide[4] = new PointF(_startPositionX.Value - 36 + offset, _startPositionY.Value + 32); - pointsLowerPartMonorail_2_LeftSide[5] = new PointF(_startPositionX.Value - 15 + offset, _startPositionY.Value + 32); - pointsLowerPartMonorail_2_LeftSide[6] = new PointF(_startPositionX.Value - 15 + offset, _startPositionY.Value + 35); - pointsLowerPartMonorail_2_LeftSide[7] = new PointF(_startPositionX.Value + offset, _startPositionY.Value + 32); - g.FillPolygon(brush_Body, pointsLowerPartMonorail_2_LeftSide); - - PointF[] pointsLowerPartMonorail_2_RightSide = new PointF[7]; - pointsLowerPartMonorail_2_RightSide[0] = new PointF(_startPositionX.Value - 86 + offset, _startPositionY.Value + 30); - pointsLowerPartMonorail_2_RightSide[1] = new PointF(_startPositionX.Value - 80 + offset, _startPositionY.Value + 25); - pointsLowerPartMonorail_2_RightSide[2] = new PointF(_startPositionX.Value - 50 + offset, _startPositionY.Value + 25); - pointsLowerPartMonorail_2_RightSide[3] = new PointF(_startPositionX.Value - 50 + offset, _startPositionY.Value + 32); - pointsLowerPartMonorail_2_RightSide[4] = new PointF(_startPositionX.Value - 69 + offset, _startPositionY.Value + 32); - pointsLowerPartMonorail_2_RightSide[5] = new PointF(_startPositionX.Value - 79 + offset, _startPositionY.Value + 35); - pointsLowerPartMonorail_2_RightSide[6] = new PointF(_startPositionX.Value - 86 + offset, _startPositionY.Value + 32); - g.FillPolygon(brush_Body, pointsLowerPartMonorail_2_RightSide); - g.FillRectangle(brush_Body, _startPositionX.Value - 80 + offset, _startPositionY.Value + 25, 70, 3); - - - //Колеса - g.FillEllipse(brush_White, _startPositionX.Value - 20 + offset, _startPositionY.Value + 30, 10, 10); - g.DrawEllipse(pen_Body, _startPositionX.Value - 20 + offset, _startPositionY.Value + 30, 10, 10); - - g.FillEllipse(brush_White, _startPositionX.Value - 35 + offset, _startPositionY.Value + 30, 10, 10); - g.DrawEllipse(pen_Body, _startPositionX.Value - 35 + offset, _startPositionY.Value + 30, 10, 10); - - g.FillEllipse(brush_White, _startPositionX.Value - 75 + offset, _startPositionY.Value + 30, 10, 10); - g.DrawEllipse(pen_Body, _startPositionX.Value - 75 + offset, _startPositionY.Value + 30, 10, 10); - - g.FillEllipse(brush_White, _startPositionX.Value - 60 + offset, _startPositionY.Value + 30, 10, 10); - g.DrawEllipse(pen_Body, _startPositionX.Value - 60 + offset, _startPositionY.Value + 30, 10, 10); - } } } } diff --git a/ProjectSportCar/Scripts/Monorail/EntityMonorail.cs b/ProjectSportCar/Scripts/Monorail/Entities/EntityModernMonorail.cs similarity index 62% rename from ProjectSportCar/Scripts/Monorail/EntityMonorail.cs rename to ProjectSportCar/Scripts/Monorail/Entities/EntityModernMonorail.cs index b1b500c..2fe635d 100644 --- a/ProjectSportCar/Scripts/Monorail/EntityMonorail.cs +++ b/ProjectSportCar/Scripts/Monorail/Entities/EntityModernMonorail.cs @@ -1,22 +1,10 @@ -namespace ProjectMonorail +namespace ProjectMonorail.Scripts.Monorail.Entities { - public class EntityMonorail + /// <summary> + /// Класс-сущности "Современный монорельс" + /// </summary> + public class EntityModernMonorail : EntityMonorail { - /// <summary> - /// Скорость - /// </summary> - public int Speed { get; private set; } - - /// <summary> - /// Вес - /// </summary> - public double Weight { get; private set; } - - /// <summary> - /// Основной цвет - /// </summary> - public Color BodyColor { get; private set; } - /// <summary> /// Дополнительный цвет (для опциональных элементов) /// </summary> @@ -32,11 +20,6 @@ /// </summary> public bool Cabin { get; private set; } - /// <summary> - /// Шаг перемещения автомобиля - /// </summary> - public double Step => Speed * 100 / Weight; - /// <summary> /// Инициальзация полей объекта-класса спортивного автомобиля /// </summary> @@ -46,11 +29,8 @@ /// <param name="additionalColor">Дополнительный цвет</param> /// <param name="monorailTrack">Признак наличия монорельсового пути</param> /// <param name="cabin">Признак наличия кабины</param> - public void Initialization(int speed, double weight, Color bodyColor, Color additionalColor, bool monorailTrack, bool cabin) + public EntityModernMonorail(int speed, double weight, Color bodyColor, Color additionalColor, bool monorailTrack, bool cabin) : base(speed, weight, bodyColor) { - Speed = speed; - Weight = weight; - BodyColor = bodyColor; AdditionalColor = additionalColor; MonorailTrack = monorailTrack; Cabin = cabin; diff --git a/ProjectSportCar/Scripts/Monorail/Entities/EntityMonorail.cs b/ProjectSportCar/Scripts/Monorail/Entities/EntityMonorail.cs new file mode 100644 index 0000000..62591c7 --- /dev/null +++ b/ProjectSportCar/Scripts/Monorail/Entities/EntityMonorail.cs @@ -0,0 +1,41 @@ +namespace ProjectMonorail.Scripts.Monorail.Entities +{ + /// <summary> + /// Класс-сущности "Монорельс" + /// </summary> + public class EntityMonorail + { + /// <summary> + /// Скорость + /// </summary> + public int Speed { get; private set; } + + /// <summary> + /// Вес + /// </summary> + public double Weight { get; private set; } + + /// <summary> + /// Основной цвет + /// </summary> + public Color BodyColor { get; private set; } + + /// <summary> + /// Шаг перемещения автомобиля + /// </summary> + public double Step => Speed * 100 / Weight; + + /// <summary> + /// Конструктор сущности + /// </summary> + /// <param name="speed">Скорость</param> + /// <param name="weight">Вес автомобиля</param> + /// <param name="bodyColor">Основной цвет</param> + public EntityMonorail(int speed, double weight, Color bodyColor) + { + Speed = speed; + Weight = weight; + BodyColor = bodyColor; + } + } +} -- 2.25.1 From fd7eae9fa3acce458e04c5ef29936919fdb1ea8a Mon Sep 17 00:00:00 2001 From: LESN1K <vl-taras73@mail.ru> Date: Sat, 9 Mar 2024 20:05:26 +0400 Subject: [PATCH 2/3] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BD=D0=B0=D0=B7=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=20=D0=BF=D0=B0=D0=BF=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../FormMonorail.Designer.cs | 0 .../FormMonorail.cs | 0 .../FormMonorail.resx | 0 {ProjectSportCar => ProjectMonorail}/Program.cs | 0 .../ProjectMonorail.csproj | 0 .../ProjectMonorail.sln | 0 .../Properties/Resources.Designer.cs | 0 .../Properties/Resources.resx | 0 .../Resources/Arrows/ArrowDown.png | Bin .../Resources/Arrows/ArrowLeft.png | Bin .../Resources/Arrows/ArrowRight.png | Bin .../Resources/Arrows/ArrowUp.png | Bin .../Resources/Reference/Monorail.png | Bin .../Scripts/Monorail/Drawnings/DirectionType.cs | 0 .../Monorail/Drawnings/DrawingModernMonorail.cs | 0 .../Scripts/Monorail/Drawnings/DrawingMonorail.cs | 0 .../Monorail/Entities/EntityModernMonorail.cs | 0 .../Scripts/Monorail/Entities/EntityMonorail.cs | 0 18 files changed, 0 insertions(+), 0 deletions(-) rename {ProjectSportCar => ProjectMonorail}/FormMonorail.Designer.cs (100%) rename {ProjectSportCar => ProjectMonorail}/FormMonorail.cs (100%) rename {ProjectSportCar => ProjectMonorail}/FormMonorail.resx (100%) rename {ProjectSportCar => ProjectMonorail}/Program.cs (100%) rename {ProjectSportCar => ProjectMonorail}/ProjectMonorail.csproj (100%) rename {ProjectSportCar => ProjectMonorail}/ProjectMonorail.sln (100%) rename {ProjectSportCar => ProjectMonorail}/Properties/Resources.Designer.cs (100%) rename {ProjectSportCar => ProjectMonorail}/Properties/Resources.resx (100%) rename {ProjectSportCar => ProjectMonorail}/Resources/Arrows/ArrowDown.png (100%) rename {ProjectSportCar => ProjectMonorail}/Resources/Arrows/ArrowLeft.png (100%) rename {ProjectSportCar => ProjectMonorail}/Resources/Arrows/ArrowRight.png (100%) rename {ProjectSportCar => ProjectMonorail}/Resources/Arrows/ArrowUp.png (100%) rename {ProjectSportCar => ProjectMonorail}/Resources/Reference/Monorail.png (100%) rename {ProjectSportCar => ProjectMonorail}/Scripts/Monorail/Drawnings/DirectionType.cs (100%) rename {ProjectSportCar => ProjectMonorail}/Scripts/Monorail/Drawnings/DrawingModernMonorail.cs (100%) rename {ProjectSportCar => ProjectMonorail}/Scripts/Monorail/Drawnings/DrawingMonorail.cs (100%) rename {ProjectSportCar => ProjectMonorail}/Scripts/Monorail/Entities/EntityModernMonorail.cs (100%) rename {ProjectSportCar => ProjectMonorail}/Scripts/Monorail/Entities/EntityMonorail.cs (100%) diff --git a/ProjectSportCar/FormMonorail.Designer.cs b/ProjectMonorail/FormMonorail.Designer.cs similarity index 100% rename from ProjectSportCar/FormMonorail.Designer.cs rename to ProjectMonorail/FormMonorail.Designer.cs diff --git a/ProjectSportCar/FormMonorail.cs b/ProjectMonorail/FormMonorail.cs similarity index 100% rename from ProjectSportCar/FormMonorail.cs rename to ProjectMonorail/FormMonorail.cs diff --git a/ProjectSportCar/FormMonorail.resx b/ProjectMonorail/FormMonorail.resx similarity index 100% rename from ProjectSportCar/FormMonorail.resx rename to ProjectMonorail/FormMonorail.resx diff --git a/ProjectSportCar/Program.cs b/ProjectMonorail/Program.cs similarity index 100% rename from ProjectSportCar/Program.cs rename to ProjectMonorail/Program.cs diff --git a/ProjectSportCar/ProjectMonorail.csproj b/ProjectMonorail/ProjectMonorail.csproj similarity index 100% rename from ProjectSportCar/ProjectMonorail.csproj rename to ProjectMonorail/ProjectMonorail.csproj diff --git a/ProjectSportCar/ProjectMonorail.sln b/ProjectMonorail/ProjectMonorail.sln similarity index 100% rename from ProjectSportCar/ProjectMonorail.sln rename to ProjectMonorail/ProjectMonorail.sln diff --git a/ProjectSportCar/Properties/Resources.Designer.cs b/ProjectMonorail/Properties/Resources.Designer.cs similarity index 100% rename from ProjectSportCar/Properties/Resources.Designer.cs rename to ProjectMonorail/Properties/Resources.Designer.cs diff --git a/ProjectSportCar/Properties/Resources.resx b/ProjectMonorail/Properties/Resources.resx similarity index 100% rename from ProjectSportCar/Properties/Resources.resx rename to ProjectMonorail/Properties/Resources.resx diff --git a/ProjectSportCar/Resources/Arrows/ArrowDown.png b/ProjectMonorail/Resources/Arrows/ArrowDown.png similarity index 100% rename from ProjectSportCar/Resources/Arrows/ArrowDown.png rename to ProjectMonorail/Resources/Arrows/ArrowDown.png diff --git a/ProjectSportCar/Resources/Arrows/ArrowLeft.png b/ProjectMonorail/Resources/Arrows/ArrowLeft.png similarity index 100% rename from ProjectSportCar/Resources/Arrows/ArrowLeft.png rename to ProjectMonorail/Resources/Arrows/ArrowLeft.png diff --git a/ProjectSportCar/Resources/Arrows/ArrowRight.png b/ProjectMonorail/Resources/Arrows/ArrowRight.png similarity index 100% rename from ProjectSportCar/Resources/Arrows/ArrowRight.png rename to ProjectMonorail/Resources/Arrows/ArrowRight.png diff --git a/ProjectSportCar/Resources/Arrows/ArrowUp.png b/ProjectMonorail/Resources/Arrows/ArrowUp.png similarity index 100% rename from ProjectSportCar/Resources/Arrows/ArrowUp.png rename to ProjectMonorail/Resources/Arrows/ArrowUp.png diff --git a/ProjectSportCar/Resources/Reference/Monorail.png b/ProjectMonorail/Resources/Reference/Monorail.png similarity index 100% rename from ProjectSportCar/Resources/Reference/Monorail.png rename to ProjectMonorail/Resources/Reference/Monorail.png diff --git a/ProjectSportCar/Scripts/Monorail/Drawnings/DirectionType.cs b/ProjectMonorail/Scripts/Monorail/Drawnings/DirectionType.cs similarity index 100% rename from ProjectSportCar/Scripts/Monorail/Drawnings/DirectionType.cs rename to ProjectMonorail/Scripts/Monorail/Drawnings/DirectionType.cs diff --git a/ProjectSportCar/Scripts/Monorail/Drawnings/DrawingModernMonorail.cs b/ProjectMonorail/Scripts/Monorail/Drawnings/DrawingModernMonorail.cs similarity index 100% rename from ProjectSportCar/Scripts/Monorail/Drawnings/DrawingModernMonorail.cs rename to ProjectMonorail/Scripts/Monorail/Drawnings/DrawingModernMonorail.cs diff --git a/ProjectSportCar/Scripts/Monorail/Drawnings/DrawingMonorail.cs b/ProjectMonorail/Scripts/Monorail/Drawnings/DrawingMonorail.cs similarity index 100% rename from ProjectSportCar/Scripts/Monorail/Drawnings/DrawingMonorail.cs rename to ProjectMonorail/Scripts/Monorail/Drawnings/DrawingMonorail.cs diff --git a/ProjectSportCar/Scripts/Monorail/Entities/EntityModernMonorail.cs b/ProjectMonorail/Scripts/Monorail/Entities/EntityModernMonorail.cs similarity index 100% rename from ProjectSportCar/Scripts/Monorail/Entities/EntityModernMonorail.cs rename to ProjectMonorail/Scripts/Monorail/Entities/EntityModernMonorail.cs diff --git a/ProjectSportCar/Scripts/Monorail/Entities/EntityMonorail.cs b/ProjectMonorail/Scripts/Monorail/Entities/EntityMonorail.cs similarity index 100% rename from ProjectSportCar/Scripts/Monorail/Entities/EntityMonorail.cs rename to ProjectMonorail/Scripts/Monorail/Entities/EntityMonorail.cs -- 2.25.1 From ec5f6e654ca1771c98791e65af77d8037b8938a6 Mon Sep 17 00:00:00 2001 From: LESN1K <vl-taras73@mail.ru> Date: Sun, 10 Mar 2024 13:50:57 +0400 Subject: [PATCH 3/3] =?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=81=D1=82=D1=80=D0=B0=D1=82=D0=B5=D0=B3?= =?UTF-8?q?=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ProjectMonorail/FormMonorail.Designer.cs | 26 ++++ ProjectMonorail/FormMonorail.cs | 59 +++++++- .../Monorail/Drawnings/DirectionType.cs | 5 + .../Monorail/Drawnings/DrawingMonorail.cs | 23 +++ .../MovementStrategy/AbstractStrategy.cs | 133 ++++++++++++++++++ .../MovementStrategy/IMoveableObject.cs | 25 ++++ .../Monorail/MovementStrategy/MoveToCenter.cs | 52 +++++++ .../MovementStrategy/MoveToRightDownBorder.cs | 36 +++++ .../MovementStrategy/MoveableMonorail.cs | 61 ++++++++ .../MovementStrategy/MovementDirection.cs | 29 ++++ .../MovementStrategy/ObjectParameters.cs | 74 ++++++++++ .../MovementStrategy/StrategyStatus.cs | 23 +++ 12 files changed, 545 insertions(+), 1 deletion(-) create mode 100644 ProjectMonorail/Scripts/Monorail/MovementStrategy/AbstractStrategy.cs create mode 100644 ProjectMonorail/Scripts/Monorail/MovementStrategy/IMoveableObject.cs create mode 100644 ProjectMonorail/Scripts/Monorail/MovementStrategy/MoveToCenter.cs create mode 100644 ProjectMonorail/Scripts/Monorail/MovementStrategy/MoveToRightDownBorder.cs create mode 100644 ProjectMonorail/Scripts/Monorail/MovementStrategy/MoveableMonorail.cs create mode 100644 ProjectMonorail/Scripts/Monorail/MovementStrategy/MovementDirection.cs create mode 100644 ProjectMonorail/Scripts/Monorail/MovementStrategy/ObjectParameters.cs create mode 100644 ProjectMonorail/Scripts/Monorail/MovementStrategy/StrategyStatus.cs diff --git a/ProjectMonorail/FormMonorail.Designer.cs b/ProjectMonorail/FormMonorail.Designer.cs index 61d6b4e..2f42482 100644 --- a/ProjectMonorail/FormMonorail.Designer.cs +++ b/ProjectMonorail/FormMonorail.Designer.cs @@ -35,6 +35,8 @@ pictureBoxMonorail = new PictureBox(); buttonCreateModernMonorail = new Button(); buttonCreateMonorail = new Button(); + comboBoxStrategy = new ComboBox(); + buttonStrategyStep = new Button(); ((System.ComponentModel.ISupportInitialize)pictureBoxMonorail).BeginInit(); SuspendLayout(); // @@ -118,11 +120,33 @@ buttonCreateMonorail.UseVisualStyleBackColor = true; buttonCreateMonorail.Click += buttonCreateMonorail_Click; // + // comboBoxStrategy + // + comboBoxStrategy.DropDownStyle = ComboBoxStyle.DropDownList; + comboBoxStrategy.FormattingEnabled = true; + comboBoxStrategy.Items.AddRange(new object[] { "К центру", "К краю" }); + comboBoxStrategy.Location = new Point(680, 12); + comboBoxStrategy.Name = "comboBoxStrategy"; + comboBoxStrategy.Size = new Size(121, 23); + comboBoxStrategy.TabIndex = 7; + // + // buttonStrategyStep + // + buttonStrategyStep.Location = new Point(704, 41); + buttonStrategyStep.Name = "buttonStrategyStep"; + buttonStrategyStep.Size = new Size(75, 23); + buttonStrategyStep.TabIndex = 8; + buttonStrategyStep.Text = "Шаг"; + buttonStrategyStep.UseVisualStyleBackColor = true; + buttonStrategyStep.Click += buttonStrategyStep_Click; + // // FormMonorail // AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleMode = AutoScaleMode.Font; ClientSize = new Size(813, 474); + Controls.Add(buttonStrategyStep); + Controls.Add(comboBoxStrategy); Controls.Add(buttonCreateMonorail); Controls.Add(buttonCreateModernMonorail); Controls.Add(buttonMove_Up); @@ -145,5 +169,7 @@ private PictureBox pictureBoxMonorail; private Button buttonCreateModernMonorail; private Button buttonCreateMonorail; + private ComboBox comboBoxStrategy; + private Button buttonStrategyStep; } } \ No newline at end of file diff --git a/ProjectMonorail/FormMonorail.cs b/ProjectMonorail/FormMonorail.cs index b86977a..63dc9c2 100644 --- a/ProjectMonorail/FormMonorail.cs +++ b/ProjectMonorail/FormMonorail.cs @@ -1,14 +1,30 @@ using ProjectMonorail.Scripts.Monorail.Drawnings; +using ProjectMonorail.Scripts.Monorail.MovementStrategy; namespace ProjectMonorail { + /// <summary> + /// Форма работы с объектом "Монорельс" + /// </summary> public partial class FormMonorail : Form { + /// <summary> + /// Поле-объект для прорисовки объекта + /// </summary> private DrawingMonorail? _drawningMonorail; + /// <summary> + /// Стратегия перемещения + /// </summary> + private AbstractStrategy? _strategy; + + /// <summary> + /// Конструктор формы + /// </summary> public FormMonorail() { InitializeComponent(); + _strategy = null; } /// <summary> @@ -72,7 +88,7 @@ namespace ProjectMonorail 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)), randomTrack, - (randomTrack? Convert.ToBoolean(random.Next(0, 2)) : true)); + (randomTrack ? Convert.ToBoolean(random.Next(0, 2)) : true)); break; default: return; @@ -80,6 +96,8 @@ namespace ProjectMonorail _drawningMonorail.SetPictureSize(pictureBoxMonorail.Width, pictureBoxMonorail.Height); _drawningMonorail.SetPosition(random.Next(10, 100), random.Next(10, 100)); + _strategy = null; + comboBoxStrategy.Enabled = true; Draw(); } @@ -102,5 +120,44 @@ namespace ProjectMonorail CreateObject(nameof(DrawingMonorail)); } + /// <summary> + /// + /// </summary> + /// <param name="sender"></param> + /// <param name="e"></param> + private void buttonStrategyStep_Click(object sender, EventArgs e) + { + if (_drawningMonorail == null) return; + + if (comboBoxStrategy.Enabled) + { + _strategy = comboBoxStrategy.SelectedIndex switch + { + 0 => new MoveToCenter(), + 1 => new MoveToRightDownBorder(), + _ => null, + }; + if (_strategy == null) + { + return; + } + _strategy.SetData(new MoveableMonorail(_drawningMonorail), pictureBoxMonorail.Width, pictureBoxMonorail.Height); + } + + if (_strategy == null) + { + return; + } + + comboBoxStrategy.Enabled = false; + _strategy.MakeStep(); + Draw(); + + if (_strategy.GetStatus() == StrategyStatus.Finish) + { + comboBoxStrategy.Enabled = true; + _strategy = null; + } + } } } diff --git a/ProjectMonorail/Scripts/Monorail/Drawnings/DirectionType.cs b/ProjectMonorail/Scripts/Monorail/Drawnings/DirectionType.cs index 1851297..867b820 100644 --- a/ProjectMonorail/Scripts/Monorail/Drawnings/DirectionType.cs +++ b/ProjectMonorail/Scripts/Monorail/Drawnings/DirectionType.cs @@ -5,6 +5,11 @@ /// </summary> public enum DirectionType { + /// <summary> + /// Неизвестное направление + /// </summary> + Unknow = -1, + /// <summary> /// Вверх /// </summary> diff --git a/ProjectMonorail/Scripts/Monorail/Drawnings/DrawingMonorail.cs b/ProjectMonorail/Scripts/Monorail/Drawnings/DrawingMonorail.cs index aadc1e3..11ef869 100644 --- a/ProjectMonorail/Scripts/Monorail/Drawnings/DrawingMonorail.cs +++ b/ProjectMonorail/Scripts/Monorail/Drawnings/DrawingMonorail.cs @@ -43,6 +43,29 @@ namespace ProjectMonorail.Scripts.Monorail.Drawnings /// </summary> private readonly int _drawningMonorailHeight = 40; + /// <summary> + /// Координаты X объекта + /// </summary> + public int? GetPositionX => _startPositionX; + + /// <summary> + /// Координаты Y объекта + /// </summary> + public int? GetPositionY => _startPositionY; + + /// <summary> + /// Ширина объекта + /// </summary> + public int GetWidth => _drawningMonorailWidth; + + /// <summary> + /// Высота объекта + /// </summary> + public int GetHeight => _drawningMonorailHeight; + + /// <summary> + /// Пустой конструкотор + /// </summary> private DrawingMonorail() { _pictureWidth = null; diff --git a/ProjectMonorail/Scripts/Monorail/MovementStrategy/AbstractStrategy.cs b/ProjectMonorail/Scripts/Monorail/MovementStrategy/AbstractStrategy.cs new file mode 100644 index 0000000..76249ae --- /dev/null +++ b/ProjectMonorail/Scripts/Monorail/MovementStrategy/AbstractStrategy.cs @@ -0,0 +1,133 @@ +namespace ProjectMonorail.Scripts.Monorail.MovementStrategy +{ + public abstract class AbstractStrategy + { + /// <summary> + /// Перемещаемый объект + /// </summary> + private IMoveableObject? _moveableObject; + + /// <summary> + /// Статус перемещения + /// </summary> + private StrategyStatus _state = StrategyStatus.NotInit; + + /// <summary> + /// Ширина поля + /// </summary> + protected int FieldWidth { get; private set; } + + /// <summary> + /// Высота поля + /// </summary> + protected int FieldHeight { get; private set; } + + /// <summary> + /// Статус перемещения + /// </summary> + public StrategyStatus GetStatus() { return _state; } + + /// <summary> + /// Установка данных + /// </summary> + /// <param name="moveableObject">Перемещаемый объект</param> + /// <param name="width">Ширина поля</param> + /// <param name="height">Высота поля</param> + public void SetData(IMoveableObject moveableObject, int width, int height) + { + if (moveableObject == null) + { + _state = StrategyStatus.NotInit; + return; + } + _state = StrategyStatus.InProgress; + _moveableObject = moveableObject; + FieldWidth = width; + FieldHeight = height; + } + + /// <summary> + /// Шаг перемещения + /// </summary> + public void MakeStep() + { + if (_state != StrategyStatus.InProgress) + { + return; + } + if (IsTargetDestinaion()) + { + _state = StrategyStatus.Finish; + return; + } + MoveToTarget(); + } + + /// <summary> + /// Перемещение влево + /// </summary> + /// <returns>Результат перемещения (true - удалось переместиться, false - неудача)</returns> + protected bool MoveLeft() => MoveTo(MovementDirection.Left); + + /// <summary> + /// Перемещение вправо + /// </summary> + /// <returns>Результат перемещения (true - удалось переместиться, false - неудача)</returns> + protected bool MoveRight() => MoveTo(MovementDirection.Right); + + /// <summary> + /// Перемещение вверх + /// </summary> + /// <returns>Результат перемещения (true - удалось переместиться, false - неудача)</returns> + protected bool MoveUp() => MoveTo(MovementDirection.Up); + + /// <summary> + /// Перемещение вниз + /// </summary> + /// <returns>Результат перемещения (true - удалось переместиться, false - неудача)</returns> + protected bool MoveDown() => MoveTo(MovementDirection.Down); + + /// <summary> + /// Параметры объекта + /// </summary> + protected ObjectParameters? GetObjectParameters => _moveableObject?.GetObjectPosition; + + /// <summary> + /// Шаг объекта + /// </summary> + /// <returns></returns> + protected int? GetStep() + { + if (_state != StrategyStatus.InProgress) + { + return null; + } + return _moveableObject?.GetStep; + } + + /// <summary> + /// Перемещение к цели + /// </summary> + protected abstract void MoveToTarget(); + + /// <summary> + /// Достигнута ли цель + /// </summary> + /// <returns></returns> + protected abstract bool IsTargetDestinaion(); + + /// <summary> + /// Попытка перемещения в требуемом направлении + /// </summary> + /// <param name="movementDirection">Направление</param> + /// <returns>Результат попытки (true - удалось переместиться, false - неудача)</returns> + private bool MoveTo(MovementDirection movementDirection) + { + if (_state != StrategyStatus.InProgress) + { + return false; + } + return _moveableObject?.TryMoveObject(movementDirection) ?? false; + } + } +} diff --git a/ProjectMonorail/Scripts/Monorail/MovementStrategy/IMoveableObject.cs b/ProjectMonorail/Scripts/Monorail/MovementStrategy/IMoveableObject.cs new file mode 100644 index 0000000..40f7999 --- /dev/null +++ b/ProjectMonorail/Scripts/Monorail/MovementStrategy/IMoveableObject.cs @@ -0,0 +1,25 @@ +namespace ProjectMonorail.Scripts.Monorail.MovementStrategy +{ + /// <summary> + /// Интерфейс для работы с перемещаемым объектом + /// </summary>I + public interface IMoveableObject + { + /// <summary> + /// Получение координаты объекта + /// </summary> + ObjectParameters? GetObjectPosition { get; } + + /// <summary> + /// Шаг объекта + /// </summary> + int GetStep { get; } + + /// <summary> + /// Попытка переместить объект в указанном направлении + /// </summary> + /// <param name="direction">Направление</param> + /// <returns>true - объект перемещен, false - перемещение невозможно</returns> + bool TryMoveObject(MovementDirection direction); + } +} diff --git a/ProjectMonorail/Scripts/Monorail/MovementStrategy/MoveToCenter.cs b/ProjectMonorail/Scripts/Monorail/MovementStrategy/MoveToCenter.cs new file mode 100644 index 0000000..17d522f --- /dev/null +++ b/ProjectMonorail/Scripts/Monorail/MovementStrategy/MoveToCenter.cs @@ -0,0 +1,52 @@ +namespace ProjectMonorail.Scripts.Monorail.MovementStrategy +{ + /// <summary> + /// Стратегия перемещения объекта в центр экрана + /// </summary> + public class MoveToCenter : AbstractStrategy + { + protected override bool IsTargetDestinaion() + { + ObjectParameters? objParams = GetObjectParameters; + if (objParams == null) return false; + + return objParams.ObjectMiddleHorizontal - GetStep() <= FieldWidth / 2 + && objParams.ObjectMiddleHorizontal + GetStep() >= FieldWidth / 2 + && objParams.ObjectMiddleVertical - GetStep() <= FieldHeight / 2 + && objParams.ObjectMiddleVertical + GetStep() >= FieldHeight / 2; + } + + + protected override void MoveToTarget() + { + ObjectParameters? objParams = GetObjectParameters; + if (objParams == null) return; + + int diffX = objParams.ObjectMiddleHorizontal - FieldWidth / 2; + if (Math.Abs(diffX) > GetStep()) + { + if (diffX > 0) + { + MoveLeft(); + } + else + { + MoveRight(); + } + } + + int diffY = objParams.ObjectMiddleVertical - FieldHeight / 2; + if (Math.Abs(diffY) > GetStep()) + { + if (diffY > 0) + { + MoveUp(); + } + else + { + MoveDown(); + } + } + } + } +} diff --git a/ProjectMonorail/Scripts/Monorail/MovementStrategy/MoveToRightDownBorder.cs b/ProjectMonorail/Scripts/Monorail/MovementStrategy/MoveToRightDownBorder.cs new file mode 100644 index 0000000..849a140 --- /dev/null +++ b/ProjectMonorail/Scripts/Monorail/MovementStrategy/MoveToRightDownBorder.cs @@ -0,0 +1,36 @@ +namespace ProjectMonorail.Scripts.Monorail.MovementStrategy +{ + /// <summary> + /// Стратегия перемещения объекта в левый нижний угл экрана + /// </summary> + public class MoveToRightDownBorder : AbstractStrategy + { + protected override bool IsTargetDestinaion() + { + ObjectParameters? objParams = GetObjectParameters; + if (objParams == null) return false; + + return objParams.RightBorder + GetStep() >= FieldWidth + && objParams.DownBorder + GetStep() >= FieldHeight; + } + + protected override void MoveToTarget() + { + ObjectParameters? objParams = GetObjectParameters; + if (objParams == null) return; + + int diffX = objParams.LeftBorder - FieldWidth; + if (Math.Abs(diffX) > GetStep()) + { + MoveRight(); + } + + int diffY = objParams.DownBorder - FieldHeight; + if (Math.Abs(diffY) > GetStep()) + { + MoveDown(); + } + } + + } +} diff --git a/ProjectMonorail/Scripts/Monorail/MovementStrategy/MoveableMonorail.cs b/ProjectMonorail/Scripts/Monorail/MovementStrategy/MoveableMonorail.cs new file mode 100644 index 0000000..47c4e8e --- /dev/null +++ b/ProjectMonorail/Scripts/Monorail/MovementStrategy/MoveableMonorail.cs @@ -0,0 +1,61 @@ +using ProjectMonorail.Scripts.Monorail.Drawnings; + +namespace ProjectMonorail.Scripts.Monorail.MovementStrategy +{ + /// <summary> + /// Класс-реализация IMoveableObject с использованием DrawingMonorail + /// </summary> + public class MoveableMonorail : IMoveableObject + { + /// <summary> + /// Поле-объект класса DrawingMonorail или его наследника + /// </summary> + private readonly DrawingMonorail _drawingMonorail; + + /// <summary> + /// Конструктор + /// </summary> + /// <param name="drawingMonorail">Объект класса DrawingMonorail</param> + public MoveableMonorail(DrawingMonorail drawingMonorail) + { + _drawingMonorail = drawingMonorail; + } + + public ObjectParameters? GetObjectPosition + { + get + { + if (_drawingMonorail == null || _drawingMonorail.EntityMonorail == null || !_drawingMonorail.GetPositionX.HasValue || !_drawingMonorail.GetPositionY.HasValue) return null; + return new ObjectParameters(_drawingMonorail.GetPositionX.Value, _drawingMonorail.GetPositionY.Value, _drawingMonorail.GetWidth, _drawingMonorail.GetHeight); + } + } + + public int GetStep => (int)(_drawingMonorail?.EntityMonorail?.Step ?? 0); + + public bool TryMoveObject(MovementDirection direction) + { + if (_drawingMonorail == null || _drawingMonorail.EntityMonorail == null) + { + return false; + } + return _drawingMonorail.MoveTransport(GetDirectionType(direction)); + } + + /// <summary> + /// Конвертация из MovementDirection в DirectionType + /// </summary> + /// <param name="direction">MovementDirection</param> + /// <returns>DirectionType</returns> + private static DirectionType GetDirectionType(MovementDirection direction) + { + return direction switch + { + MovementDirection.Left => DirectionType.Left, + MovementDirection.Right => DirectionType.Right, + MovementDirection.Up => DirectionType.Up, + MovementDirection.Down => DirectionType.Down, + _ => DirectionType.Unknow, + }; + } + } +} diff --git a/ProjectMonorail/Scripts/Monorail/MovementStrategy/MovementDirection.cs b/ProjectMonorail/Scripts/Monorail/MovementStrategy/MovementDirection.cs new file mode 100644 index 0000000..c03904b --- /dev/null +++ b/ProjectMonorail/Scripts/Monorail/MovementStrategy/MovementDirection.cs @@ -0,0 +1,29 @@ +namespace ProjectMonorail.Scripts.Monorail.MovementStrategy +{ + /// <summary> + /// Направление перемещения + /// </summary> + public enum MovementDirection + { + /// <summary> + /// Вверх + /// </summary> + Up = 1, + + /// <summary> + /// Вниз + /// </summary> + Down = 2, + + /// <summary> + /// Влево + /// </summary> + Left = 3, + + /// <summary> + /// Вправо + /// </summary> + Right = 4 + + } +} diff --git a/ProjectMonorail/Scripts/Monorail/MovementStrategy/ObjectParameters.cs b/ProjectMonorail/Scripts/Monorail/MovementStrategy/ObjectParameters.cs new file mode 100644 index 0000000..fb8f09b --- /dev/null +++ b/ProjectMonorail/Scripts/Monorail/MovementStrategy/ObjectParameters.cs @@ -0,0 +1,74 @@ +namespace ProjectMonorail.Scripts.Monorail.MovementStrategy +{ + /// <summary> + /// Параметры-координаты объекта + /// </summary> + public class ObjectParameters + { + /// <summary> + /// Координата X + /// </summary> + private readonly int _x; + + /// <summary> + /// Координата Y + /// </summary> + private readonly int _y; + + /// <summary> + /// Ширина объекта + /// </summary> + private readonly int _width; + + /// <summary> + /// Высота объекта + /// </summary> + private readonly int _height; + + /// <summary> + /// Левая граница + /// </summary> + public int LeftBorder => _x; + + /// <summary> + /// Верхняя граница + /// </summary> + public int TopBorder => _y; + + /// <summary> + /// Правая граница + /// </summary> + public int RightBorder => _x + _width; + + /// <summary> + /// Нижняя граница + /// </summary> + public int DownBorder => _y + _height; + + /// <summary> + /// Середина объекта + /// </summary> + public int ObjectMiddleHorizontal => _x + _width / 2; + + /// <summary> + /// Середина объекта + /// </summary> + public int ObjectMiddleVertical => _y + _height / 2; + + /// <summary> + /// Конструктор + /// </summary> + /// <param name="x">Координата X</param> + /// <param name="y">Координата Y</param> + /// <param name="width">Ширина объекта</param> + /// <param name="height">Высота объекта</param> + public ObjectParameters(int x, int y, int width, int height) + { + _x = x; + _y = y; + _width = width; + _height = height; + } + + } +} diff --git a/ProjectMonorail/Scripts/Monorail/MovementStrategy/StrategyStatus.cs b/ProjectMonorail/Scripts/Monorail/MovementStrategy/StrategyStatus.cs new file mode 100644 index 0000000..c6a9558 --- /dev/null +++ b/ProjectMonorail/Scripts/Monorail/MovementStrategy/StrategyStatus.cs @@ -0,0 +1,23 @@ +namespace ProjectMonorail.Scripts.Monorail.MovementStrategy +{ + /// <summary> + /// Статус выполнения операции перемещения + /// </summary> + public enum StrategyStatus + { + /// <summary> + /// Все готово к началу + /// </summary> + NotInit, + + /// <summary> + /// Выполняется + /// </summary> + InProgress, + + /// <summary> + /// Завершено + /// </summary> + Finish + } +} \ No newline at end of file -- 2.25.1