diff --git a/ProjectPlane/ProjectPlane/AbstractMap.cs b/ProjectPlane/ProjectPlane/AbstractMap.cs index 9d4b84e..a864d09 100644 --- a/ProjectPlane/ProjectPlane/AbstractMap.cs +++ b/ProjectPlane/ProjectPlane/AbstractMap.cs @@ -18,6 +18,35 @@ namespace ProjectPlane protected readonly int _freeRoad = 0; protected readonly int _barrier = 1; + public bool IsMoveable(float x, float y) + { + var getPos = _drawingObject.GetCurrentPosition(); + int Right = Convert.ToInt32((getPos.Right + x) / _size_x) > 0 + + ? Convert.ToInt32((getPos.Right + x) / _size_x) : 0; + + int Left = Convert.ToInt32((getPos.Left + x) / _size_x) > 0 + + ? Convert.ToInt32((getPos.Left + x) / _size_x) : 0; + + int Top = Convert.ToInt32((getPos.Top + y) / _size_y) > 0 + + ? Convert.ToInt32((getPos.Top + y) / _size_y) : 0; + + int Bottom = Convert.ToInt32((getPos.Bottom + y) / _size_y) > 0 + + ? Convert.ToInt32((getPos.Bottom + y) / _size_y) : 0; + + for (int i = Left; i <= Right; i++) + { + for (int j = Top; j <= Bottom; j++) + { + if (_map[i, j] == _barrier) return false; + } + } + return true; + } + public Bitmap CreateMap(int width, int height, IDrawingObject drawingObject) { _width = width; @@ -32,8 +61,24 @@ namespace ProjectPlane } public Bitmap MoveObject(Direction direction) { - // TODO проверка, что объект может переместится в требуемом направлении - if (true) + bool isMoveable = false; + switch (direction) + { + case Direction.Right: + isMoveable = IsMoveable(_drawingObject.Step, 0); + break; + case Direction.Left: + isMoveable = IsMoveable(-_drawingObject.Step, 0); + break; + case Direction.Up: + isMoveable = IsMoveable(0, -_drawingObject.Step); + break; + case Direction.Down: + isMoveable = IsMoveable(0, _drawingObject.Step); + break; + } + + if (isMoveable) { _drawingObject.MoveObject(direction); } @@ -48,7 +93,19 @@ namespace ProjectPlane int x = _random.Next(0, 10); int y = _random.Next(0, 10); _drawingObject.SetObject(x, y, _width, _height); - // TODO првоерка, что объект не "накладывается" на закрытые участки + + while (!IsMoveable(0, 0)) + { + x += 5; + + if (x < _width) + { + x = 0; + y += 5; + } + _drawingObject.SetObject(x, y, _width, _height); + } + return true; } private Bitmap DrawMapWithObject() diff --git a/ProjectPlane/ProjectPlane/Direction.cs b/ProjectPlane/ProjectPlane/Direction.cs index ae7d03e..45ee136 100644 --- a/ProjectPlane/ProjectPlane/Direction.cs +++ b/ProjectPlane/ProjectPlane/Direction.cs @@ -8,6 +8,7 @@ namespace ProjectPlane { internal enum Direction { + None = 0, Up = 1, Down = 2, Left = 3, diff --git a/ProjectPlane/ProjectPlane/DrawingObject.cs b/ProjectPlane/ProjectPlane/DrawingObject.cs index dea2b94..18e6766 100644 --- a/ProjectPlane/ProjectPlane/DrawingObject.cs +++ b/ProjectPlane/ProjectPlane/DrawingObject.cs @@ -34,7 +34,7 @@ namespace ProjectPlane void IDrawingObject.DrawingObject(Graphics g) { - // TODO + _plane.DrawTransport(g); } } } diff --git a/ProjectPlane/ProjectPlane/DrawingPlane.cs b/ProjectPlane/ProjectPlane/DrawingPlane.cs index 67e6e3f..99ac952 100644 --- a/ProjectPlane/ProjectPlane/DrawingPlane.cs +++ b/ProjectPlane/ProjectPlane/DrawingPlane.cs @@ -38,14 +38,6 @@ namespace ProjectPlane /// private readonly int _planeHeight = 50; /// - /// Левый край - /// - private readonly int _minX = 5; - /// - /// Верхний край - /// - private readonly int _minY = 40; - /// /// Инициализация свойств /// /// Скорость @@ -80,14 +72,18 @@ namespace ProjectPlane public void SetPosition(int x, int y, int width, int height) { - if (x >= _minX && x <= width && y >= _minY && y <= height) + if (x < 0 || x + _planeWidth >= width) { - _startPosX = x; - _startPosY = y; - _pictureWidth = width; - _pictureHeight = height; + return; } - else SetPosition(_minX, _minY, width, height); + if (y < 0 || y + _planeHeight >= height) + { + return; + } + _startPosX = x; + _startPosY = y; + _pictureWidth = width; + _pictureHeight = height; } /// /// Изменение направления пермещения @@ -117,12 +113,11 @@ namespace ProjectPlane break; //вверх case Direction.Up: - if (_startPosY - Plane.Step > 35) + if (_startPosY - Plane.Step > 0) { _startPosY -= Plane.Step; } break; - break; //вниз case Direction.Down: if (_startPosY + _planeHeight + Plane.Step < _pictureHeight) @@ -146,74 +141,72 @@ namespace ProjectPlane //границы самолета Pen pen = new(Color.Black); - g.DrawEllipse(pen, _startPosX, _startPosY, 20, 20); + g.DrawEllipse(pen, _startPosX, _startPosY + 20, 20, 20); - g.DrawRectangle(pen, _startPosX + 8, _startPosY, 100, 20); + g.DrawRectangle(pen, _startPosX + 8, _startPosY + 20, 100, 20); Point[] Triangle0 = new Point[3]; - Triangle0[0].X = Convert.ToInt32(_startPosX + 108); Triangle0[0].Y = Convert.ToInt32(_startPosY - 2); - Triangle0[1].X = Convert.ToInt32(_startPosX + 125); Triangle0[1].Y = Convert.ToInt32(_startPosY + 10); - Triangle0[2].X = Convert.ToInt32(_startPosX + 108); Triangle0[2].Y = Convert.ToInt32(_startPosY + 10); + Triangle0[0].X = Convert.ToInt32(_startPosX + 108); Triangle0[0].Y = Convert.ToInt32(_startPosY + 18); + Triangle0[1].X = Convert.ToInt32(_startPosX + 125); Triangle0[1].Y = Convert.ToInt32(_startPosY + 30); + Triangle0[2].X = Convert.ToInt32(_startPosX + 108); Triangle0[2].Y = Convert.ToInt32(_startPosY + 30); g.DrawPolygon(pen, Triangle0); Point[] Triangle1 = new Point[3]; - Triangle1[0].X = Convert.ToInt32(_startPosX + 108); Triangle1[0].Y = Convert.ToInt32(_startPosY + 10); - Triangle1[1].X = Convert.ToInt32(_startPosX + 125); Triangle1[1].Y = Convert.ToInt32(_startPosY + 10); - Triangle1[2].X = Convert.ToInt32(_startPosX + 108); Triangle1[2].Y = Convert.ToInt32(_startPosY + 22); + Triangle1[0].X = Convert.ToInt32(_startPosX + 108); Triangle1[0].Y = Convert.ToInt32(_startPosY + 30); + Triangle1[1].X = Convert.ToInt32(_startPosX + 125); Triangle1[1].Y = Convert.ToInt32(_startPosY + 30); + Triangle1[2].X = Convert.ToInt32(_startPosX + 108); Triangle1[2].Y = Convert.ToInt32(_startPosY + 42); g.DrawPolygon(pen, Triangle1); Point[] Triangle = new Point[3]; - Triangle[0].X = Convert.ToInt32(_startPosX + 5); Triangle[0].Y = Convert.ToInt32(_startPosY); - Triangle[1].X = Convert.ToInt32(_startPosX + 5); Triangle[1].Y = Convert.ToInt32(_startPosY - 20); - Triangle[2].X = Convert.ToInt32(_startPosX + 35); Triangle[2].Y = Convert.ToInt32(_startPosY); + Triangle[0].X = Convert.ToInt32(_startPosX + 5); Triangle[0].Y = Convert.ToInt32(_startPosY + 20); + Triangle[1].X = Convert.ToInt32(_startPosX + 5); Triangle[1].Y = Convert.ToInt32(_startPosY); + Triangle[2].X = Convert.ToInt32(_startPosX + 35); Triangle[2].Y = Convert.ToInt32(_startPosY + 20); g.DrawPolygon(pen, Triangle); ////корпус - Brush br = new SolidBrush(Plane?.BodyColor ?? Color.Black); - g.FillEllipse(br, _startPosX, _startPosY, 20, 20); + g.FillEllipse(br, _startPosX, _startPosY + 20, 20, 20); - g.FillRectangle(br, _startPosX + 8, _startPosY, 100, 20); + g.FillRectangle(br, _startPosX + 8, _startPosY + 20, 100, 20); Point[] Triangle2 = new Point[3]; - Triangle2[0].X = Convert.ToInt32(_startPosX + 5); Triangle2[0].Y = Convert.ToInt32(_startPosY); - Triangle2[1].X = Convert.ToInt32(_startPosX + 5); Triangle2[1].Y = Convert.ToInt32(_startPosY - 20); - Triangle2[2].X = Convert.ToInt32(_startPosX + 35); Triangle2[2].Y = Convert.ToInt32(_startPosY); + Triangle2[0].X = Convert.ToInt32(_startPosX + 5); Triangle2[0].Y = Convert.ToInt32(_startPosY + 20); + Triangle2[1].X = Convert.ToInt32(_startPosX + 5); Triangle2[1].Y = Convert.ToInt32(_startPosY); //the highest point + Triangle2[2].X = Convert.ToInt32(_startPosX + 35); Triangle2[2].Y = Convert.ToInt32(_startPosY + 20); g.FillPolygon(br, Triangle2); Point[] Triangle4 = new Point[3]; - Triangle4[0].X = Convert.ToInt32(_startPosX + 108); Triangle4[0].Y = Convert.ToInt32(_startPosY + 10); - Triangle4[1].X = Convert.ToInt32(_startPosX + 125); Triangle4[1].Y = Convert.ToInt32(_startPosY + 10); - Triangle4[2].X = Convert.ToInt32(_startPosX + 108); Triangle4[2].Y = Convert.ToInt32(_startPosY + 22); + Triangle4[0].X = Convert.ToInt32(_startPosX + 108); Triangle4[0].Y = Convert.ToInt32(_startPosY + 30); + Triangle4[1].X = Convert.ToInt32(_startPosX + 125); Triangle4[1].Y = Convert.ToInt32(_startPosY + 30); + Triangle4[2].X = Convert.ToInt32(_startPosX + 108); Triangle4[2].Y = Convert.ToInt32(_startPosY + 42); g.FillPolygon(br, Triangle4); // window - Brush brBlue = new SolidBrush(Color.LightBlue); Brush brBlack = new SolidBrush(Color.Black); Point[] Triangle3 = new Point[3]; - Triangle3[0].X = Convert.ToInt32(_startPosX + 108); Triangle3[0].Y = Convert.ToInt32(_startPosY - 2); - Triangle3[1].X = Convert.ToInt32(_startPosX + 125); Triangle3[1].Y = Convert.ToInt32(_startPosY + 10); - Triangle3[2].X = Convert.ToInt32(_startPosX + 108); Triangle3[2].Y = Convert.ToInt32(_startPosY + 10); + Triangle3[0].X = Convert.ToInt32(_startPosX + 108); Triangle3[0].Y = Convert.ToInt32(_startPosY + 18); + Triangle3[1].X = Convert.ToInt32(_startPosX + 125); Triangle3[1].Y = Convert.ToInt32(_startPosY + 30); + Triangle3[2].X = Convert.ToInt32(_startPosX + 108); Triangle3[2].Y = Convert.ToInt32(_startPosY + 30); g.FillPolygon(brBlue, Triangle3); - g.DrawLine(pen, _startPosX + 37, _startPosY + 20, _startPosX + 37, _startPosY + 25); - g.DrawLine(pen, _startPosX + 32, _startPosY + 25, _startPosX + 40, _startPosY + 25); - g.FillRectangle(brBlack, _startPosX + 32, _startPosY + 25, 3, 3); - g.FillRectangle(brBlack, _startPosX + 39, _startPosY + 25, 3, 3); + g.DrawLine(pen, _startPosX + 37, _startPosY + 40, _startPosX + 37, _startPosY + 45); + g.DrawLine(pen, _startPosX + 32, _startPosY + 45, _startPosX + 40, _startPosY + 45); + g.FillRectangle(brBlack, _startPosX + 32, _startPosY + 45, 3, 3); + g.FillRectangle(brBlack, _startPosX + 39, _startPosY + 45, 3, 3); - g.DrawLine(pen, _startPosX + 102, _startPosY + 20, _startPosX + 102, _startPosY + 25); - g.FillRectangle(brBlack, _startPosX + 101, _startPosY + 25, 3, 3); + g.DrawLine(pen, _startPosX + 102, _startPosY + 40, _startPosX + 102, _startPosY + 45); + g.FillRectangle(brBlack, _startPosX + 101, _startPosY + 45, 3, 3); - g.FillRectangle(brBlack, _startPosX + 5, _startPosY - 2, 18, 7); - g.FillEllipse(brBlack, _startPosX, _startPosY - 2, 7, 7); - g.FillEllipse(brBlack, _startPosX + 20, _startPosY - 2, 7, 7); + g.FillRectangle(brBlack, _startPosX + 5, _startPosY + 18, 18, 7); + g.FillEllipse(brBlack, _startPosX, _startPosY + 18, 7, 7); + g.FillEllipse(brBlack, _startPosX + 20, _startPosY + 18, 7, 7); - g.FillRectangle(brBlack, _startPosX + 41, _startPosY + 8, 42, 4); - g.FillEllipse(brBlack, _startPosX + 39, _startPosY + 8, 4, 4); - g.FillEllipse(brBlack, _startPosX + 81, _startPosY + 8, 4, 4); + g.FillRectangle(brBlack, _startPosX + 41, _startPosY + 28, 42, 4); + g.FillEllipse(brBlack, _startPosX + 39, _startPosY + 28, 4, 4); + g.FillEllipse(brBlack, _startPosX + 81, _startPosY + 28, 4, 4); } /// /// Смена границ формы отрисовки diff --git a/ProjectPlane/ProjectPlane/DrawingWarPlane.cs b/ProjectPlane/ProjectPlane/DrawingWarPlane.cs index 2353084..4e53212 100644 --- a/ProjectPlane/ProjectPlane/DrawingWarPlane.cs +++ b/ProjectPlane/ProjectPlane/DrawingWarPlane.cs @@ -41,9 +41,9 @@ namespace ProjectPlane if (warplane.SuperTurbine) { - g.FillRectangle(Brush, _startPosX, _startPosY, 30, 22); - g.DrawLine(pen, _startPosX, _startPosY + 22, _startPosX + 30, _startPosY + 22); - g.DrawLine(pen, _startPosX, _startPosY, _startPosX + 30, _startPosY); + g.FillRectangle(dopBrush, _startPosX, _startPosY + 20, 30, 22); + g.DrawLine(pen, _startPosX, _startPosY + 42, _startPosX + 30, _startPosY + 42); + g.DrawLine(pen, _startPosX, _startPosY + 20, _startPosX + 30, _startPosY + 20); } _startPosX += 10; @@ -54,8 +54,8 @@ namespace ProjectPlane if (warplane.IsBomber) { - g.FillEllipse(brBlack, _startPosX + 88, _startPosY, 4, 4); - g.FillRectangle(Brush, _startPosX + 60, _startPosY, 30, 12); + g.FillEllipse(brBlack, _startPosX + 88, _startPosY + 20, 4, 4); + g.FillRectangle(Brush, _startPosX + 60, _startPosY + 20, 30, 12); } @@ -64,16 +64,16 @@ namespace ProjectPlane if (warplane.IsFighter) { Point[] Nose = new Point[4]; - Nose[0].X = Convert.ToInt32(_startPosX + 118); Nose[0].Y = Convert.ToInt32(_startPosY + 2); - Nose[1].X = Convert.ToInt32(_startPosX + 155); Nose[1].Y = Convert.ToInt32(_startPosY + 2); - Nose[2].X = Convert.ToInt32(_startPosX + 118); Nose[2].Y = Convert.ToInt32(_startPosY + 25); - Nose[3].X = Convert.ToInt32(_startPosX + 98); Nose[3].Y = Convert.ToInt32(_startPosY + 25); + Nose[0].X = Convert.ToInt32(_startPosX + 118); Nose[0].Y = Convert.ToInt32(_startPosY + 22); + Nose[1].X = Convert.ToInt32(_startPosX + 155); Nose[1].Y = Convert.ToInt32(_startPosY + 22); + Nose[2].X = Convert.ToInt32(_startPosX + 118); Nose[2].Y = Convert.ToInt32(_startPosY + 45); + Nose[3].X = Convert.ToInt32(_startPosX + 98); Nose[3].Y = Convert.ToInt32(_startPosY + 45); g.FillPolygon(Brush, Nose); Point[] NoseWin = new Point[3]; - NoseWin[0].X = Convert.ToInt32(_startPosX + 120); NoseWin[0].Y = Convert.ToInt32(_startPosY + 4); - NoseWin[1].X = Convert.ToInt32(_startPosX + 148); NoseWin[1].Y = Convert.ToInt32(_startPosY + 4); - NoseWin[2].X = Convert.ToInt32(_startPosX + 132); NoseWin[2].Y = Convert.ToInt32(_startPosY + 14); + NoseWin[0].X = Convert.ToInt32(_startPosX + 120); NoseWin[0].Y = Convert.ToInt32(_startPosY + 24); + NoseWin[1].X = Convert.ToInt32(_startPosX + 148); NoseWin[1].Y = Convert.ToInt32(_startPosY + 24); + NoseWin[2].X = Convert.ToInt32(_startPosX + 132); NoseWin[2].Y = Convert.ToInt32(_startPosY + 34); g.FillPolygon(brBlue, NoseWin); } diff --git a/ProjectPlane/ProjectPlane/FormMap.Designer.cs b/ProjectPlane/ProjectPlane/FormMap.Designer.cs index 77e026f..ebc5468 100644 --- a/ProjectPlane/ProjectPlane/FormMap.Designer.cs +++ b/ProjectPlane/ProjectPlane/FormMap.Designer.cs @@ -20,6 +20,10 @@ base.Dispose(disposing); } + private void statusStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e) + { + + } #region Windows Form Designer generated code /// diff --git a/ProjectPlane/ProjectPlane/FormMap.cs b/ProjectPlane/ProjectPlane/FormMap.cs index 680c02b..4a39c0e 100644 --- a/ProjectPlane/ProjectPlane/FormMap.cs +++ b/ProjectPlane/ProjectPlane/FormMap.cs @@ -16,13 +16,14 @@ namespace ProjectPlane public FormMap() { InitializeComponent(); + _abstractMap = new SimpleMap(); } - - private void SetData() + /// + private void SetData(DrawingPlane plane) { - toolStripStatusLabelSpeed.Text = $"Скорость: {plane.Plane.Speed}"; - toolStripStatusLabelWeight.Text = $"Вес: {plane.Plane.Weight}"; - toolStripStatusLabelBodyColor.Text = $"Цвет: {plane.Plane.BodyColor.Name}"; + toolStripStatusLabelSpeed.Text = $"Speed: {plane.Plane.Speed}"; + toolStripStatusLabelWeight.Text = $"Weight: {plane.Plane.Weight}"; + toolStripStatusLabelBodyColor.Text = $"Color: {plane.Plane.BodyColor.Name}"; pictureBoxPlane.Image = _abstractMap.CreateMap(pictureBoxPlane.Width, pictureBoxPlane.Height, new DrawingObject(plane)); } @@ -61,11 +62,7 @@ namespace ProjectPlane SetData(plane); } - private void PictureBoxPlane_Resize(object sender, EventArgs e) - { - _plane?.ChangeBorders(pictureBoxPlane.Width, pictureBoxPlane.Height); - Draw(); - } + /// /// Обработка нажатия кнопки "Модификация" /// @@ -74,15 +71,14 @@ namespace ProjectPlane private void buttonCreateModif_Click(object sender, EventArgs e) { Random rnd = new(); - _plane = new DrawingWarPlane(rnd.Next(100, 300), rnd.Next(1000, 2000), + var _plane = new DrawingWarPlane(rnd.Next(100, 300), rnd.Next(1000, 2000), Color.FromArgb(rnd.Next(0, 256), rnd.Next(0, 256), rnd.Next(0, 256)), Color.FromArgb(rnd.Next(0, 256), rnd.Next(0, 256), rnd.Next(0, 256)), Convert.ToBoolean(rnd.Next(0, 2)), Convert.ToBoolean(rnd.Next(0, 2)), Convert.ToBoolean(rnd.Next(0, 2))); - SetData(); - Draw(); + SetData(_plane); } } } -} + diff --git a/ProjectPlane/ProjectPlane/FormPlane.Designer.cs b/ProjectPlane/ProjectPlane/FormPlane.Designer.cs index 3c1cd77..06e5038 100644 --- a/ProjectPlane/ProjectPlane/FormPlane.Designer.cs +++ b/ProjectPlane/ProjectPlane/FormPlane.Designer.cs @@ -19,7 +19,10 @@ } base.Dispose(disposing); } + private void statusStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e) + { + } #region Windows Form Designer generated code /// @@ -114,6 +117,7 @@ this.statusStrip1.Size = new System.Drawing.Size(800, 22); this.statusStrip1.TabIndex = 9; this.statusStrip1.Text = "statusStrip1"; + this.statusStrip1.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.statusStrip1_ItemClicked); // // toolStripStatusLabelSpeed // diff --git a/ProjectPlane/ProjectPlane/FormPlane.cs b/ProjectPlane/ProjectPlane/FormPlane.cs index 795d7a1..35aa65e 100644 --- a/ProjectPlane/ProjectPlane/FormPlane.cs +++ b/ProjectPlane/ProjectPlane/FormPlane.cs @@ -82,5 +82,7 @@ SetData(); Draw(); } + + } } \ No newline at end of file diff --git a/ProjectPlane/ProjectPlane/Program.cs b/ProjectPlane/ProjectPlane/Program.cs index 23d8582..bce2d5a 100644 --- a/ProjectPlane/ProjectPlane/Program.cs +++ b/ProjectPlane/ProjectPlane/Program.cs @@ -9,7 +9,7 @@ namespace ProjectPlane static void Main() { ApplicationConfiguration.Initialize(); - Application.Run(new FormPlane()); + Application.Run(new FormMap()); } } } \ No newline at end of file