diff --git a/ProjectSportCar/Form1.Designer.cs b/ProjectSportCar/Form1.Designer.cs deleted file mode 100644 index f731df8..0000000 --- a/ProjectSportCar/Form1.Designer.cs +++ /dev/null @@ -1,39 +0,0 @@ -namespace ProjectSportCar -{ - partial class Form1 - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(800, 450); - this.Text = "Form1"; - } - - #endregion - } -} \ No newline at end of file diff --git a/ProjectSportCar/Form1.cs b/ProjectSportCar/Form1.cs deleted file mode 100644 index e71d17a..0000000 --- a/ProjectSportCar/Form1.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace ProjectSportCar -{ - public partial class Form1 : Form - { - public Form1() - { - InitializeComponent(); - } - } -} \ No newline at end of file diff --git a/ProjectSportCar/FormMonorail.Designer.cs b/ProjectSportCar/FormMonorail.Designer.cs new file mode 100644 index 0000000..1aa372d --- /dev/null +++ b/ProjectSportCar/FormMonorail.Designer.cs @@ -0,0 +1,135 @@ +namespace ProjectMonorail +{ + partial class FormMonorail + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + buttonMove_Right = new Button(); + buttonMove_Down = new Button(); + buttonMove_Left = new Button(); + buttonMove_Up = new Button(); + pictureBoxMonorail = new PictureBox(); + buttonCreateMonorail = new Button(); + ((System.ComponentModel.ISupportInitialize)pictureBoxMonorail).BeginInit(); + SuspendLayout(); + // + // buttonMove_Right + // + buttonMove_Right.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + buttonMove_Right.BackgroundImage = Properties.Resources.ArrowRight; + buttonMove_Right.BackgroundImageLayout = ImageLayout.Stretch; + buttonMove_Right.Location = new Point(766, 427); + buttonMove_Right.Name = "buttonMove_Right"; + buttonMove_Right.Size = new Size(35, 35); + buttonMove_Right.TabIndex = 0; + buttonMove_Right.UseVisualStyleBackColor = true; + buttonMove_Right.Click += ButtonMove_Click; + // + // buttonMove_Down + // + buttonMove_Down.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + buttonMove_Down.BackgroundImage = Properties.Resources.ArrowDown; + buttonMove_Down.BackgroundImageLayout = ImageLayout.Stretch; + buttonMove_Down.Location = new Point(725, 427); + buttonMove_Down.Name = "buttonMove_Down"; + buttonMove_Down.Size = new Size(35, 35); + buttonMove_Down.TabIndex = 1; + buttonMove_Down.UseVisualStyleBackColor = true; + buttonMove_Down.Click += ButtonMove_Click; + // + // buttonMove_Left + // + buttonMove_Left.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + buttonMove_Left.BackgroundImage = Properties.Resources.ArrowLeft; + buttonMove_Left.BackgroundImageLayout = ImageLayout.Stretch; + buttonMove_Left.Location = new Point(684, 427); + buttonMove_Left.Name = "buttonMove_Left"; + buttonMove_Left.Size = new Size(35, 35); + buttonMove_Left.TabIndex = 2; + buttonMove_Left.UseVisualStyleBackColor = true; + buttonMove_Left.Click += ButtonMove_Click; + // + // buttonMove_Up + // + buttonMove_Up.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + buttonMove_Up.BackgroundImage = Properties.Resources.ArrowUp; + buttonMove_Up.BackgroundImageLayout = ImageLayout.Stretch; + buttonMove_Up.Location = new Point(725, 386); + buttonMove_Up.Name = "buttonMove_Up"; + buttonMove_Up.Size = new Size(35, 35); + buttonMove_Up.TabIndex = 3; + buttonMove_Up.UseVisualStyleBackColor = true; + buttonMove_Up.Click += ButtonMove_Click; + // + // pictureBoxMonorail + // + pictureBoxMonorail.Dock = DockStyle.Fill; + pictureBoxMonorail.ImageLocation = ""; + pictureBoxMonorail.Location = new Point(0, 0); + pictureBoxMonorail.Name = "pictureBoxMonorail"; + pictureBoxMonorail.Size = new Size(813, 474); + pictureBoxMonorail.TabIndex = 4; + pictureBoxMonorail.TabStop = false; + // + // buttonCreateMonorail + // + buttonCreateMonorail.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + buttonCreateMonorail.Location = new Point(12, 439); + buttonCreateMonorail.Name = "buttonCreateMonorail"; + buttonCreateMonorail.Size = new Size(75, 23); + buttonCreateMonorail.TabIndex = 5; + buttonCreateMonorail.Text = "Создать"; + buttonCreateMonorail.UseVisualStyleBackColor = true; + buttonCreateMonorail.Click += ButtonCreateMonorail_Click; + // + // FormMonorail + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(813, 474); + Controls.Add(buttonCreateMonorail); + Controls.Add(buttonMove_Up); + Controls.Add(buttonMove_Left); + Controls.Add(buttonMove_Down); + Controls.Add(buttonMove_Right); + Controls.Add(pictureBoxMonorail); + Name = "FormMonorail"; + Text = "P"; + ((System.ComponentModel.ISupportInitialize)pictureBoxMonorail).EndInit(); + ResumeLayout(false); + } + + #endregion + + private Button buttonMove_Right; + private Button buttonMove_Down; + private Button buttonMove_Left; + private Button buttonMove_Up; + private PictureBox pictureBoxMonorail; + private Button buttonCreateMonorail; + } +} \ No newline at end of file diff --git a/ProjectSportCar/FormMonorail.cs b/ProjectSportCar/FormMonorail.cs new file mode 100644 index 0000000..0f6ac8e --- /dev/null +++ b/ProjectSportCar/FormMonorail.cs @@ -0,0 +1,75 @@ +using ProjectMonorail.Scripts.Locomative; + +namespace ProjectMonorail +{ + public partial class FormMonorail : Form + { + private DrawMonorail? _drawningMonorail; + + public FormMonorail() + { + InitializeComponent(); + } + + /// + /// Метод для прорисовки автомобиля + /// + private void Draw () + { + if (_drawningMonorail == null) return; + + Bitmap bmp = new(pictureBoxMonorail.Width, pictureBoxMonorail.Height); + Graphics gr = Graphics.FromImage(bmp); + _drawningMonorail.DrawTransport(gr); + pictureBoxMonorail.Image = bmp; + } + + /// + /// Обработка нажатия кнопки "Создать" + /// + 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(); + } + + /// + /// Обработка кнопок перемешения + /// + private void ButtonMove_Click(object sender, EventArgs e) + { + if (_drawningMonorail == null) return; + + string name = ((Button)sender).Name ?? string.Empty; + bool result = false; + switch(name) + { + case "buttonMove_Up": + result = _drawningMonorail.MoveTransport(Scripts.DirectionType.Up); + break; + case "buttonMove_Down": + result = _drawningMonorail.MoveTransport(Scripts.DirectionType.Down); + break; + case "buttonMove_Right": + result = _drawningMonorail.MoveTransport(Scripts.DirectionType.Right); + break; + case "buttonMove_Left": + result = _drawningMonorail.MoveTransport(Scripts.DirectionType.Left); + break; + } + + if (result) Draw(); + } + } +} diff --git a/ProjectSportCar/Form1.resx b/ProjectSportCar/FormMonorail.resx similarity index 93% rename from ProjectSportCar/Form1.resx rename to ProjectSportCar/FormMonorail.resx index 1af7de1..af32865 100644 --- a/ProjectSportCar/Form1.resx +++ b/ProjectSportCar/FormMonorail.resx @@ -1,17 +1,17 @@  - diff --git a/ProjectSportCar/Program.cs b/ProjectSportCar/Program.cs index 8103843..3f68a06 100644 --- a/ProjectSportCar/Program.cs +++ b/ProjectSportCar/Program.cs @@ -1,4 +1,4 @@ -namespace ProjectSportCar +namespace ProjectMonorail { internal static class Program { @@ -11,7 +11,7 @@ namespace ProjectSportCar // To customize application configuration such as set high DPI settings or default font, // see https://aka.ms/applicationconfiguration. ApplicationConfiguration.Initialize(); - Application.Run(new Form1()); + Application.Run(new FormMonorail()); } } } \ No newline at end of file diff --git a/ProjectSportCar/ProjectMonorail.csproj b/ProjectSportCar/ProjectMonorail.csproj new file mode 100644 index 0000000..e733a7f --- /dev/null +++ b/ProjectSportCar/ProjectMonorail.csproj @@ -0,0 +1,22 @@ + + + WinExe + net8.0-windows + enable + true + enable + + + + True + True + Resources.resx + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + \ No newline at end of file diff --git a/ProjectSportCar/ProjectSportCar.sln b/ProjectSportCar/ProjectMonorail.sln similarity index 88% rename from ProjectSportCar/ProjectSportCar.sln rename to ProjectSportCar/ProjectMonorail.sln index 5ab3f4b..4d95dbd 100644 --- a/ProjectSportCar/ProjectSportCar.sln +++ b/ProjectSportCar/ProjectMonorail.sln @@ -1,9 +1,8 @@ - Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.0.32002.185 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProjectSportCar", "ProjectSportCar.csproj", "{C1C061F8-FA8C-4805-AE55-2DABEB1E86B7}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ProjectMonorail", "ProjectMonorail.csproj", "{C1C061F8-FA8C-4805-AE55-2DABEB1E86B7}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/ProjectSportCar/ProjectSportCar.csproj b/ProjectSportCar/ProjectSportCar.csproj deleted file mode 100644 index b57c89e..0000000 --- a/ProjectSportCar/ProjectSportCar.csproj +++ /dev/null @@ -1,11 +0,0 @@ - - - - WinExe - net6.0-windows - enable - true - enable - - - \ No newline at end of file diff --git a/ProjectSportCar/Properties/Resources.Designer.cs b/ProjectSportCar/Properties/Resources.Designer.cs new file mode 100644 index 0000000..7fca072 --- /dev/null +++ b/ProjectSportCar/Properties/Resources.Designer.cs @@ -0,0 +1,103 @@ +//------------------------------------------------------------------------------ +// +// Этот код создан программой. +// Исполняемая версия:4.0.30319.42000 +// +// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае +// повторной генерации кода. +// +//------------------------------------------------------------------------------ + +namespace ProjectMonorail.Properties { + using System; + + + /// + /// Класс ресурса со строгой типизацией для поиска локализованных строк и т.д. + /// + // Этот класс создан автоматически классом StronglyTypedResourceBuilder + // с помощью такого средства, как ResGen или Visual Studio. + // Чтобы добавить или удалить член, измените файл .ResX и снова запустите ResGen + // с параметром /str или перестройте свой проект VS. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Возвращает кэшированный экземпляр ResourceManager, использованный этим классом. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ProjectMonorail.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Перезаписывает свойство CurrentUICulture текущего потока для всех + /// обращений к ресурсу с помощью этого класса ресурса со строгой типизацией. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap ArrowDown { + get { + object obj = ResourceManager.GetObject("ArrowDown", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap ArrowLeft { + get { + object obj = ResourceManager.GetObject("ArrowLeft", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap ArrowRight { + get { + object obj = ResourceManager.GetObject("ArrowRight", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap ArrowUp { + get { + object obj = ResourceManager.GetObject("ArrowUp", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/ProjectSportCar/Properties/Resources.resx b/ProjectSportCar/Properties/Resources.resx new file mode 100644 index 0000000..3104535 --- /dev/null +++ b/ProjectSportCar/Properties/Resources.resx @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\Arrows\ArrowDown.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Arrows\ArrowLeft.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Arrows\ArrowRight.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Arrows\ArrowUp.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/ProjectSportCar/Resources/Arrows/ArrowDown.png b/ProjectSportCar/Resources/Arrows/ArrowDown.png new file mode 100644 index 0000000..0eed5eb Binary files /dev/null and b/ProjectSportCar/Resources/Arrows/ArrowDown.png differ diff --git a/ProjectSportCar/Resources/Arrows/ArrowLeft.png b/ProjectSportCar/Resources/Arrows/ArrowLeft.png new file mode 100644 index 0000000..3d3663e Binary files /dev/null and b/ProjectSportCar/Resources/Arrows/ArrowLeft.png differ diff --git a/ProjectSportCar/Resources/Arrows/ArrowRight.png b/ProjectSportCar/Resources/Arrows/ArrowRight.png new file mode 100644 index 0000000..cc7aedf Binary files /dev/null and b/ProjectSportCar/Resources/Arrows/ArrowRight.png differ diff --git a/ProjectSportCar/Resources/Arrows/ArrowUp.png b/ProjectSportCar/Resources/Arrows/ArrowUp.png new file mode 100644 index 0000000..e165f9c Binary files /dev/null and b/ProjectSportCar/Resources/Arrows/ArrowUp.png differ diff --git a/ProjectSportCar/Resources/Reference/Monorail.png b/ProjectSportCar/Resources/Reference/Monorail.png new file mode 100644 index 0000000..d313e40 Binary files /dev/null and b/ProjectSportCar/Resources/Reference/Monorail.png differ diff --git a/ProjectSportCar/Scripts/DirectionType.cs b/ProjectSportCar/Scripts/DirectionType.cs new file mode 100644 index 0000000..b3c2733 --- /dev/null +++ b/ProjectSportCar/Scripts/DirectionType.cs @@ -0,0 +1,28 @@ +namespace ProjectMonorail.Scripts +{ + /// + /// Направление перемещения + /// + public enum DirectionType + { + /// + /// Вверх + /// + Up = 1, + + /// + /// Вниз + /// + Down = 2, + + /// + /// Влево + /// + Left = 3, + + /// + /// Вправо + /// + Right = 4 + } +} diff --git a/ProjectSportCar/Scripts/Monorail/DrawMonorail.cs b/ProjectSportCar/Scripts/Monorail/DrawMonorail.cs new file mode 100644 index 0000000..33557ce --- /dev/null +++ b/ProjectSportCar/Scripts/Monorail/DrawMonorail.cs @@ -0,0 +1,302 @@ +using System.Drawing.Drawing2D; + +namespace ProjectMonorail.Scripts.Locomative +{ + public class DrawMonorail + { + /// + /// Класс-сущность + /// + public EntityMonorail? EntityMonorail { get; private set; } + + /// + /// Ширина окна + /// + private int? _pictureWidth; + + /// + /// Высота окна + /// + private int? _pictureHeight; + + /// + /// Левая координата прорисовки автомобиля + /// + private int? _startPositionX; + + /// + /// Верхняя кооридната прорисовки автомобиля + /// + private int? _startPositionY; + + /// + /// Ширина прорисовки автомобиля + /// + private int _drawningMonorailWidth = 110; + + /// + /// Высота прорисовки автомобиля + /// + private readonly int _drawningMonorailHeight = 40; + + /// + /// Инициализация свойств + /// + /// Скорость + /// Вес + /// Основной цвет + /// Дополнительный цвет + /// Признак наличия монорельсового пути + /// Признак наличия кабиныы + public void Initialization(int speed, double weight, Color bodyColor, Color additionalColor, bool monorailTrack, bool cabin) + { + EntityMonorail = new EntityMonorail(); + EntityMonorail.Initialization(speed, weight, bodyColor, additionalColor, monorailTrack, cabin); + _drawningMonorailWidth = cabin ? 170 : 90; + _pictureWidth = null; + _pictureHeight = null; + _startPositionX = null; + _startPositionY = null; + } + + /// + /// Установка границ поля + /// + /// Ширина поля + /// Высота поля + /// true - границы заданы, false - проверка не пройдена, нельзя разместить объект в этих размерах + public bool SetPictureSize(int width, int height) + { + // TODO проверка, что объект "влезает" в размеры поля + // если влезает, сохраняем границы и корректируем позицию объекта, если она была уже установлена + if (_drawningMonorailWidth > width || _drawningMonorailHeight > height) return false; + + _pictureWidth = width; + _pictureHeight = height; + return true; + } + + /// + /// Установка позиции + /// + /// Координата X + /// Координата Y + public void SetPosition(int x, int y) + { + if (!_pictureHeight.HasValue || !_pictureWidth.HasValue) return; + + // TODO если при установке объекта в эти координаты, он будет "выходить" за границы формы + // то надо изменить координаты, чтобы он оставался в этих границах + + if (x + _drawningMonorailWidth > _pictureWidth.Value || x < 0) + { + Random random = new(); + _startPositionX = random.Next(0, _pictureWidth.Value - _drawningMonorailWidth); + } + else + { + _startPositionX = x; + } + + if (y + _drawningMonorailHeight > _pictureHeight.Value || y < 0) + { + Random random = new(); + _startPositionY = random.Next(0, _pictureHeight.Value - _drawningMonorailHeight); + } + else + { + _startPositionY = y; + } + } + + /// + /// Изменение направления перемещения + /// + /// Направление + /// true - перемещене выполнено, false - перемещение невозможно + public bool MoveTransport(DirectionType direction) + { + if (EntityMonorail == null || !_startPositionX.HasValue || !_startPositionY.HasValue) return false; + + switch (direction) + { + case DirectionType.Left: + if (_startPositionX.Value - EntityMonorail.Step > 0) + { + _startPositionX -= (int)EntityMonorail.Step; + } + return true; + case DirectionType.Up: + if (_startPositionY.Value - EntityMonorail.Step > 0) + { + _startPositionY -= (int)EntityMonorail.Step; + } + return true; + case DirectionType.Right: + if (_startPositionX.Value + EntityMonorail.Step + _drawningMonorailWidth < _pictureWidth) + { + _startPositionX += (int)EntityMonorail.Step; + } + return true; + case DirectionType.Down: + if (_startPositionY.Value + EntityMonorail.Step + _drawningMonorailHeight < _pictureHeight) + { + _startPositionY += (int)EntityMonorail.Step; + } + return true; + default: + return false; + } + } + + /// + /// Прорисовка объекта + /// + public 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); + + + //Кузов монорельса + GraphicsPath pointsMonorailBody_LeftBody = new GraphicsPath(); + pointsMonorailBody_LeftBody.AddLine(_startPositionX.Value + 8, _startPositionY.Value + 10, _startPositionX.Value + 13, _startPositionY.Value); + pointsMonorailBody_LeftBody.AddLine(_startPositionX.Value + 13, _startPositionY.Value, _startPositionX.Value + 80, _startPositionY.Value); + pointsMonorailBody_LeftBody.AddLine(_startPositionX.Value + 80, _startPositionY.Value, _startPositionX.Value + 80, _startPositionY.Value + 25); + pointsMonorailBody_LeftBody.AddLine(_startPositionX.Value + 80, _startPositionY.Value + 25, _startPositionX.Value + 8, _startPositionY.Value + 25); + pointsMonorailBody_LeftBody.AddLine(_startPositionX.Value + 8, _startPositionY.Value + 25, _startPositionX.Value + 8, _startPositionY.Value + 10); + g.DrawLine(pen_Body, _startPositionX.Value + 8, _startPositionY.Value + 10, _startPositionX.Value + 30, _startPositionY.Value + 10); + g.DrawLine(pen_Body, _startPositionX.Value + 39, _startPositionY.Value + 10, _startPositionX.Value + 80, _startPositionY.Value + 10); + g.DrawPath(pen_Body, pointsMonorailBody_LeftBody); + + //Дверь + 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.FillRectangle(brush_Body, _startPositionX.Value + 80, _startPositionY.Value + 2, 7, 22); + + //Нижняя часть монорельса + PointF[] pointsLowerPartMonorail_LeftSide = new PointF[8]; + pointsLowerPartMonorail_LeftSide[0] = new PointF(_startPositionX.Value, _startPositionY.Value + 30); + pointsLowerPartMonorail_LeftSide[1] = new PointF(_startPositionX.Value + 8, _startPositionY.Value + 25); + pointsLowerPartMonorail_LeftSide[2] = new PointF(_startPositionX.Value + 72, _startPositionY.Value + 25); + pointsLowerPartMonorail_LeftSide[3] = new PointF(_startPositionX.Value + 36, _startPositionY.Value + 25); + pointsLowerPartMonorail_LeftSide[4] = new PointF(_startPositionX.Value + 36, _startPositionY.Value + 32); + pointsLowerPartMonorail_LeftSide[5] = new PointF(_startPositionX.Value + 15, _startPositionY.Value + 32); + pointsLowerPartMonorail_LeftSide[6] = new PointF(_startPositionX.Value + 15, _startPositionY.Value + 35); + pointsLowerPartMonorail_LeftSide[7] = new PointF(_startPositionX.Value, _startPositionY.Value + 32); + g.FillPolygon(brush_Body, pointsLowerPartMonorail_LeftSide); + + PointF[] pointsLowerPartMonorail_RightSide = new PointF[7]; + pointsLowerPartMonorail_RightSide[0] = new PointF(_startPositionX.Value + 86, _startPositionY.Value + 30); + pointsLowerPartMonorail_RightSide[1] = new PointF(_startPositionX.Value + 80, _startPositionY.Value + 25); + pointsLowerPartMonorail_RightSide[2] = new PointF(_startPositionX.Value + 50, _startPositionY.Value + 25); + pointsLowerPartMonorail_RightSide[3] = new PointF(_startPositionX.Value + 50, _startPositionY.Value + 32); + pointsLowerPartMonorail_RightSide[4] = new PointF(_startPositionX.Value + 69, _startPositionY.Value + 32); + pointsLowerPartMonorail_RightSide[5] = new PointF(_startPositionX.Value + 79, _startPositionY.Value + 35); + pointsLowerPartMonorail_RightSide[6] = new PointF(_startPositionX.Value + 86, _startPositionY.Value + 32); + 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); + 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 (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/EntityMonorail.cs new file mode 100644 index 0000000..b1b500c --- /dev/null +++ b/ProjectSportCar/Scripts/Monorail/EntityMonorail.cs @@ -0,0 +1,59 @@ +namespace ProjectMonorail +{ + public class EntityMonorail + { + /// + /// Скорость + /// + 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 MonorailTrack { get; private set; } + + /// + /// Признак (опция) наличия кабины + /// + public bool Cabin { get; private set; } + + /// + /// Шаг перемещения автомобиля + /// + public double Step => Speed * 100 / Weight; + + /// + /// Инициальзация полей объекта-класса спортивного автомобиля + /// + /// Скорость + /// Вес автомобиля + /// Основной цвет + /// Дополнительный цвет + /// Признак наличия монорельсового пути + /// Признак наличия кабины + public void Initialization(int speed, double weight, Color bodyColor, Color additionalColor, bool monorailTrack, bool cabin) + { + Speed = speed; + Weight = weight; + BodyColor = bodyColor; + AdditionalColor = additionalColor; + MonorailTrack = monorailTrack; + Cabin = cabin; + } + } +}