From a0a8eccb42329649c9c495ed866f604219c3c2b1 Mon Sep 17 00:00:00 2001 From: BoiledMilk123 Date: Mon, 12 Feb 2024 19:51:40 +0400 Subject: [PATCH] =?UTF-8?q?=D0=9B=D0=B0=D0=B1=D0=BE=D1=80=D0=B0=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=BD=D0=B0=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=B0=20=E2=84=961?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DirectionType.cs | 30 ++ .../DrawningElectricLocomotive.cs | 305 ++++++++++++++++++ .../EntityElectricLocomotive.cs | 77 +++++ .../Form1.Designer.cs | 39 --- .../ProjectElectricLocomotive/Form1.cs | 10 - .../FormElectricLocomotive.Designer.cs | 138 ++++++++ .../FormElectricLocomotive.cs | 95 ++++++ ...Form1.resx => FormElectricLocomotive.resx} | 50 +-- .../ProjectElectricLocomotive/Program.cs | 2 +- .../ProjectElectricLocomotive.csproj | 15 + .../Properties/Resources.Designer.cs | 103 ++++++ .../Properties/Resources.resx | 133 ++++++++ .../Resources/buttonDown.png | Bin 0 -> 9114 bytes .../Resources/buttonLeft.png | Bin 0 -> 6947 bytes .../Resources/buttonRight.png | Bin 0 -> 6534 bytes .../Resources/buttonUp.png | Bin 0 -> 9289 bytes 16 files changed, 922 insertions(+), 75 deletions(-) create mode 100644 ProjectElectricLocomotive/ProjectElectricLocomotive/DirectionType.cs create mode 100644 ProjectElectricLocomotive/ProjectElectricLocomotive/DrawningElectricLocomotive.cs create mode 100644 ProjectElectricLocomotive/ProjectElectricLocomotive/EntityElectricLocomotive.cs delete mode 100644 ProjectElectricLocomotive/ProjectElectricLocomotive/Form1.Designer.cs delete mode 100644 ProjectElectricLocomotive/ProjectElectricLocomotive/Form1.cs create mode 100644 ProjectElectricLocomotive/ProjectElectricLocomotive/FormElectricLocomotive.Designer.cs create mode 100644 ProjectElectricLocomotive/ProjectElectricLocomotive/FormElectricLocomotive.cs rename ProjectElectricLocomotive/ProjectElectricLocomotive/{Form1.resx => FormElectricLocomotive.resx} (93%) create mode 100644 ProjectElectricLocomotive/ProjectElectricLocomotive/Properties/Resources.Designer.cs create mode 100644 ProjectElectricLocomotive/ProjectElectricLocomotive/Properties/Resources.resx create mode 100644 ProjectElectricLocomotive/ProjectElectricLocomotive/Resources/buttonDown.png create mode 100644 ProjectElectricLocomotive/ProjectElectricLocomotive/Resources/buttonLeft.png create mode 100644 ProjectElectricLocomotive/ProjectElectricLocomotive/Resources/buttonRight.png create mode 100644 ProjectElectricLocomotive/ProjectElectricLocomotive/Resources/buttonUp.png diff --git a/ProjectElectricLocomotive/ProjectElectricLocomotive/DirectionType.cs b/ProjectElectricLocomotive/ProjectElectricLocomotive/DirectionType.cs new file mode 100644 index 0000000..17ab51c --- /dev/null +++ b/ProjectElectricLocomotive/ProjectElectricLocomotive/DirectionType.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectElectricLocomotive; + +public enum DirectionType +{ + /// + /// Вверх + /// + Up = 1, + + /// + /// Вниз + /// + Down = 2, + + /// + /// Влево + /// + Left = 3, + + /// + /// Вправо + /// + Right = 4 +} diff --git a/ProjectElectricLocomotive/ProjectElectricLocomotive/DrawningElectricLocomotive.cs b/ProjectElectricLocomotive/ProjectElectricLocomotive/DrawningElectricLocomotive.cs new file mode 100644 index 0000000..616d472 --- /dev/null +++ b/ProjectElectricLocomotive/ProjectElectricLocomotive/DrawningElectricLocomotive.cs @@ -0,0 +1,305 @@ + +namespace ProjectElectricLocomotive; + +/// +/// Класс, отвечающий за прорисовку и перемещение объекта - сущности +/// +public class DrawningElectricLocomotive +{ + /// + /// Класс-сущность + /// + public EntityElectricLocomotive? EntityElectricLocomotive { get; private set; } + + /// + /// Ширина окна + /// + private int? _pictureWidth; + + /// + /// Высота окна + /// + private int? _pictureHeight; + + /// + /// Левая координата прорисовки электровоза + /// + private int? _startPosX; + + /// + /// Верхняя координата прорисовки электровоза + /// + private int? _startPosY; + + /// + /// Ширина прорисовки электровоза + /// + private readonly int _drawningElectricLocomotiveWidth = 100; + + + /// + /// Высота прорисовки электровоза + /// + private readonly int _drawingElectricLocomotiveHeight = 45; + + /// + /// Инициализация свойств + /// + /// + /// + /// + /// + /// + /// + /// + public void Init(int speed, double weight, Color bodyColor, Color additionalColor, bool bodyKit, bool electricHorns, bool batteryPlacement, int wheelsAmount) + { + EntityElectricLocomotive = new EntityElectricLocomotive(); + + EntityElectricLocomotive.Init(speed, weight, bodyColor, additionalColor, bodyKit, electricHorns, batteryPlacement, wheelsAmount); + _pictureWidth = null; + _pictureHeight = null; + _startPosX = null; + _startPosY = null; + } + + /// + /// Установка границ поля + /// + /// + /// + /// true - границы заданы, false - проверка не пройдена, нельзя разместить объект в этих размерах + public bool SetPictureSize(int width, int height) + { + // Проверка, что объект "влезает" в размеры поля + // если влезает, сохраняем границы и корректируем позицию объекта, если она была уже установлена + if(_drawingElectricLocomotiveHeight > height || _drawningElectricLocomotiveWidth > width) + { + return false; + } + + _pictureWidth = width; + _pictureHeight = height; + return true; + } + + /// + /// Установка позиции + /// + /// КоОрдината X + /// Координата Y + public void SetPosition(int x, int y) + { + if(!_pictureHeight.HasValue || !_pictureWidth.HasValue) { + return; + } + + if (_drawingElectricLocomotiveHeight + y > _pictureHeight || _drawningElectricLocomotiveWidth + x > _pictureWidth) + { + _startPosX = 0; + _startPosY = 0; + } + else + { + _startPosX = x; + _startPosY = y; + } + + } + + /// + /// Изменение направления перемещения + /// + /// Направление + /// true - перемещение выполнено, false - перемещение невозможно + public bool MoveTransport(DirectionType direction) + { + if(EntityElectricLocomotive == null || !_startPosX.HasValue || !_startPosY.HasValue) + { + return false; + } + + switch(direction) + { + //влево + case DirectionType.Left: + if(_startPosX.Value - EntityElectricLocomotive.Step + 20 > 0) + { + _startPosX -= (int)EntityElectricLocomotive.Step; + } + return true; + //вверх + case DirectionType.Up: + if(_startPosY.Value - EntityElectricLocomotive.Step + 3 > 0) + { + _startPosY -= (int)EntityElectricLocomotive.Step; + } + return true; + //вправо + case DirectionType.Right: + if (_startPosX.Value + _drawningElectricLocomotiveWidth + EntityElectricLocomotive.Step < _pictureWidth) + { + _startPosX += (int)EntityElectricLocomotive.Step; + } + return true; + //вниз + case DirectionType.Down: + if (_startPosY.Value + _drawingElectricLocomotiveHeight + EntityElectricLocomotive.Step < _pictureHeight) + { + _startPosY += (int)EntityElectricLocomotive.Step; + } + return true; + default: + return false; + } + } + + /// + /// Прорисовка объекта + /// + /// + public void DrawTransport(Graphics g) + { + if (EntityElectricLocomotive == null || !_startPosX.HasValue || !_startPosY.HasValue) + { + return; + } + + //Создание перьев и кистей для прорисовки электровоза + Pen pen = new(Color.Black); + Pen penSolid = new(Color.Black, 2); + Pen penSolidYellow = new(Color.Yellow, 0.5f); + Pen windowPen = new(Color.DeepSkyBlue); + Brush additionalBrush = new SolidBrush(EntityElectricLocomotive.AdditionalColor); + Brush blackBrush = new SolidBrush(Color.Black); + Brush whiteBrush = new SolidBrush(Color.White); + + //Инициализация опорных точек для прорисовки корпуса + Point pointStart = new Point(_startPosX.Value + 90, _startPosY.Value + 20); + Point point1 = new Point(_startPosX.Value + 90, _startPosY.Value + 5); + Point point2 = new Point(_startPosX.Value + 25, _startPosY.Value + 5); + Point pointFinish = new Point(_startPosX.Value + 20, _startPosY.Value + 20); + + //Инициализация опорных точек для прорисовки первой "юбки" + Point point3 = new Point(_startPosX.Value + 22, _startPosY.Value + 37); + Point point4 = new Point(_startPosX.Value + 15, _startPosY.Value + 37 +6 ); + Point point5 = new Point(_startPosX.Value + 22, _startPosY.Value + 37 + 6 ); + + //Инициализация опорных точек для прорисовки второй "юбки" + Point point6 = new Point(_startPosX.Value + 84, _startPosY.Value + 37); + Point point7 = new Point(_startPosX.Value + 90 + 7, _startPosY.Value + 37 + 6); + Point point8 = new Point(_startPosX.Value + 84, _startPosY.Value + 37 + 6); + + //Инициализация опорных точек для прорисовки "рогов" + Point pointHorns1 = new Point(_startPosX.Value + 28, _startPosY.Value+5); + Point pointHorns2 = new Point(_startPosX.Value + 31, _startPosY.Value + 2); + Point pointHorns3 = new Point(_startPosX.Value + 26, _startPosY.Value); + + //Инициализация опорных точек для прорисовки молнии на хранилище батарей + Point pointLightning1 = new Point(_startPosX.Value + 54, _startPosY.Value + 37); + Point pointLightning2 = new Point(_startPosX.Value + 52, _startPosY.Value + 39); + Point pointLightning3 = new Point(_startPosX.Value + 54, _startPosY.Value + 40); + Point pointLightning4 = new Point(_startPosX.Value + 52, _startPosY.Value + 41); + + //Совокупность точек полигона уголка первой "юбки" + Point[] firstTrianglePoints = + { + + point3, + point4, + point5, + + }; + //Совокупность точек полигона уголка второй "юбки" + Point[] secondTrianglePoints = + { + + point6, + point7, + point8, + + }; + + // Прорисовка уголков "юбок" + g.FillPolygon(blackBrush, firstTrianglePoints); + g.FillPolygon(blackBrush, secondTrianglePoints); + + //Прорисовка корпуса + g.DrawRectangle(pen, _startPosX.Value + 20, _startPosY.Value + 20, 70, 17); + g.DrawLine(pen, point3, point4); + + g.DrawLine(pen, pointStart, point1); + g.DrawLine(pen, point1, point2); + g.DrawLine(pen, point2, pointFinish); + + + + //Прорисовка передней и задней "юбки" + g.FillRectangle(blackBrush, _startPosX.Value + 22, _startPosY.Value + 37, 25, 5.3f); + g.FillRectangle(blackBrush, _startPosX.Value + 62, _startPosY.Value + 37, 22, 5.3f); + + + //Прорисовка двух передних колёс + g.FillEllipse(whiteBrush, _startPosX.Value + 21.3f, _startPosY.Value + 37, 10, 10); + g.DrawEllipse(penSolid, _startPosX.Value + 24, _startPosY.Value + 37, 8, 8); + g.FillEllipse(additionalBrush, _startPosX.Value + 24, _startPosY.Value + 37, 8, 8); + g.DrawEllipse(penSolid, _startPosX.Value + 39, _startPosY.Value + 37, 8, 8); + g.FillEllipse(additionalBrush, _startPosX.Value + 39, _startPosY.Value + 37, 8, 8); + + //Прорисовка "рогов" электровоза + g.DrawLine(penSolid, pointHorns1, pointHorns2); + g.DrawLine(penSolid, pointHorns2, pointHorns3); + + //Прорисовка "хранилища батарей" электровоза + g.FillRectangle(blackBrush, _startPosX.Value + 51, _startPosY.Value + 37, 8, 4.5f); + g.DrawLine(penSolidYellow, pointLightning1, pointLightning2); + g.DrawLine(penSolidYellow, pointLightning2, pointLightning3); + g.DrawLine(penSolidYellow, pointLightning3, pointLightning4); + + + //Прорисовка двух задних колёс + g.FillEllipse(whiteBrush, _startPosX.Value + 40 + 38, _startPosY.Value + 37, 10, 10); + g.DrawEllipse(penSolid, _startPosX.Value + 40 + 26, _startPosY.Value + 37, 8, 8); + g.FillEllipse(additionalBrush, _startPosX.Value + 40 + 26, _startPosY.Value + 37, 8, 8); + g.DrawEllipse(penSolid, _startPosX.Value+ 40 + 37, _startPosY.Value + 37, 8, 8); + g.FillEllipse(additionalBrush, _startPosX.Value + 40 + 37, _startPosY.Value + 37, 8, 8); + + //Прорисовка заднего "шлюза" + g.FillRectangle(blackBrush, _startPosX.Value + 90, _startPosY.Value + 9, 5.7f, 27.4f); + + //Прорисовка первого и третьего окна + g.DrawRectangle(windowPen, _startPosX.Value + 27, _startPosY.Value + 9, 8, 8); + g.DrawRectangle(windowPen, _startPosX.Value + 78, _startPosY.Value + 9, 8, 8); + + + //TODO Опциональная прорисовка колёс для усложненной работы + //switch (EntityElectricLocomotive.WheelsAmount) + //{ + // case 4: + // //TODO + + // case 3: + // //TODO + + // case 2: + // //TODO + + // case 1: + // //TODO + // return; + + //} + + //Прорисовка опциональных элементов (второе окно и дверь) + if (EntityElectricLocomotive.BodyKit) + { + Brush brWhite = new SolidBrush(Color.White); + g.DrawRectangle(windowPen, _startPosX.Value + 39.3f, _startPosY.Value + 9, 8, 8); + + g.DrawRectangle(pen, _startPosX.Value + 50, _startPosY.Value + 14, 8, 12); + + g.FillRectangle(brWhite, _startPosX.Value + 51, _startPosY.Value + 16, 7, 10); + } + + } +} diff --git a/ProjectElectricLocomotive/ProjectElectricLocomotive/EntityElectricLocomotive.cs b/ProjectElectricLocomotive/ProjectElectricLocomotive/EntityElectricLocomotive.cs new file mode 100644 index 0000000..938828a --- /dev/null +++ b/ProjectElectricLocomotive/ProjectElectricLocomotive/EntityElectricLocomotive.cs @@ -0,0 +1,77 @@ + +namespace ProjectElectricLocomotive; + +/// +/// Класс-сущность "Тепловоз" +/// +public class EntityElectricLocomotive +{ + /// + /// Скорость + /// + 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 BodyKit { get; private set; } + + /// + /// Признак (опция) наличия "рогов" + /// + public bool ElectricHorns { get; private set; } + + /// + /// Признак (опция) количества колёс + /// + public int WheelsAmount { get; private set; } + + /// + /// Признак (опция) наличия места под батарею + /// + public bool BatteryPlacement { get; private set; } + + /// + /// Шаг перемещения объекта + /// + public double Step => Speed * 100 / Weight; + + /// + /// Инициализация полей объекта-класса тепловоза + /// + /// + /// + /// + /// + /// + /// + /// + /// + public void Init(int speed, double weight, Color bodyColor, Color additionalColor, bool bodyKit, bool electricHorns, bool batteryPlacement, int wheelsAmount) + { + Speed = speed; + Weight = weight; + BodyColor = bodyColor; + AdditionalColor = additionalColor; + BodyKit = bodyKit; + ElectricHorns = electricHorns; + BatteryPlacement = batteryPlacement; + WheelsAmount = wheelsAmount; + + } +} diff --git a/ProjectElectricLocomotive/ProjectElectricLocomotive/Form1.Designer.cs b/ProjectElectricLocomotive/ProjectElectricLocomotive/Form1.Designer.cs deleted file mode 100644 index 6cd3a18..0000000 --- a/ProjectElectricLocomotive/ProjectElectricLocomotive/Form1.Designer.cs +++ /dev/null @@ -1,39 +0,0 @@ -namespace ProjectElectricLocomotive -{ - 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/ProjectElectricLocomotive/ProjectElectricLocomotive/Form1.cs b/ProjectElectricLocomotive/ProjectElectricLocomotive/Form1.cs deleted file mode 100644 index eb6a0ea..0000000 --- a/ProjectElectricLocomotive/ProjectElectricLocomotive/Form1.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace ProjectElectricLocomotive -{ - public partial class Form1 : Form - { - public Form1() - { - InitializeComponent(); - } - } -} \ No newline at end of file diff --git a/ProjectElectricLocomotive/ProjectElectricLocomotive/FormElectricLocomotive.Designer.cs b/ProjectElectricLocomotive/ProjectElectricLocomotive/FormElectricLocomotive.Designer.cs new file mode 100644 index 0000000..577dbcc --- /dev/null +++ b/ProjectElectricLocomotive/ProjectElectricLocomotive/FormElectricLocomotive.Designer.cs @@ -0,0 +1,138 @@ +namespace ProjectElectricLocomotive +{ + partial class FormElectricLocomotive + { + /// + /// 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() + { + pictureBoxElectricLocomotive = new PictureBox(); + buttonCreate = new Button(); + buttonLeft = new Button(); + buttonDown = new Button(); + buttonRight = new Button(); + buttonUp = new Button(); + ((System.ComponentModel.ISupportInitialize)pictureBoxElectricLocomotive).BeginInit(); + SuspendLayout(); + // + // pictureBoxElectricLocomotive + // + pictureBoxElectricLocomotive.Dock = DockStyle.Fill; + pictureBoxElectricLocomotive.Location = new Point(0, 0); + pictureBoxElectricLocomotive.Name = "pictureBoxElectricLocomotive"; + pictureBoxElectricLocomotive.Size = new Size(866, 479); + pictureBoxElectricLocomotive.TabIndex = 0; + pictureBoxElectricLocomotive.TabStop = false; + // + // buttonCreate + // + buttonCreate.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + buttonCreate.Location = new Point(12, 430); + buttonCreate.Name = "buttonCreate"; + buttonCreate.Size = new Size(104, 37); + buttonCreate.TabIndex = 1; + buttonCreate.Text = "Создать"; + buttonCreate.UseVisualStyleBackColor = true; + buttonCreate.Click += ButtonCreate_Click; + // + // buttonLeft + // + buttonLeft.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + buttonLeft.BackColor = Color.Snow; + buttonLeft.BackgroundImage = Properties.Resources.buttonLeft; + buttonLeft.BackgroundImageLayout = ImageLayout.Stretch; + buttonLeft.Location = new Point(695, 405); + buttonLeft.Name = "buttonLeft"; + buttonLeft.Size = new Size(45, 45); + buttonLeft.TabIndex = 2; + buttonLeft.UseVisualStyleBackColor = false; + buttonLeft.Click += ButtonMove_Click; + // + // buttonDown + // + buttonDown.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + buttonDown.BackColor = Color.Snow; + buttonDown.BackgroundImage = Properties.Resources.buttonDown; + buttonDown.BackgroundImageLayout = ImageLayout.Stretch; + buttonDown.Location = new Point(746, 405); + buttonDown.Name = "buttonDown"; + buttonDown.Size = new Size(45, 45); + buttonDown.TabIndex = 3; + buttonDown.UseVisualStyleBackColor = false; + buttonDown.Click += ButtonMove_Click; + // + // buttonRight + // + buttonRight.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + buttonRight.BackColor = Color.Snow; + buttonRight.BackgroundImage = Properties.Resources.buttonRight; + buttonRight.BackgroundImageLayout = ImageLayout.Stretch; + buttonRight.Location = new Point(795, 405); + buttonRight.Name = "buttonRight"; + buttonRight.Size = new Size(45, 45); + buttonRight.TabIndex = 4; + buttonRight.UseVisualStyleBackColor = false; + buttonRight.Click += ButtonMove_Click; + // + // buttonUp + // + buttonUp.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + buttonUp.BackColor = Color.Snow; + buttonUp.BackgroundImage = Properties.Resources.buttonUp; + buttonUp.BackgroundImageLayout = ImageLayout.Stretch; + buttonUp.Location = new Point(746, 354); + buttonUp.Name = "buttonUp"; + buttonUp.Size = new Size(45, 45); + buttonUp.TabIndex = 5; + buttonUp.UseVisualStyleBackColor = false; + buttonUp.Click += ButtonMove_Click; + // + // FormElectricLocomotive + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(866, 479); + Controls.Add(buttonUp); + Controls.Add(buttonRight); + Controls.Add(buttonDown); + Controls.Add(buttonLeft); + Controls.Add(buttonCreate); + Controls.Add(pictureBoxElectricLocomotive); + Name = "FormElectricLocomotive"; + Text = "Электровоз"; + ((System.ComponentModel.ISupportInitialize)pictureBoxElectricLocomotive).EndInit(); + ResumeLayout(false); + } + + #endregion + + private PictureBox pictureBoxElectricLocomotive; + private Button buttonCreate; + private Button buttonLeft; + private Button buttonDown; + private Button buttonRight; + private Button buttonUp; + } +} \ No newline at end of file diff --git a/ProjectElectricLocomotive/ProjectElectricLocomotive/FormElectricLocomotive.cs b/ProjectElectricLocomotive/ProjectElectricLocomotive/FormElectricLocomotive.cs new file mode 100644 index 0000000..2de42d9 --- /dev/null +++ b/ProjectElectricLocomotive/ProjectElectricLocomotive/FormElectricLocomotive.cs @@ -0,0 +1,95 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace ProjectElectricLocomotive; + +public partial class FormElectricLocomotive : Form +{ + private DrawningElectricLocomotive? _drawningElectricLocomotive; + + public FormElectricLocomotive() + { + InitializeComponent(); + } + + /// + /// Метод прорисовки электровоза + /// + private void Draw() + { + if (_drawningElectricLocomotive == null) + { + return; + } + Bitmap bmp = new(pictureBoxElectricLocomotive.Width, + pictureBoxElectricLocomotive.Height); + Graphics gr = Graphics.FromImage(bmp); + _drawningElectricLocomotive.DrawTransport(gr); + pictureBoxElectricLocomotive.Image = bmp; + } + + private void ButtonCreate_Click(object sender, EventArgs e) + { + Random random = new(); + _drawningElectricLocomotive = new DrawningElectricLocomotive(); + _drawningElectricLocomotive.Init(random.Next(100, 300), random.Next(1000, 3000), + Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)), + Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)), + Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2)), random.Next(1, 5)); + _drawningElectricLocomotive.SetPictureSize(pictureBoxElectricLocomotive.Width, pictureBoxElectricLocomotive.Height); + _drawningElectricLocomotive.SetPosition(random.Next(10, 100), random.Next(10, 100)); + + Bitmap bmp = new(pictureBoxElectricLocomotive.Width, pictureBoxElectricLocomotive.Height); + Graphics gr = Graphics.FromImage(bmp); + _drawningElectricLocomotive.DrawTransport(gr); + pictureBoxElectricLocomotive.Image = bmp; + } + + /// + /// Перемещение объекта по форме (нажатие кнопок навигации) + /// + /// + /// + private void ButtonMove_Click(object sender, EventArgs e) + { + if (_drawningElectricLocomotive == null) + { + return; + } + string name = ((Button)sender)?.Name ?? string.Empty; + bool result = false; + switch (name) + { + case "buttonUp": + result = + _drawningElectricLocomotive.MoveTransport(DirectionType.Up); + break; + case "buttonDown": + result = + _drawningElectricLocomotive.MoveTransport(DirectionType.Down); + break; + case "buttonLeft": + result = + _drawningElectricLocomotive.MoveTransport(DirectionType.Left); + break; + case "buttonRight": + result = + _drawningElectricLocomotive.MoveTransport(DirectionType.Right); + break; + } + if (result) + { + Draw(); + } + } +} + + + diff --git a/ProjectElectricLocomotive/ProjectElectricLocomotive/Form1.resx b/ProjectElectricLocomotive/ProjectElectricLocomotive/FormElectricLocomotive.resx similarity index 93% rename from ProjectElectricLocomotive/ProjectElectricLocomotive/Form1.resx rename to ProjectElectricLocomotive/ProjectElectricLocomotive/FormElectricLocomotive.resx index 1af7de1..af32865 100644 --- a/ProjectElectricLocomotive/ProjectElectricLocomotive/Form1.resx +++ b/ProjectElectricLocomotive/ProjectElectricLocomotive/FormElectricLocomotive.resx @@ -1,17 +1,17 @@  - diff --git a/ProjectElectricLocomotive/ProjectElectricLocomotive/Program.cs b/ProjectElectricLocomotive/ProjectElectricLocomotive/Program.cs index 9a38110..ddb490c 100644 --- a/ProjectElectricLocomotive/ProjectElectricLocomotive/Program.cs +++ b/ProjectElectricLocomotive/ProjectElectricLocomotive/Program.cs @@ -11,7 +11,7 @@ namespace ProjectElectricLocomotive // 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 FormElectricLocomotive()); } } } \ No newline at end of file diff --git a/ProjectElectricLocomotive/ProjectElectricLocomotive/ProjectElectricLocomotive.csproj b/ProjectElectricLocomotive/ProjectElectricLocomotive/ProjectElectricLocomotive.csproj index e1a0735..244387d 100644 --- a/ProjectElectricLocomotive/ProjectElectricLocomotive/ProjectElectricLocomotive.csproj +++ b/ProjectElectricLocomotive/ProjectElectricLocomotive/ProjectElectricLocomotive.csproj @@ -8,4 +8,19 @@ enable + + + True + True + Resources.resx + + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + \ No newline at end of file diff --git a/ProjectElectricLocomotive/ProjectElectricLocomotive/Properties/Resources.Designer.cs b/ProjectElectricLocomotive/ProjectElectricLocomotive/Properties/Resources.Designer.cs new file mode 100644 index 0000000..90ecb95 --- /dev/null +++ b/ProjectElectricLocomotive/ProjectElectricLocomotive/Properties/Resources.Designer.cs @@ -0,0 +1,103 @@ +//------------------------------------------------------------------------------ +// +// Этот код создан программой. +// Исполняемая версия:4.0.30319.42000 +// +// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае +// повторной генерации кода. +// +//------------------------------------------------------------------------------ + +namespace ProjectElectricLocomotive.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("ProjectElectricLocomotive.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 buttonDown { + get { + object obj = ResourceManager.GetObject("buttonDown", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap buttonLeft { + get { + object obj = ResourceManager.GetObject("buttonLeft", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap buttonRight { + get { + object obj = ResourceManager.GetObject("buttonRight", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap buttonUp { + get { + object obj = ResourceManager.GetObject("buttonUp", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/ProjectElectricLocomotive/ProjectElectricLocomotive/Properties/Resources.resx b/ProjectElectricLocomotive/ProjectElectricLocomotive/Properties/Resources.resx new file mode 100644 index 0000000..3393d19 --- /dev/null +++ b/ProjectElectricLocomotive/ProjectElectricLocomotive/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\buttonLeft.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\buttonDown.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\buttonUp.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\buttonRight.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/ProjectElectricLocomotive/ProjectElectricLocomotive/Resources/buttonDown.png b/ProjectElectricLocomotive/ProjectElectricLocomotive/Resources/buttonDown.png new file mode 100644 index 0000000000000000000000000000000000000000..dfbc40caa477c32d0e6b4d2c07db033780ffeebd GIT binary patch literal 9114 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 M?ekitn)c!U2hG@eK>z>% literal 0 HcmV?d00001 diff --git a/ProjectElectricLocomotive/ProjectElectricLocomotive/Resources/buttonLeft.png b/ProjectElectricLocomotive/ProjectElectricLocomotive/Resources/buttonLeft.png new file mode 100644 index 0000000000000000000000000000000000000000..1aceaf14b1ca2b81bef1624b4a132ee17091ad7a GIT binary patch literal 6947 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 literal 0 HcmV?d00001 diff --git a/ProjectElectricLocomotive/ProjectElectricLocomotive/Resources/buttonRight.png b/ProjectElectricLocomotive/ProjectElectricLocomotive/Resources/buttonRight.png new file mode 100644 index 0000000000000000000000000000000000000000..a1c14932cec2476ff8ebd1d332e03668444df5aa GIT binary patch literal 6534 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 literal 0 HcmV?d00001 diff --git a/ProjectElectricLocomotive/ProjectElectricLocomotive/Resources/buttonUp.png b/ProjectElectricLocomotive/ProjectElectricLocomotive/Resources/buttonUp.png new file mode 100644 index 0000000000000000000000000000000000000000..3ad1f8286b3acf9c83e64925600520e498713e63 GIT binary patch literal 9289 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 literal 0 HcmV?d00001