diff --git a/AirBomber/AirBomber/DrawningAirBomber.cs b/AirBomber/AirBomber/DrawningAirBomber.cs
index 69c74da..088096c 100644
--- a/AirBomber/AirBomber/DrawningAirBomber.cs
+++ b/AirBomber/AirBomber/DrawningAirBomber.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
+using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
@@ -22,30 +23,23 @@ namespace AirBomber
///
/// Ширина прорисовки бомбардировщика
///
- private readonly int _bomberWidth = 110;
+ private readonly int _bomberWidth = 150;
///
/// Высота прорисовки бомбардировщика
///
- private readonly int _bomberHeight = 60;
- ///
- /// Инициализация свойств
- ///
- /// Скорость
- /// Вес
- /// Цвет кузова
- /// Дополнительный цвет
- /// Признак наличия бомб
- /// Признак наличия топливных баков
- /// Ширина картинки
- /// Высота картинки
+ private readonly int _bomberHeight = 120;
/// true - объект создан, false - проверка не пройдена, нельзя создать объект в этих размерах
- public bool Init(int speed, double weight, Color bodyColor, Color additionalColor, bool bombs, bool fuelTanks, int width, int height)
+ public bool Init(int speed, double weight, Color bodyColor, Color additionalColor, bool bombs, Color bombsColor, bool fuelTanks, int width, int height)
{
// TODO: Продумать проверки
_pictureWidth = width;
_pictureHeight = height;
+ if (width < _bomberWidth || height < _bomberHeight)
+ {
+ return false;
+ }
EntityAirBomber = new EntityAirBomber();
- EntityAirBomber.Init(speed, weight, bodyColor, additionalColor, bombs, fuelTanks);
+ EntityAirBomber.Init(speed, weight, bodyColor, additionalColor, bombs, bombsColor, fuelTanks);
return true;
}
///
@@ -55,7 +49,14 @@ namespace AirBomber
/// Координата Y
public void SetPosition(int x, int y)
{
- // TODO: Изменение x, y
+ if (x < 0 || x + _bomberWidth > _pictureWidth)
+ {
+ x = 15;
+ }
+ if (y < 0 || y + _bomberHeight > _pictureHeight)
+ {
+ y = 15;
+ }
_startPosX = x;
_startPosY = y;
}
@@ -71,140 +72,140 @@ namespace AirBomber
}
switch (direction)
{
- //влево
case DirectionType.Left:
if (_startPosX - EntityAirBomber.Step > 0)
{
_startPosX -= (int)EntityAirBomber.Step;
}
break;
- //вверх
case DirectionType.Up:
if (_startPosY - EntityAirBomber.Step > 0)
{
_startPosY -= (int)EntityAirBomber.Step;
}
break;
- // вправо
case DirectionType.Right:
- // TODO: Продумать логику
+ if (_startPosX + EntityAirBomber.Step + _bomberWidth < _pictureWidth)
+ {
+ _startPosX += (int)EntityAirBomber.Step;
+ }
break;
- //вниз
case DirectionType.Down:
- // TODO: Продумать логику
+ if (_startPosY + EntityAirBomber.Step + _bomberHeight < _pictureHeight)
+ {
+ _startPosY += (int)EntityAirBomber.Step;
+ }
break;
}
}
- ///
- /// Прорисовка объекта
- ///
- ///
- public void DrawTransport(Graphics g)
+ public void DrawBomber(Graphics g)
{
if (EntityAirBomber == null)
{
return;
}
Pen pen = new(Color.Black);
- Brush additionalBrush = new
- SolidBrush(EntityAirBomber.AdditionalColor);
- // обвесы
+ Brush additionalBrush = new SolidBrush(EntityAirBomber.AdditionalColor);
+ Brush bodyColor = new SolidBrush(EntityAirBomber.BodyColor);
+ Brush bombsColor = new SolidBrush(EntityAirBomber.BombsColor);
+ Brush wingsColor = new SolidBrush(Color.DeepPink);
+ // bombs
if (EntityAirBomber.Bombs)
{
- g.DrawEllipse(pen, _startPosX + 90, _startPosY, 20, 20);
- g.DrawEllipse(pen, _startPosX + 90, _startPosY + 40, 20,
- 20);
- g.DrawRectangle(pen, _startPosX + 90, _startPosY + 10,
- 20, 40);
- g.DrawRectangle(pen, _startPosX + 90, _startPosY, 15,
- 15);
- g.DrawRectangle(pen, _startPosX + 90, _startPosY + 45,
- 15, 15);
- g.FillEllipse(additionalBrush, _startPosX + 90,
- _startPosY, 20, 20);
- g.FillEllipse(additionalBrush, _startPosX + 90,
- _startPosY + 40, 20, 20);
- g.FillRectangle(additionalBrush, _startPosX + 90,
- _startPosY + 10, 20, 40);
- g.FillRectangle(additionalBrush, _startPosX + 90, _startPosY + 1, 15, 15);
- g.FillRectangle(additionalBrush, _startPosX + 90,
- _startPosY + 45, 15, 15);
- g.DrawEllipse(pen, _startPosX, _startPosY, 20, 20);
- g.DrawEllipse(pen, _startPosX, _startPosY + 40, 20, 20);
- g.DrawRectangle(pen, _startPosX, _startPosY + 10, 20,
- 40);
- g.DrawRectangle(pen, _startPosX + 5, _startPosY, 14,
- 15);
- g.DrawRectangle(pen, _startPosX + 5, _startPosY + 45,
- 14, 15);
- g.FillEllipse(additionalBrush, _startPosX, _startPosY,
- 20, 20);
- g.FillEllipse(additionalBrush, _startPosX, _startPosY +
- 40, 20, 20);
- g.FillRectangle(additionalBrush, _startPosX + 1,
- _startPosY + 10, 25, 40);
- g.FillRectangle(additionalBrush, _startPosX + 5,
- _startPosY + 1, 15, 15);
- g.FillRectangle(additionalBrush, _startPosX + 5,
- _startPosY + 45, 15, 15);
- g.DrawRectangle(pen, _startPosX + 35, _startPosY, 39,
- 15);
- g.DrawRectangle(pen, _startPosX + 35, _startPosY + 45,
- 39, 15);
- g.FillRectangle(additionalBrush, _startPosX + 35,
- _startPosY + 1, 40, 15);
- g.FillRectangle(additionalBrush, _startPosX + 35,
- _startPosY + 45, 40, 15);
+ g.FillEllipse(bombsColor, _startPosX + 90, _startPosY + 20, 15, 29);
+ g.DrawEllipse(pen, _startPosX + 90, _startPosY + 20, 15, 29);
+ g.FillEllipse(bombsColor, _startPosX + 90, _startPosY + 70, 15, 29);
+ g.DrawEllipse(pen, _startPosX + 90, _startPosY + 70, 15, 29);
+
}
- //границы автомобиля
- g.DrawEllipse(pen, _startPosX + 10, _startPosY + 5, 20, 20);
- g.DrawEllipse(pen, _startPosX + 10, _startPosY + 35, 20, 20);
- g.DrawEllipse(pen, _startPosX + 80, _startPosY + 5, 20, 20);
- g.DrawEllipse(pen, _startPosX + 80, _startPosY + 35, 20, 20);
- g.DrawRectangle(pen, _startPosX + 9, _startPosY + 15, 10, 30);
- g.DrawRectangle(pen, _startPosX + 90, _startPosY + 15, 10,
- 30);
- g.DrawRectangle(pen, _startPosX + 20, _startPosY + 4, 70, 52);
- //задние фары
- Brush brRed = new SolidBrush(Color.Red);
- g.FillEllipse(brRed, _startPosX + 10, _startPosY + 5, 20, 20);
- g.FillEllipse(brRed, _startPosX + 10, _startPosY + 35, 20,
- 20);
- //передние фары
- Brush brYellow = new SolidBrush(Color.Yellow);
- g.FillEllipse(brYellow, _startPosX + 80, _startPosY + 5, 20,
- 20);
- g.FillEllipse(brYellow, _startPosX + 80, _startPosY + 35, 20,
- 20);
- //кузов
- Brush br = new SolidBrush(EntityAirBomber.BodyColor);
- g.FillRectangle(br, _startPosX + 10, _startPosY + 15, 10, 30);
- g.FillRectangle(br, _startPosX + 90, _startPosY + 15, 10, 30);
- g.FillRectangle(br, _startPosX + 20, _startPosY + 5, 70, 50);
- //стекла
- Brush brBlue = new SolidBrush(Color.LightBlue);
- g.FillRectangle(brBlue, _startPosX + 70, _startPosY + 10, 5,
- 40);
- g.FillRectangle(brBlue, _startPosX + 30, _startPosY + 10, 5,
- 40);
- g.FillRectangle(brBlue, _startPosX + 35, _startPosY + 8, 35,
- 2);
- g.FillRectangle(brBlue, _startPosX + 35, _startPosY + 51, 35,
- 2);
- //выделяем рамкой крышу
- g.DrawRectangle(pen, _startPosX + 35, _startPosY + 10, 35,
- 40);
- g.DrawRectangle(pen, _startPosX + 75, _startPosY + 15, 25,
- 30);
- g.DrawRectangle(pen, _startPosX + 10, _startPosY + 15, 15,
- 30);
- // крыло
+ //границы бомбера
+ g.FillPolygon(additionalBrush, new Point[] //nose
+ {
+ new Point(_startPosX + 19, _startPosY + 50),
+ new Point(_startPosX + 19, _startPosY + 69),
+ new Point(_startPosX + 1, _startPosY + 59),
+ }
+ );
+ g.FillRectangle(bodyColor, _startPosX + 20, _startPosY + 50, 120, 20); //korpus
+ g.FillPolygon(additionalBrush, new Point[] //up left wing
+ {
+ new Point(_startPosX + 36, _startPosY + 49),
+ new Point(_startPosX + 36, _startPosY + 1),
+ new Point(_startPosX + 45, _startPosY + 1),
+ new Point(_startPosX + 55, _startPosY + 49),
+ }
+ );
+ g.FillPolygon(additionalBrush, new Point[] //down left wing
+ {
+ new Point(_startPosX + 36, _startPosY + 71),
+ new Point(_startPosX + 36, _startPosY + 116),
+ new Point(_startPosX + 45, _startPosY + 116),
+ new Point(_startPosX + 54, _startPosY + 71),
+ }
+ );
+ g.FillPolygon(wingsColor, new Point[] //up right wing
+ {
+ new Point(_startPosX + 120, _startPosY + 49),
+ new Point(_startPosX + 120, _startPosY + 42),
+ new Point(_startPosX + 140, _startPosY + 7),
+ new Point(_startPosX + 140, _startPosY + 49),
+ }
+ );
+ g.FillPolygon(wingsColor, new Point[] //down right wing
+ {
+ new Point(_startPosX + 120, _startPosY + 70),
+ new Point(_startPosX + 120, _startPosY + 77),
+ new Point(_startPosX + 140, _startPosY + 112),
+ new Point(_startPosX + 140, _startPosY + 70),
+ }
+ );
+
+ g.DrawPolygon(pen, new Point[] //nose
+ {
+ new Point(_startPosX + 20, _startPosY + 49),
+ new Point(_startPosX + 20, _startPosY + 70),
+ new Point(_startPosX, _startPosY + 59),
+ }
+ );
+ g.DrawRectangle(pen, _startPosX + 19, _startPosY + 49, 121, 21); //корпус
+ g.DrawPolygon(pen, new Point[] //верхнее left крыло
+ {
+ new Point(_startPosX + 35, _startPosY + 49),
+ new Point(_startPosX + 35, _startPosY),
+ new Point(_startPosX + 45, _startPosY),
+ new Point(_startPosX + 55, _startPosY + 49),
+ }
+ );
+ g.DrawPolygon(pen, new Point[] //нижнее left крыло
+ {
+ new Point(_startPosX + 36, _startPosY + 71),
+ new Point(_startPosX + 36, _startPosY + 116),
+ new Point(_startPosX + 45, _startPosY + 116),
+ new Point(_startPosX + 54, _startPosY + 71),
+ }
+ );
+ g.DrawPolygon(pen, new Point[] //up right крыло
+ {
+ new Point(_startPosX + 120, _startPosY + 49),
+ new Point(_startPosX + 120, _startPosY + 42),
+ new Point(_startPosX + 140, _startPosY + 7),
+ new Point(_startPosX + 140, _startPosY + 49),
+ }
+ );
+ g.DrawPolygon(pen, new Point[] //down right крыло
+ {
+ new Point(_startPosX + 120, _startPosY + 70),
+ new Point(_startPosX + 120, _startPosY + 77),
+ new Point(_startPosX + 140, _startPosY + 112),
+ new Point(_startPosX + 140, _startPosY + 70),
+ }
+ );
if (EntityAirBomber.FuelTanks)
{
- g.FillRectangle(additionalBrush, _startPosX, _startPosY
- + 5, 10, 50);
- g.DrawRectangle(pen, _startPosX, _startPosY + 5, 10,
- 50);
+ g.FillRectangle(additionalBrush, _startPosX + 63, _startPosY + 34, 20, 15);
+ g.DrawRectangle(pen, _startPosX + 63, _startPosY + 34, 20, 15);
+ g.FillRectangle(additionalBrush, _startPosX + 63, _startPosY + 70, 20, 15);
+ g.DrawRectangle(pen, _startPosX + 63, _startPosY + 70, 20, 15);
}
}
}
diff --git a/AirBomber/AirBomber/EntityAirBomber.cs b/AirBomber/AirBomber/EntityAirBomber.cs
index a4907a1..133015d 100644
--- a/AirBomber/AirBomber/EntityAirBomber.cs
+++ b/AirBomber/AirBomber/EntityAirBomber.cs
@@ -13,7 +13,8 @@ namespace AirBomber
public double Weight { get; private set; }
public Color BodyColor { get; private set; }
public Color AdditionalColor { get; private set; }
- public bool Bombs { get; private set; }
+ public bool Bombs { get; private set; }
+ public Color BombsColor { get; private set; }
public bool FuelTanks { get; private set; }
public double Step => (double)Speed * 100 / Weight;
///
@@ -26,13 +27,14 @@ namespace AirBomber
/// Признак наличия бомб
/// Признак наличия топливных баков
public void Init(int speed, double weight, Color bodyColor, Color
- additionalColor, bool bombs, bool fuelTanks)
+ additionalColor, bool bombs, Color bombsColor, bool fuelTanks)
{
Speed = speed;
Weight = weight;
BodyColor = bodyColor;
AdditionalColor = additionalColor;
Bombs = bombs;
+ BombsColor = bombsColor;
FuelTanks = fuelTanks;
}
diff --git a/AirBomber/AirBomber/FormAirBomber.Designer.cs b/AirBomber/AirBomber/FormAirBomber.Designer.cs
index 6ad235b..5e931c9 100644
--- a/AirBomber/AirBomber/FormAirBomber.Designer.cs
+++ b/AirBomber/AirBomber/FormAirBomber.Designer.cs
@@ -33,6 +33,8 @@
buttonLeft = new Button();
buttonRight = new Button();
buttonUp = new Button();
+ pictureBoxAirBomber = new PictureBox();
+ ((System.ComponentModel.ISupportInitialize)pictureBoxAirBomber).BeginInit();
SuspendLayout();
//
// buttonCreate
@@ -44,6 +46,7 @@
buttonCreate.TabIndex = 0;
buttonCreate.Text = "Создать";
buttonCreate.UseVisualStyleBackColor = true;
+ buttonCreate.Click += buttonCreate_Click;
//
// buttonDown
//
@@ -55,6 +58,7 @@
buttonDown.Size = new Size(30, 30);
buttonDown.TabIndex = 1;
buttonDown.UseVisualStyleBackColor = true;
+ buttonDown.Click += buttonMove_Click;
//
// buttonLeft
//
@@ -66,6 +70,7 @@
buttonLeft.Size = new Size(30, 30);
buttonLeft.TabIndex = 2;
buttonLeft.UseVisualStyleBackColor = true;
+ buttonLeft.Click += buttonMove_Click;
//
// buttonRight
//
@@ -77,6 +82,7 @@
buttonRight.Size = new Size(30, 30);
buttonRight.TabIndex = 3;
buttonRight.UseVisualStyleBackColor = true;
+ buttonRight.Click += buttonMove_Click;
//
// buttonUp
//
@@ -88,6 +94,17 @@
buttonUp.Size = new Size(30, 30);
buttonUp.TabIndex = 4;
buttonUp.UseVisualStyleBackColor = true;
+ buttonUp.Click += buttonMove_Click;
+ //
+ // pictureBoxAirBomber
+ //
+ pictureBoxAirBomber.BackColor = SystemColors.Control;
+ pictureBoxAirBomber.Dock = DockStyle.Fill;
+ pictureBoxAirBomber.Location = new Point(0, 0);
+ pictureBoxAirBomber.Name = "pictureBoxAirBomber";
+ pictureBoxAirBomber.Size = new Size(986, 540);
+ pictureBoxAirBomber.TabIndex = 5;
+ pictureBoxAirBomber.TabStop = false;
//
// FormAirBomber
//
@@ -99,8 +116,10 @@
Controls.Add(buttonLeft);
Controls.Add(buttonDown);
Controls.Add(buttonCreate);
+ Controls.Add(pictureBoxAirBomber);
Name = "FormAirBomber";
- Text = "Form1";
+ Text = "Бомбардировщик";
+ ((System.ComponentModel.ISupportInitialize)pictureBoxAirBomber).EndInit();
ResumeLayout(false);
}
@@ -111,5 +130,6 @@
private Button buttonLeft;
private Button buttonRight;
private Button buttonUp;
+ private PictureBox pictureBoxAirBomber;
}
}
\ No newline at end of file
diff --git a/AirBomber/AirBomber/FormAirBomber.cs b/AirBomber/AirBomber/FormAirBomber.cs
index e998b26..b2b6357 100644
--- a/AirBomber/AirBomber/FormAirBomber.cs
+++ b/AirBomber/AirBomber/FormAirBomber.cs
@@ -1,10 +1,70 @@
-namespace AirBomber
+namespace AirBomber
{
public partial class FormAirBomber : Form
{
+ ///
+ /// Поле-объект для прорисовки объекта
+ ///
+ private DrawningAirBomber? _drawningAirBomber;
+
public FormAirBomber()
{
InitializeComponent();
}
+ private void Draw()
+ {
+ if (_drawningAirBomber == null)
+ {
+ return;
+ }
+ Bitmap bmp = new(pictureBoxAirBomber.Width, pictureBoxAirBomber.Height);
+ Graphics gr = Graphics.FromImage(bmp);
+ _drawningAirBomber.DrawBomber(gr);
+ pictureBoxAirBomber.Image = bmp;
+ }
+ ///
+ /// Обработка нажатия кнопки "Создать"
+ ///
+ ///
+ ///
+ private void buttonCreate_Click(object sender, EventArgs e)
+ {
+ Random random = new();
+ _drawningAirBomber = new DrawningAirBomber();
+ _drawningAirBomber.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)),
+ Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)),
+ Convert.ToBoolean(random.Next(0, 2)), pictureBoxAirBomber.Width, pictureBoxAirBomber.Height); _drawningAirBomber.SetPosition(random.Next(10, 100), random.Next(10, 100));
+ Draw();
+ }
+ ///
+ /// Изменение размеров формы
+ ///
+ ///
+ ///
+ private void buttonMove_Click(object sender, EventArgs e)
+ {
+ if (_drawningAirBomber == null)
+ {
+ return;
+ }
+ string name = ((Button)sender)?.Name ?? string.Empty;
+ switch (name)
+ {
+ case "buttonUp":
+ _drawningAirBomber.MoveTransport(DirectionType.Up);
+ break;
+ case "buttonDown":
+ _drawningAirBomber.MoveTransport(DirectionType.Down);
+ break;
+ case "buttonLeft":
+ _drawningAirBomber.MoveTransport(DirectionType.Left);
+ break;
+ case "buttonRight":
+ _drawningAirBomber.MoveTransport(DirectionType.Right);
+ break;
+ }
+ Draw();
+ }
}
}
\ No newline at end of file