From 58edf8d4ec0bfc506961edaf4c3492c78d9a678e Mon Sep 17 00:00:00 2001 From: Aidar Date: Sun, 25 Feb 2024 16:55:13 +0400 Subject: [PATCH 1/2] =?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 --- ProjectLiner/ProjectLiner/DirectionType.cs | 23 ++ ProjectLiner/ProjectLiner/DrawningLiner.cs | 223 ++++++++++++++++++ ProjectLiner/ProjectLiner/EntityLiner.cs | 53 +++++ ProjectLiner/ProjectLiner/Form1.Designer.cs | 39 --- ProjectLiner/ProjectLiner/Form1.cs | 10 - .../ProjectLiner/FormLiner.Designer.cs | 135 +++++++++++ ProjectLiner/ProjectLiner/FormLiner.cs | 84 +++++++ ProjectLiner/ProjectLiner/FormLiner.resx | 120 ++++++++++ ProjectLiner/ProjectLiner/Program.cs | 2 +- ProjectLiner/ProjectLiner/ProjectLiner.csproj | 15 ++ .../Properties/Resources.Designer.cs | 103 ++++++++ .../ProjectLiner/Properties/Resources.resx | 133 +++++++++++ .../ProjectLiner/Resources/buttonDown.png | Bin 0 -> 6116 bytes .../ProjectLiner/Resources/buttonLeft.png | Bin 0 -> 6055 bytes .../ProjectLiner/Resources/buttonRight.png | Bin 0 -> 6135 bytes .../ProjectLiner/Resources/buttonUp.png | Bin 0 -> 6062 bytes 16 files changed, 890 insertions(+), 50 deletions(-) create mode 100644 ProjectLiner/ProjectLiner/DirectionType.cs create mode 100644 ProjectLiner/ProjectLiner/DrawningLiner.cs create mode 100644 ProjectLiner/ProjectLiner/EntityLiner.cs delete mode 100644 ProjectLiner/ProjectLiner/Form1.Designer.cs delete mode 100644 ProjectLiner/ProjectLiner/Form1.cs create mode 100644 ProjectLiner/ProjectLiner/FormLiner.Designer.cs create mode 100644 ProjectLiner/ProjectLiner/FormLiner.cs create mode 100644 ProjectLiner/ProjectLiner/FormLiner.resx create mode 100644 ProjectLiner/ProjectLiner/Properties/Resources.Designer.cs create mode 100644 ProjectLiner/ProjectLiner/Properties/Resources.resx create mode 100644 ProjectLiner/ProjectLiner/Resources/buttonDown.png create mode 100644 ProjectLiner/ProjectLiner/Resources/buttonLeft.png create mode 100644 ProjectLiner/ProjectLiner/Resources/buttonRight.png create mode 100644 ProjectLiner/ProjectLiner/Resources/buttonUp.png diff --git a/ProjectLiner/ProjectLiner/DirectionType.cs b/ProjectLiner/ProjectLiner/DirectionType.cs new file mode 100644 index 0000000..ae64161 --- /dev/null +++ b/ProjectLiner/ProjectLiner/DirectionType.cs @@ -0,0 +1,23 @@ +namespace ProjectLiner; +/// +/// Направление передвижения +/// +public enum DirectionType +{ + /// + /// Вверх + /// + Up = 1, + /// + /// Вниз + /// + Down = 2, + /// + /// Влево + /// + Left = 3, + /// + /// Вправо + /// + Right = 4 +} \ No newline at end of file diff --git a/ProjectLiner/ProjectLiner/DrawningLiner.cs b/ProjectLiner/ProjectLiner/DrawningLiner.cs new file mode 100644 index 0000000..c4accb4 --- /dev/null +++ b/ProjectLiner/ProjectLiner/DrawningLiner.cs @@ -0,0 +1,223 @@ +namespace ProjectLiner; +/// +/// Класс-прорисовка сущности "Лайнер" +/// +public class DrawningLiner +{ + /// + /// Класс-сущность "Лайнер" + /// + public EntityLiner? EntityLiner { get; private set; } + /// + /// Ширина окна + /// + private int? _pictureWidth; + /// + /// Высота окна + /// + private int? _pictureHeight; + /// + /// Левая координата прорисовки сущности "Лайнер" + /// + private int? _startPosX; + /// + /// Верхнаяя координата прорисовки сущности "Лайнер" + /// + private int? _startPosY; + /// + /// Ширина прорисовки сущности "Лайнер" + /// + private readonly int _drawningLinerWidth = 150; + /// + /// Высота сущности "Лайнер" + /// + private readonly int _drawningLinerHeight = 65; + /// + /// Инициализация свойств + /// + /// Скорость + /// Вес + /// Основной цвет + /// Дополнительный цвет + /// Наличие второй палубы + /// Наличие басейна + public void Init(int speed, double weight, Color bodyColor, Color additionalColor, bool secondDeck, bool pool) + { + EntityLiner = new EntityLiner(); + EntityLiner.Init(speed, weight, bodyColor, additionalColor, secondDeck, pool); + _pictureWidth = null; + _pictureHeight = null; + _startPosX = null; + _startPosY = null; + } + /// + /// Установка границ поля + /// + /// Ширина поля + /// Высота поля + /// true - границы задданы, false - проверка не пройдена, нельзя разместить объект в этих размерах + public bool SetPictureSize(int width, int height) + { + if (height < _drawningLinerHeight || width < _drawningLinerWidth) + { + return false; + } + _pictureWidth = width; + _pictureHeight = height; + return true; + } + /// + /// Установка позиции + /// + /// Координата Х + /// Координата Y + public void SetPosition(int x, int y) + { + if (!_pictureHeight.HasValue || !_pictureWidth.HasValue) + { + return; + } + if (x < 0) + { + x = 0; + } + if (x + _drawningLinerWidth > _pictureWidth.Value) + { + x = _pictureWidth.Value - _drawningLinerWidth; + } + if (y < 0) + { + y = 0; + } + if (y + _drawningLinerHeight > _pictureHeight.Value) + { + y = _pictureHeight.Value - _drawningLinerHeight; + } + _startPosX = x; + _startPosY = y; + } + + /// + /// Изменения направления перемещения + /// + /// Направление + /// true - перемещение выполнено, false - перемещение невозможно + public bool MoveTransport(DirectionType direction) + { + if (EntityLiner == null || !_startPosX.HasValue || !_startPosY.HasValue) + { + return false; + } + switch (direction) + { + // Влево + case DirectionType.Left: + if (_startPosX.Value - EntityLiner.Step > 0) + { + _startPosX -= (int)EntityLiner.Step; + } + return true; + // Вверх + case DirectionType.Up: + if (_startPosY.Value - EntityLiner.Step > 0) + { + _startPosY -= (int)EntityLiner.Step; + } + return true; + // Вправо + case DirectionType.Right: + + if (_startPosX.Value + _drawningLinerWidth + EntityLiner.Step < _pictureWidth.Value) + { + _startPosX += (int)EntityLiner.Step; + } + return true; + // Вниз + case DirectionType.Down: + if (_startPosY.Value + _drawningLinerHeight + EntityLiner.Step < _pictureHeight.Value) + { + _startPosY += (int)EntityLiner.Step; + } + return true; + default: + return false; + } + } + /// + /// Прорисовка объекта + /// + /// + public void DrawTransport(Graphics g) + { + if (EntityLiner == null || !_startPosX.HasValue || !_startPosY.HasValue) + { + return; + } + Pen pen = new(Color.Black, 2); + Brush br = new SolidBrush(EntityLiner.BodyColor); + Brush additionalBrush = new SolidBrush(EntityLiner.AdditionalColor); + // Вторая палуба + if (EntityLiner.SecondDeck) + { + g.FillPolygon(additionalBrush, new[] + { + new Point(_startPosX.Value + 20, _startPosY.Value + 15), + new Point(_startPosX.Value + 30, _startPosY.Value + 0), + new Point(_startPosX.Value + 95, _startPosY.Value + 0), + new Point(_startPosX.Value + 100, _startPosY.Value + 15) + }); + g.DrawPolygon(pen, new[] + { + new Point(_startPosX.Value + 20, _startPosY.Value + 15), + new Point(_startPosX.Value + 30, _startPosY.Value + 0), + new Point(_startPosX.Value + 95, _startPosY.Value + 0), + new Point(_startPosX.Value + 100, _startPosY.Value + 15) + }); + + } + // Бассейн + if (EntityLiner.Pool) + { + g.FillRectangle(additionalBrush, _startPosX.Value + 110, _startPosY.Value + 25, 30, 5); + g.DrawRectangle(pen, _startPosX.Value + 110, _startPosY.Value + 25, 30, 5); + g.DrawArc(pen, _startPosX.Value + 135, _startPosY.Value + 20, 8, 8, 180, 180); + g.DrawLine(pen, _startPosX.Value + 143, _startPosY.Value + 25, _startPosX.Value + 143, _startPosY.Value + 30); + } + // Корпус и палуба Лайнера + g.FillPolygon(br, new[] + { + new Point(_startPosX.Value + 0, _startPosY.Value + 30), + new Point(_startPosX.Value + 150, _startPosY.Value + 30), + new Point(_startPosX.Value + 120, _startPosY.Value + 65), + new Point(_startPosX.Value + 30, _startPosY.Value + 65) + }); + g.FillPolygon(br, new[] + { + new Point(_startPosX.Value + 5, _startPosY.Value + 30), + new Point(_startPosX.Value + 15, _startPosY.Value + 15), + new Point(_startPosX.Value + 100, _startPosY.Value + 15), + new Point(_startPosX.Value + 105, _startPosY.Value + 30) + }); + + g.DrawPolygon(pen, new[] + { + new Point(_startPosX.Value + 0, _startPosY.Value + 30), + new Point(_startPosX.Value + 150, _startPosY.Value + 30), + new Point(_startPosX.Value + 120, _startPosY.Value + 65), + new Point(_startPosX.Value + 30, _startPosY.Value + 65) + }); + g.DrawPolygon(pen, new[] + { + new Point(_startPosX.Value + 5, _startPosY.Value + 30), + new Point(_startPosX.Value + 15, _startPosY.Value + 15), + new Point(_startPosX.Value + 100, _startPosY.Value + 15), + new Point(_startPosX.Value + 105, _startPosY.Value + 30) + }); + // Якорь + g.DrawLine(pen, _startPosX.Value + 30, _startPosY.Value + 33, _startPosX.Value + 30, _startPosY.Value + 45); + g.DrawLine(pen, _startPosX.Value + 27, _startPosY.Value + 36, _startPosX.Value + 33, _startPosY.Value + 36); + g.DrawLine(pen, _startPosX.Value + 25, _startPosY.Value + 40, _startPosX.Value + 30, _startPosY.Value + 45); + g.DrawLine(pen, _startPosX.Value + 30, _startPosY.Value + 45, _startPosX.Value + 35, _startPosY.Value + 40); + } +} + diff --git a/ProjectLiner/ProjectLiner/EntityLiner.cs b/ProjectLiner/ProjectLiner/EntityLiner.cs new file mode 100644 index 0000000..8cd9294 --- /dev/null +++ b/ProjectLiner/ProjectLiner/EntityLiner.cs @@ -0,0 +1,53 @@ +namespace ProjectLiner; +/// +/// Класс-сущность "Лайнер" +/// +public class EntityLiner +{ + /// + /// Скорость + /// + 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 SecondDeck { get; private set; } + /// + /// Наличие бассейна + /// + public bool Pool { get; private set; } + /// + /// Шаг перемещения сущности "Лайнер" + /// + public double Step => Speed * 100 / Weight; + /// + /// Инициализация полей объекта класса "Лайнер" + /// + /// Скорость + /// Вес + /// Основой цвет + /// Дополнительный цвет + /// Наличие второй палубы + /// Наличие бассейна + public void Init(int speed, double weight, Color bodyColor, Color additionalColor, bool secondDeck, bool pool) + { + Speed = speed; + Weight = weight; + BodyColor = bodyColor; + AdditionalColor = additionalColor; + SecondDeck = secondDeck; + Pool = pool; + } +} diff --git a/ProjectLiner/ProjectLiner/Form1.Designer.cs b/ProjectLiner/ProjectLiner/Form1.Designer.cs deleted file mode 100644 index 10a56d5..0000000 --- a/ProjectLiner/ProjectLiner/Form1.Designer.cs +++ /dev/null @@ -1,39 +0,0 @@ -namespace ProjectLiner -{ - 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 - } -} diff --git a/ProjectLiner/ProjectLiner/Form1.cs b/ProjectLiner/ProjectLiner/Form1.cs deleted file mode 100644 index baabe7e..0000000 --- a/ProjectLiner/ProjectLiner/Form1.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace ProjectLiner -{ - public partial class Form1 : Form - { - public Form1() - { - InitializeComponent(); - } - } -} diff --git a/ProjectLiner/ProjectLiner/FormLiner.Designer.cs b/ProjectLiner/ProjectLiner/FormLiner.Designer.cs new file mode 100644 index 0000000..bb87f5d --- /dev/null +++ b/ProjectLiner/ProjectLiner/FormLiner.Designer.cs @@ -0,0 +1,135 @@ +namespace ProjectLiner +{ + partial class FormLiner + { + /// + /// 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() + { + pictureBoxLiner = new PictureBox(); + buttonCreate = new Button(); + buttonRight = new Button(); + buttonDown = new Button(); + buttonLeft = new Button(); + buttonUp = new Button(); + ((System.ComponentModel.ISupportInitialize)pictureBoxLiner).BeginInit(); + SuspendLayout(); + // + // pictureBoxLiner + // + pictureBoxLiner.Dock = DockStyle.Fill; + pictureBoxLiner.Location = new Point(0, 0); + pictureBoxLiner.Name = "pictureBoxLiner"; + pictureBoxLiner.Size = new Size(884, 461); + pictureBoxLiner.TabIndex = 0; + pictureBoxLiner.TabStop = false; + // + // buttonCreate + // + buttonCreate.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + buttonCreate.Location = new Point(12, 426); + buttonCreate.Name = "buttonCreate"; + buttonCreate.Size = new Size(75, 23); + buttonCreate.TabIndex = 1; + buttonCreate.Text = "Создать"; + buttonCreate.UseVisualStyleBackColor = true; + buttonCreate.Click += ButtonCreate_Click; + // + // buttonRight + // + buttonRight.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + buttonRight.BackgroundImage = Properties.Resources.buttonRight; + buttonRight.BackgroundImageLayout = ImageLayout.Zoom; + buttonRight.Location = new Point(842, 419); + buttonRight.Name = "buttonRight"; + buttonRight.Size = new Size(30, 30); + buttonRight.TabIndex = 2; + buttonRight.UseVisualStyleBackColor = true; + buttonRight.Click += ButtonMove_Click; + // + // buttonDown + // + buttonDown.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + buttonDown.BackgroundImage = Properties.Resources.buttonDown; + buttonDown.BackgroundImageLayout = ImageLayout.Zoom; + buttonDown.Location = new Point(806, 419); + buttonDown.Name = "buttonDown"; + buttonDown.Size = new Size(30, 30); + buttonDown.TabIndex = 3; + buttonDown.UseVisualStyleBackColor = true; + buttonDown.Click += ButtonMove_Click; + // + // buttonLeft + // + buttonLeft.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + buttonLeft.BackgroundImage = Properties.Resources.buttonLeft; + buttonLeft.BackgroundImageLayout = ImageLayout.Zoom; + buttonLeft.Location = new Point(770, 419); + buttonLeft.Name = "buttonLeft"; + buttonLeft.Size = new Size(30, 30); + buttonLeft.TabIndex = 4; + buttonLeft.UseVisualStyleBackColor = true; + buttonLeft.Click += ButtonMove_Click; + // + // buttonUp + // + buttonUp.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + buttonUp.BackgroundImage = Properties.Resources.buttonUp; + buttonUp.BackgroundImageLayout = ImageLayout.Zoom; + buttonUp.Location = new Point(806, 383); + buttonUp.Name = "buttonUp"; + buttonUp.Size = new Size(30, 30); + buttonUp.TabIndex = 5; + buttonUp.UseVisualStyleBackColor = true; + buttonUp.Click += ButtonMove_Click; + // + // FormLiner + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(884, 461); + Controls.Add(buttonUp); + Controls.Add(buttonLeft); + Controls.Add(buttonDown); + Controls.Add(buttonRight); + Controls.Add(buttonCreate); + Controls.Add(pictureBoxLiner); + Name = "FormLiner"; + StartPosition = FormStartPosition.CenterScreen; + Text = "Лайнер"; + ((System.ComponentModel.ISupportInitialize)pictureBoxLiner).EndInit(); + ResumeLayout(false); + } + + #endregion + + private PictureBox pictureBoxLiner; + private Button buttonCreate; + private Button buttonRight; + private Button buttonDown; + private Button buttonLeft; + private Button buttonUp; + } +} \ No newline at end of file diff --git a/ProjectLiner/ProjectLiner/FormLiner.cs b/ProjectLiner/ProjectLiner/FormLiner.cs new file mode 100644 index 0000000..e2d10f7 --- /dev/null +++ b/ProjectLiner/ProjectLiner/FormLiner.cs @@ -0,0 +1,84 @@ +namespace ProjectLiner; +/// +/// Форма работы с объектом "Лайнер" +/// +public partial class FormLiner : Form +{ + /// + /// Поле-объект для прорисовки объекта + /// + private DrawningLiner? _drawningLiner; + /// + /// Конструктор формы + /// + public FormLiner() + { + InitializeComponent(); + } + /// + /// Метод прорисовки Лайнера + /// + private void Draw() + { + if (_drawningLiner == null) + { + return; + } + Bitmap bmp = new(pictureBoxLiner.Width, + pictureBoxLiner.Height); + Graphics gr = Graphics.FromImage(bmp); + _drawningLiner.DrawTransport(gr); + pictureBoxLiner.Image = bmp; + } + /// + /// Обработка нажатия кнопки "Создать" + /// + /// + /// + private void ButtonCreate_Click(object sender, EventArgs e) + { + Random random = new(); + _drawningLiner = new DrawningLiner(); + _drawningLiner.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))); + _drawningLiner.SetPictureSize(pictureBoxLiner.Width, pictureBoxLiner.Height); + _drawningLiner.SetPosition(random.Next(10, 100), random.Next(10, 100)); + + Draw(); + } + /// + /// Обработка нажатия кнопок навигации движения + /// + /// + /// + private void ButtonMove_Click(object sender, EventArgs e) + { + if (_drawningLiner == null) + { + return; + } + string name = ((Button)sender)?.Name ?? string.Empty; + bool result = false; + switch (name) + { + case "buttonUp": + result = _drawningLiner.MoveTransport(DirectionType.Up); + break; + case "buttonDown": + result = _drawningLiner.MoveTransport(DirectionType.Down); + break; + case "buttonLeft": + result = _drawningLiner.MoveTransport(DirectionType.Left); + break; + case "buttonRight": + result = _drawningLiner.MoveTransport(DirectionType.Right); + break; + } + if (result) + { + Draw(); + } + } +} diff --git a/ProjectLiner/ProjectLiner/FormLiner.resx b/ProjectLiner/ProjectLiner/FormLiner.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/ProjectLiner/ProjectLiner/FormLiner.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/ProjectLiner/ProjectLiner/Program.cs b/ProjectLiner/ProjectLiner/Program.cs index 6a14f7d..b3dc92e 100644 --- a/ProjectLiner/ProjectLiner/Program.cs +++ b/ProjectLiner/ProjectLiner/Program.cs @@ -11,7 +11,7 @@ namespace ProjectLiner // 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 FormLiner()); } } } \ No newline at end of file diff --git a/ProjectLiner/ProjectLiner/ProjectLiner.csproj b/ProjectLiner/ProjectLiner/ProjectLiner.csproj index e1a0735..244387d 100644 --- a/ProjectLiner/ProjectLiner/ProjectLiner.csproj +++ b/ProjectLiner/ProjectLiner/ProjectLiner.csproj @@ -8,4 +8,19 @@ enable + + + True + True + Resources.resx + + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + \ No newline at end of file diff --git a/ProjectLiner/ProjectLiner/Properties/Resources.Designer.cs b/ProjectLiner/ProjectLiner/Properties/Resources.Designer.cs new file mode 100644 index 0000000..1c163a4 --- /dev/null +++ b/ProjectLiner/ProjectLiner/Properties/Resources.Designer.cs @@ -0,0 +1,103 @@ +//------------------------------------------------------------------------------ +// +// Этот код создан программой. +// Исполняемая версия:4.0.30319.42000 +// +// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае +// повторной генерации кода. +// +//------------------------------------------------------------------------------ + +namespace ProjectLiner.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("ProjectLiner.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/ProjectLiner/ProjectLiner/Properties/Resources.resx b/ProjectLiner/ProjectLiner/Properties/Resources.resx new file mode 100644 index 0000000..12b9209 --- /dev/null +++ b/ProjectLiner/ProjectLiner/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\buttonDown.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\buttonLeft.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 + + + ..\Resources\buttonUp.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/ProjectLiner/ProjectLiner/Resources/buttonDown.png b/ProjectLiner/ProjectLiner/Resources/buttonDown.png new file mode 100644 index 0000000000000000000000000000000000000000..5696df8e813a1bc43d67af0c767b0256a8137f4a GIT binary patch literal 6116 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 literal 0 HcmV?d00001 diff --git a/ProjectLiner/ProjectLiner/Resources/buttonLeft.png b/ProjectLiner/ProjectLiner/Resources/buttonLeft.png new file mode 100644 index 0000000000000000000000000000000000000000..d87912cdc6e5e913ef1fc06ec31cad74249612bf GIT binary patch literal 6055 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 literal 0 HcmV?d00001 diff --git a/ProjectLiner/ProjectLiner/Resources/buttonRight.png b/ProjectLiner/ProjectLiner/Resources/buttonRight.png new file mode 100644 index 0000000000000000000000000000000000000000..34c5776d4a539b70aabad0939e8349b58364d931 GIT binary patch literal 6135 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 literal 0 HcmV?d00001 diff --git a/ProjectLiner/ProjectLiner/Resources/buttonUp.png b/ProjectLiner/ProjectLiner/Resources/buttonUp.png new file mode 100644 index 0000000000000000000000000000000000000000..4c3311455aa85142819a335a9180424abac85432 GIT binary patch literal 6062 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 Date: Fri, 8 Mar 2024 11:07:33 +0400 Subject: [PATCH 2/2] =?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 --- ProjectLiner/ProjectLiner/DirectionType.cs | 1 + ProjectLiner/ProjectLiner/DrawningLiner.cs | 24 +++++++++++++++++++--- ProjectLiner/ProjectLiner/EntityLiner.cs | 10 ++++++++- ProjectLiner/ProjectLiner/FormLiner.cs | 7 ++++++- 4 files changed, 37 insertions(+), 5 deletions(-) diff --git a/ProjectLiner/ProjectLiner/DirectionType.cs b/ProjectLiner/ProjectLiner/DirectionType.cs index ae64161..17b4361 100644 --- a/ProjectLiner/ProjectLiner/DirectionType.cs +++ b/ProjectLiner/ProjectLiner/DirectionType.cs @@ -1,4 +1,5 @@ namespace ProjectLiner; + /// /// Направление передвижения /// diff --git a/ProjectLiner/ProjectLiner/DrawningLiner.cs b/ProjectLiner/ProjectLiner/DrawningLiner.cs index c4accb4..3171ad2 100644 --- a/ProjectLiner/ProjectLiner/DrawningLiner.cs +++ b/ProjectLiner/ProjectLiner/DrawningLiner.cs @@ -1,4 +1,5 @@ namespace ProjectLiner; + /// /// Класс-прорисовка сущности "Лайнер" /// @@ -8,30 +9,37 @@ public class DrawningLiner /// Класс-сущность "Лайнер" /// public EntityLiner? EntityLiner { get; private set; } + /// /// Ширина окна /// private int? _pictureWidth; + /// /// Высота окна /// private int? _pictureHeight; + /// /// Левая координата прорисовки сущности "Лайнер" /// private int? _startPosX; + /// /// Верхнаяя координата прорисовки сущности "Лайнер" /// private int? _startPosY; + /// /// Ширина прорисовки сущности "Лайнер" /// private readonly int _drawningLinerWidth = 150; + /// /// Высота сущности "Лайнер" /// private readonly int _drawningLinerHeight = 65; + /// /// Инициализация свойств /// @@ -50,6 +58,7 @@ public class DrawningLiner _startPosX = null; _startPosY = null; } + /// /// Установка границ поля /// @@ -64,8 +73,11 @@ public class DrawningLiner } _pictureWidth = width; _pictureHeight = height; + if (_startPosX.HasValue && _startPosX + _drawningLinerWidth > width) _startPosX = _pictureWidth - _drawningLinerWidth; + if (_startPosY.HasValue && _startPosY + _drawningLinerHeight > height) _startPosY = _pictureHeight - _drawningLinerHeight; return true; } + /// /// Установка позиции /// @@ -117,6 +129,7 @@ public class DrawningLiner _startPosX -= (int)EntityLiner.Step; } return true; + // Вверх case DirectionType.Up: if (_startPosY.Value - EntityLiner.Step > 0) @@ -124,6 +137,7 @@ public class DrawningLiner _startPosY -= (int)EntityLiner.Step; } return true; + // Вправо case DirectionType.Right: @@ -132,6 +146,7 @@ public class DrawningLiner _startPosX += (int)EntityLiner.Step; } return true; + // Вниз case DirectionType.Down: if (_startPosY.Value + _drawningLinerHeight + EntityLiner.Step < _pictureHeight.Value) @@ -143,6 +158,7 @@ public class DrawningLiner return false; } } + /// /// Прорисовка объекта /// @@ -156,6 +172,7 @@ public class DrawningLiner Pen pen = new(Color.Black, 2); Brush br = new SolidBrush(EntityLiner.BodyColor); Brush additionalBrush = new SolidBrush(EntityLiner.AdditionalColor); + // Вторая палуба if (EntityLiner.SecondDeck) { @@ -175,6 +192,7 @@ public class DrawningLiner }); } + // Бассейн if (EntityLiner.Pool) { @@ -183,6 +201,7 @@ public class DrawningLiner g.DrawArc(pen, _startPosX.Value + 135, _startPosY.Value + 20, 8, 8, 180, 180); g.DrawLine(pen, _startPosX.Value + 143, _startPosY.Value + 25, _startPosX.Value + 143, _startPosY.Value + 30); } + // Корпус и палуба Лайнера g.FillPolygon(br, new[] { @@ -198,7 +217,6 @@ public class DrawningLiner new Point(_startPosX.Value + 100, _startPosY.Value + 15), new Point(_startPosX.Value + 105, _startPosY.Value + 30) }); - g.DrawPolygon(pen, new[] { new Point(_startPosX.Value + 0, _startPosY.Value + 30), @@ -213,11 +231,11 @@ public class DrawningLiner new Point(_startPosX.Value + 100, _startPosY.Value + 15), new Point(_startPosX.Value + 105, _startPosY.Value + 30) }); + // Якорь g.DrawLine(pen, _startPosX.Value + 30, _startPosY.Value + 33, _startPosX.Value + 30, _startPosY.Value + 45); g.DrawLine(pen, _startPosX.Value + 27, _startPosY.Value + 36, _startPosX.Value + 33, _startPosY.Value + 36); g.DrawLine(pen, _startPosX.Value + 25, _startPosY.Value + 40, _startPosX.Value + 30, _startPosY.Value + 45); g.DrawLine(pen, _startPosX.Value + 30, _startPosY.Value + 45, _startPosX.Value + 35, _startPosY.Value + 40); } -} - +} \ No newline at end of file diff --git a/ProjectLiner/ProjectLiner/EntityLiner.cs b/ProjectLiner/ProjectLiner/EntityLiner.cs index 8cd9294..444ed7b 100644 --- a/ProjectLiner/ProjectLiner/EntityLiner.cs +++ b/ProjectLiner/ProjectLiner/EntityLiner.cs @@ -1,4 +1,5 @@ namespace ProjectLiner; + /// /// Класс-сущность "Лайнер" /// @@ -8,30 +9,37 @@ public class EntityLiner /// Скорость /// 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 SecondDeck { get; private set; } + /// /// Наличие бассейна /// public bool Pool { get; private set; } + /// /// Шаг перемещения сущности "Лайнер" /// public double Step => Speed * 100 / Weight; + /// /// Инициализация полей объекта класса "Лайнер" /// @@ -50,4 +58,4 @@ public class EntityLiner SecondDeck = secondDeck; Pool = pool; } -} +} \ No newline at end of file diff --git a/ProjectLiner/ProjectLiner/FormLiner.cs b/ProjectLiner/ProjectLiner/FormLiner.cs index e2d10f7..248a90e 100644 --- a/ProjectLiner/ProjectLiner/FormLiner.cs +++ b/ProjectLiner/ProjectLiner/FormLiner.cs @@ -1,4 +1,5 @@ namespace ProjectLiner; + /// /// Форма работы с объектом "Лайнер" /// @@ -8,6 +9,7 @@ public partial class FormLiner : Form /// Поле-объект для прорисовки объекта /// private DrawningLiner? _drawningLiner; + /// /// Конструктор формы /// @@ -15,6 +17,7 @@ public partial class FormLiner : Form { InitializeComponent(); } + /// /// Метод прорисовки Лайнера /// @@ -30,6 +33,7 @@ public partial class FormLiner : Form _drawningLiner.DrawTransport(gr); pictureBoxLiner.Image = bmp; } + /// /// Обработка нажатия кнопки "Создать" /// @@ -48,6 +52,7 @@ public partial class FormLiner : Form Draw(); } + /// /// Обработка нажатия кнопок навигации движения /// @@ -81,4 +86,4 @@ public partial class FormLiner : Form Draw(); } } -} +} \ No newline at end of file -- 2.25.1