Добавление родителей и ввод конструкторов

This commit is contained in:
cleverman1337 2024-04-17 16:06:39 +04:00
parent dcc4f2c688
commit 288275e9cb
8 changed files with 246 additions and 151 deletions

View File

@ -4,10 +4,10 @@ using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace SelfPropelledArtilleryUnit; namespace SelfPropelledArtilleryUnit.Drawnings;
public enum DirectionType public enum DirectionType
{ {
Up = 1, Up = 1,
Down = 2, Down = 2,
Left = 3, Left = 3,

View File

@ -0,0 +1,58 @@
using SelfPropelledArtilleryUnit.Entities;
namespace SelfPropelledArtilleryUnit.Drawnings;
/// <summary>
/// Класс, отвечающий за прорисовку и перемещение объекта-сущности
/// </summary>
public class DrawningArtillery : DrawningTank
{
/// <summary>
/// конструктор
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес</param>
/// <param name="bodyColor">Основной цвет</param>
/// <param name="additionalColor">Дополнительный цвет</param>
/// <param name="cannon">Признак наличия пушки</param>
/// <param name="rocket">Признак наличия залповой установки</param>
public DrawningArtillery(int speed, double weight, Color bodyColor, Color additionalColor, bool cannon, bool rocket) : base(130,70)
{
EntityTank = new EntityArtillery(speed, weight, bodyColor, additionalColor, cannon, rocket);
}
public override void DrawTransport(Graphics g)
{
if (EntityTank == null || EntityTank is not EntityArtillery artillery || !_startPosX.HasValue || !_startPosY.HasValue)
{
return;
}
Pen pen = new(Color.Black);
Brush additionalBrush = new SolidBrush(artillery.AdditionalColor);
//орудие
if (artillery.Cannon)
{
g.FillRectangle(additionalBrush, _startPosX.Value + 80, _startPosY.Value + 25, 50, 5);
g.DrawRectangle(pen, _startPosX.Value + 80, _startPosY.Value + 25, 50, 5);
}
//установка
if (artillery.Cannon)
{
//колонна
g.FillRectangle(additionalBrush, _startPosX.Value + 5, _startPosY.Value + 10, 5, 30);
g.DrawRectangle(pen, _startPosX.Value + 5, _startPosY.Value + 10, 5, 30);
//контейнер
g.FillRectangle(additionalBrush, _startPosX.Value + 3, _startPosY.Value + 5, 50, 13);
g.DrawRectangle(pen, _startPosX.Value + 3, _startPosY.Value + 5, 50, 13);
//ракеты
g.DrawRectangle(pen, _startPosX.Value + 52, _startPosY.Value + 5, 10, 3);
g.DrawRectangle(pen, _startPosX.Value + 52, _startPosY.Value + 10, 10, 3);
g.DrawRectangle(pen, _startPosX.Value + 52, _startPosY.Value + 15, 10, 3);
}
base.DrawTransport(g);
}
}

View File

@ -1,13 +1,18 @@
namespace SelfPropelledArtilleryUnit; using SelfPropelledArtilleryUnit.Entities;
/// <summary> using System;
/// Класс, отвечающий за прорисовку и перемещение объекта-сущности using System.Collections.Generic;
/// </summary> using System.Linq;
public class DrawningArtillery using System.Text;
using System.Threading.Tasks;
namespace SelfPropelledArtilleryUnit.Drawnings;
public class DrawningTank
{ {
/// <summary> /// <summary>
/// Класс-сущность /// Класс-сущность
/// </summary> /// </summary>
public EntityArtillery? EntityArtillery { get; private set; } public EntityTank? EntityTank { get; protected set; }
/// <summary> /// <summary>
/// Ширина окна /// Ширина окна
/// </summary> /// </summary>
@ -19,39 +24,39 @@ public class DrawningArtillery
/// <summary> /// <summary>
/// Левая координата прорисовки автомобиля /// Левая координата прорисовки автомобиля
/// </summary> /// </summary>
private int? _startPosX; protected private int? _startPosX;
/// <summary> /// <summary>
/// Верхняя кооридната прорисовки автомобиля /// Верхняя кооридната прорисовки автомобиля
/// </summary> /// </summary>
private int? _startPosY; protected private int? _startPosY;
/// <summary> /// <summary>
/// Ширина прорисовки автомобиля /// Ширина прорисовки автомобиля
/// </summary> /// </summary>
private readonly int _drawningArtilleryWidth = 130; private readonly int _drawningTankWidth = 130;
/// <summary> /// <summary>
/// Высота прорисовки автомобиля /// Высота прорисовки автомобиля
/// </summary> /// </summary>
private readonly int _drawningArtilleryHeight = 70; private readonly int _drawningTankHeight = 70;
/// <summary> /// <summary>
/// Инициализация свойств /// Пустой конструктор
/// </summary> /// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес</param>
/// <param name="bodyColor">Основной цвет</param>
/// <param name="additionalColor">Дополнительный цвет</param>
/// <param name="cannon">Признак наличия пушки</param>
/// <param name="rocket">Признак наличия залповой установки</param>
public void Init(int speed, double weight, Color bodyColor, Color private DrawningTank()
additionalColor, bool cannon, bool rocket)
{ {
EntityArtillery = new EntityArtillery();
EntityArtillery.Init(speed, weight, bodyColor, additionalColor, cannon, rocket);
_pictureWidth = null; _pictureWidth = null;
_pictureHeight = null; _pictureHeight = null;
_startPosX = null; _startPosX = null;
_startPosY = null; _startPosY = null;
} }
public DrawningTank(int speed, double weight, Color bodyColor) : this()
{
EntityTank = new EntityTank(speed, weight, bodyColor);
}
protected DrawningTank(int drawningTankWidth, int drawningTankHeight) : this()
{
_drawningTankWidth = drawningTankWidth;
_pictureHeight = drawningTankHeight;
}
/// <summary> /// <summary>
/// Установка границ поля /// Установка границ поля
/// </summary> /// </summary>
@ -60,7 +65,7 @@ public class DrawningArtillery
/// <returns>true - границы заданы, false - проверка не пройдена, нельзя разместить объект в этих размерах</returns> /// <returns>true - границы заданы, false - проверка не пройдена, нельзя разместить объект в этих размерах</returns>
public bool SetPictureSize(int width, int height) public bool SetPictureSize(int width, int height)
{ {
if (_drawningArtilleryHeight > height || _drawningArtilleryWidth > width) if (_drawningTankHeight > height || _drawningTankWidth > width)
{ {
return false; return false;
} }
@ -88,18 +93,18 @@ public class DrawningArtillery
} }
// TODO если при установке объекта в эти координаты, он будет "выходить" за границы формы // TODO если при установке объекта в эти координаты, он будет "выходить" за границы формы
// то надо изменить координаты, чтобы он оставался в этих границах // то надо изменить координаты, чтобы он оставался в этих границах
if (x < 0 || x + _drawningArtilleryWidth > _pictureWidth) if (x < 0 || x + _drawningTankWidth > _pictureWidth)
{ {
_startPosX = _pictureWidth - _drawningArtilleryWidth; _startPosX = _pictureWidth - _drawningTankWidth;
} }
else else
{ {
_startPosX = x; _startPosX = x;
} }
if (y < 0 || y + _drawningArtilleryHeight > _pictureHeight) if (y < 0 || y + _drawningTankHeight > _pictureHeight)
{ {
_startPosY = _pictureHeight - _drawningArtilleryHeight; _startPosY = _pictureHeight - _drawningTankHeight;
} }
else else
{ {
@ -113,7 +118,7 @@ public class DrawningArtillery
/// <returns>true - перемещене выполнено, false - перемещение невозможно</returns> /// <returns>true - перемещене выполнено, false - перемещение невозможно</returns>
public bool MoveTransport(DirectionType direction) public bool MoveTransport(DirectionType direction)
{ {
if (EntityArtillery == null || !_startPosX.HasValue || if (EntityTank == null || !_startPosX.HasValue ||
!_startPosY.HasValue) !_startPosY.HasValue)
{ {
return false; return false;
@ -122,31 +127,31 @@ public class DrawningArtillery
{ {
//влево //влево
case DirectionType.Left: case DirectionType.Left:
if (_startPosX.Value - EntityArtillery.Step > 0) if (_startPosX.Value - EntityTank.Step > 0)
{ {
_startPosX -= (int)EntityArtillery.Step; _startPosX -= (int)EntityTank.Step;
} }
return true; return true;
//вверх //вверх
case DirectionType.Up: case DirectionType.Up:
if (_startPosY.Value - EntityArtillery.Step > 0) if (_startPosY.Value - EntityTank.Step > 0)
{ {
_startPosY -= (int)EntityArtillery.Step; _startPosY -= (int)EntityTank.Step;
} }
return true; return true;
// вправо // вправо
case DirectionType.Right: case DirectionType.Right:
if (_startPosX.Value + EntityArtillery.Step + _drawningArtilleryWidth < _pictureWidth) if (_startPosX.Value + EntityTank.Step + _drawningTankWidth < _pictureWidth)
{ {
_startPosX += (int)EntityArtillery.Step; _startPosX += (int)EntityTank.Step;
} }
return true; return true;
//вниз //вниз
case DirectionType.Down: case DirectionType.Down:
if (_startPosY.Value + EntityArtillery.Step + _drawningArtilleryHeight < _pictureHeight) if (_startPosY.Value + EntityTank.Step + _drawningTankHeight < _pictureHeight)
{ {
_startPosY += (int)EntityArtillery.Step; _startPosY += (int)EntityTank.Step;
} }
return true; return true;
default: default:
@ -157,18 +162,16 @@ public class DrawningArtillery
/// Прорисовка объекта /// Прорисовка объекта
/// </summary> /// </summary>
/// <param name="g"></param> /// <param name="g"></param>
public void DrawTransport(Graphics g) public virtual void DrawTransport(Graphics g)
{ {
if (EntityArtillery == null || !_startPosX.HasValue || if (EntityTank == null || !_startPosX.HasValue ||
!_startPosY.HasValue) !_startPosY.HasValue)
{ {
return; return;
} }
Pen pen = new(Color.Black); Pen pen = new(Color.Black);
Brush additionalBrush = new Brush brush = new SolidBrush(EntityTank.BodyColor);
SolidBrush(EntityArtillery.AdditionalColor);
Brush brush = new SolidBrush(EntityArtillery.BodyColor);
Brush grayBrush = new SolidBrush(Color.Gray); Brush grayBrush = new SolidBrush(Color.Gray);
Brush blackBrush = new SolidBrush(Color.Black); Brush blackBrush = new SolidBrush(Color.Black);
//тело //тело
@ -176,8 +179,8 @@ public class DrawningArtillery
g.DrawRectangle(pen, _startPosX.Value, _startPosY.Value + 40, 110, 20); g.DrawRectangle(pen, _startPosX.Value, _startPosY.Value + 40, 110, 20);
//башня //башня
g.FillRectangle(brush, _startPosX.Value+30, _startPosY.Value+20,50,20); g.FillRectangle(brush, _startPosX.Value + 30, _startPosY.Value + 20, 50, 20);
g.DrawRectangle(pen, _startPosX.Value+30, _startPosY.Value + 20, 50, 20); g.DrawRectangle(pen, _startPosX.Value + 30, _startPosY.Value + 20, 50, 20);
//ходовая //ходовая
//основа //основа
g.DrawEllipse(pen, _startPosX.Value, _startPosY.Value + 50, 110, 20); g.DrawEllipse(pen, _startPosX.Value, _startPosY.Value + 50, 110, 20);
@ -205,25 +208,7 @@ public class DrawningArtillery
//6-ПравБол //6-ПравБол
g.DrawEllipse(pen, _startPosX.Value + 7, _startPosY.Value + 52, 15, 15); g.DrawEllipse(pen, _startPosX.Value + 7, _startPosY.Value + 52, 15, 15);
g.FillEllipse(blackBrush, _startPosX.Value + 7, _startPosY.Value + 52, 15, 15); g.FillEllipse(blackBrush, _startPosX.Value + 7, _startPosY.Value + 52, 15, 15);
//орудие
if (EntityArtillery.Cannon)
{
g.FillRectangle(additionalBrush, _startPosX.Value+80, _startPosY.Value + 25, 50, 5);
g.DrawRectangle(pen, _startPosX.Value+80, _startPosY.Value + 25, 50, 5);
}
//установка
if (EntityArtillery.Cannon)
{
//колонна
g.FillRectangle(additionalBrush, _startPosX.Value +5, _startPosY.Value + 10, 5, 30);
g.DrawRectangle(pen, _startPosX.Value +5, _startPosY.Value + 10, 5, 30);
//контейнер
g.FillRectangle(additionalBrush, _startPosX.Value + 3, _startPosY.Value + 5, 50, 13);
g.DrawRectangle(pen, _startPosX.Value + 3, _startPosY.Value + 5, 50, 13);
//ракеты
g.DrawRectangle(pen, _startPosX.Value + 52, _startPosY.Value + 5, 10, 3);
g.DrawRectangle(pen, _startPosX.Value + 52, _startPosY.Value + 10, 10, 3);
g.DrawRectangle(pen, _startPosX.Value + 52, _startPosY.Value + 15, 10, 3);
}
} }
} }

View File

@ -0,0 +1,39 @@
namespace SelfPropelledArtilleryUnit.Entities;
/// <summary>
/// Класс-сущность "САУ"
/// </summary>
public class EntityArtillery : EntityTank
{
/// <summary>
/// Дополнительный цвет (для опциональных элементов)
/// </summary>
public Color AdditionalColor { get; private set; }
/// <summary>
/// Признак (опция) наличия пушки
/// </summary>
public bool Cannon { get; private set; }
/// <summary>
/// Признак (опция) наличия залповой установки
/// </summary>
public bool Rocket { get; private set; }
/// <summary>
/// Инициализация полей объекта-класса спортивного автомобиля
/// </summary>
/// <param name="additionalColor">Дополнительный цвет</param>
/// <param name="cannon">Признак наличия пушки</param>
/// <param name="rocket">Признак наличия залповой установки</param>
public EntityArtillery(int speed, double weight, Color bodyColor, Color additionalColor, bool cannon, bool rocket) : base(speed, weight, bodyColor)
{
AdditionalColor = additionalColor;
Cannon = cannon;
Rocket = rocket;
}
}

View File

@ -0,0 +1,36 @@
namespace SelfPropelledArtilleryUnit.Entities;
/// <summary>
/// Класс-сущность "танк"
/// </summary>
public class EntityTank
{
/// <summary>
/// Скорость
/// </summary>
public int Speed { get; set; }
/// <summary>
/// Вес
/// </summary>
public double Weight { get; set; }
/// <summary>
/// Основной цвет
/// </summary>
public Color BodyColor { get; set; }
/// <summary>
/// Шаг перемещения автомобиля
/// </summary>
public double Step => Speed * 100 / Weight;
/// <summary>
/// Конструктор сущности
/// </summary>
public EntityTank(int speed, double weight, Color bodyColor)
{
Speed = speed;
Weight = weight;
BodyColor = bodyColor;
}
}

View File

@ -1,60 +0,0 @@
namespace SelfPropelledArtilleryUnit;
/// <summary>
/// Класс-сущность "САУ"
/// </summary>
public class EntityArtillery
{
/// <summary>
/// Скорость
/// </summary>
public int Speed { get; private set; }
/// <summary>
/// Вес
/// </summary>
public double Weight { get; private set; }
/// <summary>
/// Основной цвет
/// </summary>
public Color BodyColor { get; private set; }
/// <summary>
/// Дополнительный цвет (для опциональных элементов)
/// </summary>
public Color AdditionalColor { get; private set; }
/// <summary>
/// Признак (опция) наличия пушки
/// </summary>
public bool Cannon { get; private set; }
/// <summary>
/// Признак (опция) наличия залповой установки
/// </summary>
public bool Rocket { get; private set; }
/// <summary>
/// Шаг перемещения автомобиля
/// </summary>
public double Step => Speed * 100 / Weight;
/// <summary>
/// Инициализация полей объекта-класса спортивного автомобиля
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес автомобиля</param>
/// <param name="bodyColor">Основной цвет</param>
/// <param name="additionalColor">Дополнительный цвет</param>
/// <param name="cannon">Признак наличия пушки</param>
/// <param name="rocket">Признак наличия залповой установки</param>
public void Init(int speed, double weight, Color bodyColor, Color
additionalColor, bool cannon, bool rocket)
{
Speed = speed;
Weight = weight;
BodyColor = bodyColor;
AdditionalColor = additionalColor;
Cannon = cannon;
Rocket = rocket;
}
}

View File

@ -35,6 +35,7 @@
buttonUp = new Button(); buttonUp = new Button();
buttonDown = new Button(); buttonDown = new Button();
buttonRight = new Button(); buttonRight = new Button();
buttonCreateTank = new Button();
((System.ComponentModel.ISupportInitialize)pictureBoxArtillery).BeginInit(); ((System.ComponentModel.ISupportInitialize)pictureBoxArtillery).BeginInit();
SuspendLayout(); SuspendLayout();
// //
@ -52,9 +53,9 @@
buttonCreate.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; buttonCreate.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
buttonCreate.Location = new Point(12, 417); buttonCreate.Location = new Point(12, 417);
buttonCreate.Name = "buttonCreate"; buttonCreate.Name = "buttonCreate";
buttonCreate.Size = new Size(75, 23); buttonCreate.Size = new Size(90, 23);
buttonCreate.TabIndex = 1; buttonCreate.TabIndex = 1;
buttonCreate.Text = "Создать"; buttonCreate.Text = "Создать САУ";
buttonCreate.UseVisualStyleBackColor = true; buttonCreate.UseVisualStyleBackColor = true;
buttonCreate.Click += ButtonCreate_Click; buttonCreate.Click += ButtonCreate_Click;
// //
@ -106,11 +107,23 @@
buttonRight.UseVisualStyleBackColor = true; buttonRight.UseVisualStyleBackColor = true;
buttonRight.Click += ButtonMove_Click; buttonRight.Click += ButtonMove_Click;
// //
// buttonCreateTank
//
buttonCreateTank.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
buttonCreateTank.Location = new Point(117, 417);
buttonCreateTank.Name = "buttonCreateTank";
buttonCreateTank.Size = new Size(138, 23);
buttonCreateTank.TabIndex = 6;
buttonCreateTank.Text = "Создать самоходку";
buttonCreateTank.UseVisualStyleBackColor = true;
buttonCreateTank.Click += ButtonCreateTank_Click;
//
// FormArtillery // FormArtillery
// //
AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleMode = AutoScaleMode.Font; AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(800, 461); ClientSize = new Size(800, 461);
Controls.Add(buttonCreateTank);
Controls.Add(buttonRight); Controls.Add(buttonRight);
Controls.Add(buttonDown); Controls.Add(buttonDown);
Controls.Add(buttonUp); Controls.Add(buttonUp);
@ -131,5 +144,6 @@
private Button buttonUp; private Button buttonUp;
private Button buttonDown; private Button buttonDown;
private Button buttonRight; private Button buttonRight;
private Button buttonCreateTank;
} }
} }

View File

@ -7,12 +7,13 @@ using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows.Forms; using System.Windows.Forms;
using SelfPropelledArtilleryUnit.Drawnings;
namespace SelfPropelledArtilleryUnit namespace SelfPropelledArtilleryUnit
{ {
public partial class FormArtillery : Form public partial class FormArtillery : Form
{ {
private DrawningArtillery? _drawningArtillery; private DrawningTank? _drawningTank;
public FormArtillery() public FormArtillery()
{ {
@ -22,36 +23,56 @@ namespace SelfPropelledArtilleryUnit
private void Draw() private void Draw()
{ {
if (_drawningArtillery == null) if (_drawningTank == null)
{ {
return; return;
} }
Bitmap bmp = new(pictureBoxArtillery.Width, pictureBoxArtillery.Height); Bitmap bmp = new(pictureBoxArtillery.Width, pictureBoxArtillery.Height);
Graphics gr = Graphics.FromImage(bmp); Graphics gr = Graphics.FromImage(bmp);
_drawningArtillery.DrawTransport(gr); _drawningTank.DrawTransport(gr);
pictureBoxArtillery.Image = bmp; pictureBoxArtillery.Image = bmp;
} }
private void CreateObject(string type)
private void ButtonCreate_Click(object sender, EventArgs e)
{ {
Random random = new(); Random random = new();
_drawningArtillery = new DrawningArtillery(); switch (type)
_drawningArtillery.Init(random.Next(100, 300), random.Next(1000, 3000), {
case nameof(DrawningTank):
_drawningTank = new DrawningTank(random.Next(100, 300), random.Next(1000, 3000),
Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)));
break;
case nameof(DrawningArtillery):
_drawningTank = new DrawningArtillery(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)),
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)), Convert.ToBoolean(random.Next(0, 2)));
break;
_drawningArtillery.SetPictureSize(pictureBoxArtillery.Width, pictureBoxArtillery.Height); default:
_drawningArtillery.SetPosition(random.Next(10, 100), random.Next(10, 100)); return;
}
_drawningTank.SetPictureSize(pictureBoxArtillery.Width, pictureBoxArtillery.Height);
_drawningTank.SetPosition(random.Next(10, 100), random.Next(10, 100));
Draw(); Draw();
} }
/// <summary>
/// Обработка нажатия кнопки "Создать сау"
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonCreate_Click(object sender, EventArgs e) => CreateObject(nameof(DrawningArtillery));
/// <summary>
/// Обработка нажатия кнопки "Создать самоходку"
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonCreateTank_Click(object sender, EventArgs e) => CreateObject(nameof(DrawningTank));
private void ButtonMove_Click(object sender, EventArgs e) private void ButtonMove_Click(object sender, EventArgs e)
{ {
if (_drawningArtillery == null) if (_drawningTank == null)
{ {
return; return;
} }
@ -61,16 +82,16 @@ namespace SelfPropelledArtilleryUnit
switch (name) switch (name)
{ {
case "buttonUp": case "buttonUp":
result = _drawningArtillery.MoveTransport(DirectionType.Up); result = _drawningTank.MoveTransport(DirectionType.Up);
break; break;
case "buttonDown": case "buttonDown":
result = _drawningArtillery.MoveTransport(DirectionType.Down); result = _drawningTank.MoveTransport(DirectionType.Down);
break; break;
case "buttonLeft": case "buttonLeft":
result = _drawningArtillery.MoveTransport(DirectionType.Left); result = _drawningTank.MoveTransport(DirectionType.Left);
break; break;
case "buttonRight": case "buttonRight":
result = _drawningArtillery.MoveTransport(DirectionType.Right); result = _drawningTank.MoveTransport(DirectionType.Right);
break; break;
} }
@ -79,5 +100,7 @@ namespace SelfPropelledArtilleryUnit
Draw(); Draw();
} }
} }
} }
} }