diff --git a/AirFighter/AirFighter/AbstractMap.cs b/AirFighter/AirFighter/AbstractMap.cs new file mode 100644 index 0000000..c8d3134 --- /dev/null +++ b/AirFighter/AirFighter/AbstractMap.cs @@ -0,0 +1,162 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AirFighter +{ + internal abstract class AbstractMap + { + private IDrawingObject _drawningObject = null; + protected int[,] _map = null; + protected int _width; + protected int _height; + protected float _size_x; + protected float _size_y; + protected readonly Random _random = new(); + protected readonly int _freeRoad = 0; + protected readonly int _barrier = 1; + public Bitmap CreateMap(int width, int height, IDrawingObject drawningObject) + { + _width = width; + _height = height; + _drawningObject = drawningObject; + GenerateMap(); + while (!SetObjectOnMap()) + { + GenerateMap(); + } + return DrawMapWithObject(); + } + + private (int mapI, int mapJ) checkBarrier((float Left, float Right, float Top, float Bottom) rect) + { + for (int i = (int)(rect.Top / _size_y); i <= (int)(rect.Bottom / _size_y); ++i) + { + for (int j = (int)(rect.Left / _size_x); j <= (int)(rect.Right / _size_x); ++j) + { + if (_map[i, j] == _barrier) return (i, j); + } + } + + return (-1, -1); + } + public Bitmap MoveObject(Direction direction) + { + // TODO проверка, что объект может переместится в требуемом + + var position = _drawningObject.GetCurrentPosition(); + + float drawningWidth = position.Right - position.Left; + float drawningHeight = position.Bottom - position.Top; + + if (direction == Direction.Left) position.Left -= _drawningObject.Step; + if (direction == Direction.Right) position.Left += _drawningObject.Step; + if (direction == Direction.Up) position.Top -= _drawningObject.Step; + if (direction == Direction.Down) position.Top += _drawningObject.Step; + + position.Right = position.Left + drawningWidth; + position.Bottom = position.Top + drawningHeight; + + var currentBarrier = checkBarrier(position); + + if (currentBarrier.mapI == -1) + { + _drawningObject.MoveObject(direction); + } + + else if (direction == Direction.Left) + position.Left = (currentBarrier.mapJ + 1) * _size_x + 1; + + else if (direction == Direction.Right) + position.Left = currentBarrier.mapJ * _size_x - drawningWidth - 1; + + else if (direction == Direction.Up) + position.Top = (currentBarrier.mapI + 1) * _size_y + 1; + + else if (direction == Direction.Down) + position.Top = currentBarrier.mapI * _size_y - drawningHeight - 1; + + if (currentBarrier.mapI != -1) + _drawningObject.SetObject((int)position.Left, (int)position.Top, _width, _height); + + return DrawMapWithObject(); + } + private bool SetObjectOnMap() + { + if (_drawningObject == null || _map == null) + { + return false; + } + int x = _random.Next(0, 10); + int y = _random.Next(0, 10); + _drawningObject.SetObject(x, y, _width, _height); + // TODO првоерка, что объект не "накладывается" на закрытые участки + + var position = _drawningObject.GetCurrentPosition(); + float drawningWidth = position.Right - position.Left; + float drawningHeight = position.Bottom - position.Top; + + var currentBarrier = checkBarrier(position); + int minRowIndex = _map.GetLength(0); + + while(currentBarrier.mapI != -1) + { + minRowIndex = currentBarrier.mapI < minRowIndex ? currentBarrier.mapI : minRowIndex; + + position.Left = (currentBarrier.mapJ + 1) * _size_x + 1; + position.Right = position.Left + drawningWidth; + + if(position.Right > _width) + { + position.Top = (minRowIndex + 1) * _size_y; + position.Bottom = position.Top + drawningHeight; + + position.Left = 0; + position.Right = drawningWidth; + + minRowIndex = _map.GetLength(0); + } + + if (position.Bottom > _height) { + return false; + } + + currentBarrier = checkBarrier(position); + } + + _drawningObject.SetObject((int)position.Left, (int)position.Top, _width, _height); + + return true; + } + private Bitmap DrawMapWithObject() + { + Bitmap bmp = new(_width, _height); + if (_drawningObject == null || _map == null) + { + return bmp; + } + Graphics gr = Graphics.FromImage(bmp); + for (int i = 0; i < _map.GetLength(0); ++i) + { + for (int j = 0; j < _map.GetLength(1); ++j) + { + if (_map[i, j] == _freeRoad) + { + DrawRoadPart(gr, i, j); + } + else if (_map[i, j] == _barrier) + { + DrawBarrierPart(gr, i, j); + } + } + } + _drawningObject.DrawningObject(gr); + return bmp; + } + protected abstract void GenerateMap(); + protected abstract void DrawRoadPart(Graphics g, int i, int j); + protected abstract void DrawBarrierPart(Graphics g, int i, int j); + } +} diff --git a/AirFighter/AirFighter/Direction.cs b/AirFighter/AirFighter/Direction.cs index 7e6647a..6ce5485 100644 --- a/AirFighter/AirFighter/Direction.cs +++ b/AirFighter/AirFighter/Direction.cs @@ -8,6 +8,7 @@ namespace AirFighter { internal enum Direction { + None, Up, Right, Left, diff --git a/AirFighter/AirFighter/DrawingAirFighter.cs b/AirFighter/AirFighter/DrawingAirFighter.cs index 00bdbf6..5580c95 100644 --- a/AirFighter/AirFighter/DrawingAirFighter.cs +++ b/AirFighter/AirFighter/DrawingAirFighter.cs @@ -34,10 +34,8 @@ namespace AirFighter { if (width < _airFighterWidth || height < _airFighterHeight) return; - if (_startPosX + _airFighterWidth > _pictureWidth) return; - if (_startPosX < 0) return; - if (_startPosY < 0) return; - if (_startPosY + _airFighterHeight > _pictureHeight) return; + if (x + _airFighterWidth > width || x < 0) return; + if (y + _airFighterHeight > height || y < 0) return; _startPosX = x; _startPosY = y; @@ -96,13 +94,13 @@ namespace AirFighter return; } - Pen pen = new(AirFighter.BodyColor); + Pen pen = new(AirFighter.BodyColor, 2); Brush brushBlack = new SolidBrush(AirFighter.BodyColor); PointF[] front = { - new(_startPosX + 160, _startPosY + 70), + new(_startPosX + 160, _startPosY + 69), new(_startPosX + 195, _startPosY + 83), - new(_startPosX + 160, _startPosY + 96) + new(_startPosX + 160, _startPosY + 97) }; PointF[] tailTop = { @@ -136,12 +134,12 @@ namespace AirFighter new(_startPosX + 75, _startPosY + 96), }; - g.FillPolygon(brushBlack, front); g.DrawPolygon(pen, tailTop); g.DrawPolygon(pen, tailBottom); g.DrawPolygon(pen, wingTop); g.DrawPolygon(pen, wingBottom); g.DrawRectangle(pen, _startPosX, _startPosY + 70, 160, 26); + g.FillPolygon(brushBlack, front); } public void ChangeBorders(int width, int height) diff --git a/AirFighter/AirFighter/DrawingModernAirFighter.cs b/AirFighter/AirFighter/DrawingModernAirFighter.cs index 81ad6e7..019c9f2 100644 --- a/AirFighter/AirFighter/DrawingModernAirFighter.cs +++ b/AirFighter/AirFighter/DrawingModernAirFighter.cs @@ -9,71 +9,113 @@ namespace AirFighter internal class DrawingModernAirFighter : DrawingAirFighter { public DrawingModernAirFighter(int speed, float weight, Color bodyColor, Color dopColor, bool dopWings, bool rockets, bool sportLine) : - base(speed, weight, bodyColor, 110, 60) + base(speed, weight, bodyColor, 195, 166) { AirFighter = new EntityModernAirFighter(speed, weight, bodyColor, dopColor, dopWings, rockets, sportLine); } public override void DrawTransport(Graphics g) { - if (AirFighter is not EntityModernAirFighter sportCar) + if (AirFighter is not EntityModernAirFighter modernAirFighter) { return; } - Pen pen = new(Color.Black); - Brush dopBrush = new SolidBrush(sportCar.DopColor); - if (sportCar.DopWings) + + Pen pen = new(modernAirFighter.DopColor); + Brush dopBrush = new SolidBrush(modernAirFighter.DopColor); + + g.DrawRectangle(pen, _startPosX, _startPosY, 195, 166); + + if (modernAirFighter.DopWings) { - 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(dopBrush, _startPosX + 90, _startPosY, 20, 20); - g.FillEllipse(dopBrush, _startPosX + 90, _startPosY + 40, 20, 20); - g.FillRectangle(dopBrush, _startPosX + 90, _startPosY + 10, 20, - 40); - g.FillRectangle(dopBrush, _startPosX + 90, _startPosY + 1, 15, - 15); - g.FillRectangle(dopBrush, _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(dopBrush, _startPosX, _startPosY, 20, 20); - g.FillEllipse(dopBrush, _startPosX, _startPosY + 40, 20, 20); - g.FillRectangle(dopBrush, _startPosX + 1, _startPosY + 10, 25, - 40); - g.FillRectangle(dopBrush, _startPosX + 5, _startPosY + 1, 15, 15); - g.FillRectangle(dopBrush, _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(dopBrush, _startPosX + 35, _startPosY + 1, 40, - 15); - g.FillRectangle(dopBrush, _startPosX + 35, _startPosY + 45, 40, - 15); + /*PointF[] topDopWing = + { + new(_startPosX + 75, _startPosY + 14), + new(_startPosX + 86, _startPosY + 14), + new(_startPosX + 75, _startPosY + 70), + new(_startPosX + 70, _startPosY + 70), + };*/ + +/* PointF[] topDopWing = + { + new(_startPosX + 78, _startPosY + 56), + new(_startPosX + 75, _startPosY + 70), + new(_startPosX + 55, _startPosY + 70), + new(_startPosX + 55, _startPosY + 45), + //new(_startPosX + 60, _startPosY + 55), + };*/ + + PointF[] topDopWing = + { + new(_startPosX + 78, _startPosY + 56), + new(_startPosX + 75, _startPosY + 70), + new(_startPosX + 55, _startPosY + 50), + new(_startPosX + 60, _startPosY + 45), + }; + + PointF[] bottomDopWing = + { + new(_startPosX + 78, _startPosY + 110), + new(_startPosX + 75, _startPosY + 96), + new(_startPosX + 55, _startPosY + 116), + new(_startPosX + 60, _startPosY + 121), + }; + + g.FillPolygon(dopBrush, topDopWing); + g.FillPolygon(dopBrush, bottomDopWing); } - _startPosX += 10; - _startPosY += 5; + + if (modernAirFighter.Rockets) + { + PointF[] topRocket1 = + { + new(_startPosX + 100, _startPosY + 20), + new(_startPosX + 100, _startPosY + 30), + new(_startPosX + 112, _startPosY + 30), + new(_startPosX + 120, _startPosY + 25), + new(_startPosX + 112, _startPosY + 20) + }; + + PointF[] topRocket2 = + { + new(_startPosX + 100, _startPosY + 35), + new(_startPosX + 100, _startPosY + 45), + new(_startPosX + 112, _startPosY + 45), + new(_startPosX + 120, _startPosY + 40), + new(_startPosX + 112, _startPosY + 35) + }; + + PointF[] bottomRocket1 = + { + new(_startPosX + 100, _startPosY + 146), + new(_startPosX + 100, _startPosY + 136), + new(_startPosX + 112, _startPosY + 136), + new(_startPosX + 120, _startPosY + 141), + new(_startPosX + 112, _startPosY + 146) + }; + + PointF[] bottomRocket2 = + { + new(_startPosX + 100, _startPosY + 131), + new(_startPosX + 100, _startPosY + 121), + new(_startPosX + 112, _startPosY + 121), + new(_startPosX + 120, _startPosY + 126), + new(_startPosX + 112, _startPosY + 131) + }; + + g.FillPolygon(dopBrush, topRocket1); + g.FillPolygon(dopBrush, topRocket2); + g.FillPolygon(dopBrush, bottomRocket1); + g.FillPolygon(dopBrush, bottomRocket2); + } + + +/* _startPosX += 10; + _startPosY += 5;*/ base.DrawTransport(g); - _startPosX -= 10; - _startPosY -= 5; - if (sportCar.SportLine) - { - g.FillRectangle(dopBrush, _startPosX + 75, _startPosY + 23, 25, - 15); - g.FillRectangle(dopBrush, _startPosX + 35, _startPosY + 23, 35, - 15); - g.FillRectangle(dopBrush, _startPosX, _startPosY + 23, 20, 15); - } - if (sportCar.Rockets) - { - g.FillRectangle(dopBrush, _startPosX, _startPosY + 5, 10, 50); - g.DrawRectangle(pen, _startPosX, _startPosY + 5, 10, 50); - } +/* _startPosX -= 10; + _startPosY -= 5;*/ + } } } diff --git a/AirFighter/AirFighter/DrawingObjectAirFighter.cs b/AirFighter/AirFighter/DrawingObjectAirFighter.cs index fefe8a2..54a8912 100644 --- a/AirFighter/AirFighter/DrawingObjectAirFighter.cs +++ b/AirFighter/AirFighter/DrawingObjectAirFighter.cs @@ -6,12 +6,12 @@ using System.Threading.Tasks; namespace AirFighter { - internal class DrawingObjectAirFighter + internal class DrawingObjectAirFighter : IDrawingObject { private DrawingAirFighter _airFighter = null; - public DrawingObjectAirFighter(DrawingAirFighter car) + public DrawingObjectAirFighter(DrawingAirFighter airFighter) { - _airFighter = car; + _airFighter = airFighter; } public float Step => _airFighter?.AirFighter?.Step ?? 0; public (float Left, float Right, float Top, float Bottom) @@ -30,6 +30,7 @@ namespace AirFighter public void DrawningObject(Graphics g) { // TODO + _airFighter.DrawTransport(g); } } } diff --git a/AirFighter/AirFighter/FormAirFighter.cs b/AirFighter/AirFighter/FormAirFighter.cs index 84b87f5..ea34367 100644 --- a/AirFighter/AirFighter/FormAirFighter.cs +++ b/AirFighter/AirFighter/FormAirFighter.cs @@ -8,7 +8,7 @@ namespace AirFighter { InitializeComponent(); } - + private void SetData(DrawingAirFighter airFighter) { toolStripStatusLabelSpeed.Text = $": {_airFighter.AirFighter.Speed}"; diff --git a/AirFighter/AirFighter/FormMap.Designer.cs b/AirFighter/AirFighter/FormMap.Designer.cs new file mode 100644 index 0000000..fece72c --- /dev/null +++ b/AirFighter/AirFighter/FormMap.Designer.cs @@ -0,0 +1,215 @@ +namespace AirFighter +{ + partial class FormMap + { + /// + /// 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.CreateButton = new System.Windows.Forms.Button(); + this.pictureBox = new System.Windows.Forms.PictureBox(); + this.DownButton = new System.Windows.Forms.Button(); + this.UpButton = new System.Windows.Forms.Button(); + this.LeftButton = new System.Windows.Forms.Button(); + this.RightButton = new System.Windows.Forms.Button(); + this.statusStrip1 = new System.Windows.Forms.StatusStrip(); + this.toolStripStatusLabelSpeed = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolStripStatusLabelWeight = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolStripStatusLabelBodyColor = new System.Windows.Forms.ToolStripStatusLabel(); + this.button1 = new System.Windows.Forms.Button(); + this.comboBoxSelectorMap = new System.Windows.Forms.ComboBox(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).BeginInit(); + this.statusStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // CreateButton + // + this.CreateButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.CreateButton.Location = new System.Drawing.Point(12, 390); + this.CreateButton.Name = "CreateButton"; + this.CreateButton.Size = new System.Drawing.Size(94, 29); + this.CreateButton.TabIndex = 0; + this.CreateButton.Text = "create"; + this.CreateButton.UseVisualStyleBackColor = true; + this.CreateButton.Click += new System.EventHandler(this.CreateButton_Click); + // + // pictureBox + // + this.pictureBox.Dock = System.Windows.Forms.DockStyle.Fill; + this.pictureBox.Location = new System.Drawing.Point(0, 0); + this.pictureBox.Name = "pictureBox"; + this.pictureBox.Size = new System.Drawing.Size(800, 450); + this.pictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; + this.pictureBox.TabIndex = 1; + this.pictureBox.TabStop = false; + this.pictureBox.Resize += new System.EventHandler(this.PictureBox_Resize); + // + // DownButton + // + this.DownButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.DownButton.BackgroundImage = global::AirFighter.Properties.Resources.down; + this.DownButton.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.DownButton.Location = new System.Drawing.Point(727, 389); + this.DownButton.Name = "DownButton"; + this.DownButton.RightToLeft = System.Windows.Forms.RightToLeft.No; + this.DownButton.Size = new System.Drawing.Size(30, 30); + this.DownButton.TabIndex = 2; + this.DownButton.UseVisualStyleBackColor = true; + this.DownButton.Click += new System.EventHandler(this.ButtonMove_Click); + // + // UpButton + // + this.UpButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.UpButton.BackgroundImage = global::AirFighter.Properties.Resources.up; + this.UpButton.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.UpButton.Location = new System.Drawing.Point(727, 354); + this.UpButton.Name = "UpButton"; + this.UpButton.RightToLeft = System.Windows.Forms.RightToLeft.No; + this.UpButton.Size = new System.Drawing.Size(30, 30); + this.UpButton.TabIndex = 3; + this.UpButton.UseVisualStyleBackColor = true; + this.UpButton.Click += new System.EventHandler(this.ButtonMove_Click); + // + // LeftButton + // + this.LeftButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.LeftButton.BackgroundImage = global::AirFighter.Properties.Resources.left; + this.LeftButton.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.LeftButton.Location = new System.Drawing.Point(691, 389); + this.LeftButton.Name = "LeftButton"; + this.LeftButton.RightToLeft = System.Windows.Forms.RightToLeft.No; + this.LeftButton.Size = new System.Drawing.Size(30, 30); + this.LeftButton.TabIndex = 4; + this.LeftButton.UseVisualStyleBackColor = true; + this.LeftButton.Click += new System.EventHandler(this.ButtonMove_Click); + // + // RightButton + // + this.RightButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.RightButton.BackgroundImage = global::AirFighter.Properties.Resources.right; + this.RightButton.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.RightButton.Location = new System.Drawing.Point(763, 389); + this.RightButton.Name = "RightButton"; + this.RightButton.RightToLeft = System.Windows.Forms.RightToLeft.No; + this.RightButton.Size = new System.Drawing.Size(30, 30); + this.RightButton.TabIndex = 5; + this.RightButton.UseVisualStyleBackColor = true; + this.RightButton.Click += new System.EventHandler(this.ButtonMove_Click); + // + // statusStrip1 + // + this.statusStrip1.ImageScalingSize = new System.Drawing.Size(20, 20); + this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripStatusLabelSpeed, + this.toolStripStatusLabelWeight, + this.toolStripStatusLabelBodyColor}); + this.statusStrip1.Location = new System.Drawing.Point(0, 424); + this.statusStrip1.Name = "statusStrip1"; + this.statusStrip1.Size = new System.Drawing.Size(800, 26); + this.statusStrip1.TabIndex = 6; + this.statusStrip1.Text = "statusStrip1"; + // + // toolStripStatusLabelSpeed + // + this.toolStripStatusLabelSpeed.Name = "toolStripStatusLabelSpeed"; + this.toolStripStatusLabelSpeed.Size = new System.Drawing.Size(74, 20); + this.toolStripStatusLabelSpeed.Text = "скорость:"; + // + // toolStripStatusLabelWeight + // + this.toolStripStatusLabelWeight.Name = "toolStripStatusLabelWeight"; + this.toolStripStatusLabelWeight.Size = new System.Drawing.Size(35, 20); + this.toolStripStatusLabelWeight.Text = "вес:"; + // + // toolStripStatusLabelBodyColor + // + this.toolStripStatusLabelBodyColor.Name = "toolStripStatusLabelBodyColor"; + this.toolStripStatusLabelBodyColor.Size = new System.Drawing.Size(43, 20); + this.toolStripStatusLabelBodyColor.Text = "цвет:"; + // + // button1 + // + this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.button1.Location = new System.Drawing.Point(121, 389); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(148, 29); + this.button1.TabIndex = 7; + this.button1.Text = "create modern"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.CreateModernButton_Click); + // + // comboBoxSelectorMap + // + this.comboBoxSelectorMap.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxSelectorMap.FormattingEnabled = true; + this.comboBoxSelectorMap.Items.AddRange(new object[] { + "простая карта", + "моя карта"}); + this.comboBoxSelectorMap.Location = new System.Drawing.Point(12, 12); + this.comboBoxSelectorMap.Name = "comboBoxSelectorMap"; + this.comboBoxSelectorMap.Size = new System.Drawing.Size(150, 28); + this.comboBoxSelectorMap.TabIndex = 8; + this.comboBoxSelectorMap.SelectedIndexChanged += new System.EventHandler(this.ComboBoxSelectorMap_SelectedIndexChanged); + // + // FormMap + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 450); + this.Controls.Add(this.comboBoxSelectorMap); + this.Controls.Add(this.button1); + this.Controls.Add(this.statusStrip1); + this.Controls.Add(this.RightButton); + this.Controls.Add(this.LeftButton); + this.Controls.Add(this.UpButton); + this.Controls.Add(this.DownButton); + this.Controls.Add(this.CreateButton); + this.Controls.Add(this.pictureBox); + this.Name = "FormMap"; + this.Text = "Form1"; + ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).EndInit(); + this.statusStrip1.ResumeLayout(false); + this.statusStrip1.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private Button CreateButton; + private PictureBox pictureBox; + private Button DownButton; + private Button UpButton; + private Button LeftButton; + private Button RightButton; + private StatusStrip statusStrip1; + private ToolStripStatusLabel toolStripStatusLabelSpeed; + private ToolStripStatusLabel toolStripStatusLabelWeight; + private ToolStripStatusLabel toolStripStatusLabelBodyColor; + private Button button1; + private ComboBox comboBoxSelectorMap; + } +} \ No newline at end of file diff --git a/AirFighter/AirFighter/FormMap.cs b/AirFighter/AirFighter/FormMap.cs new file mode 100644 index 0000000..42ca010 --- /dev/null +++ b/AirFighter/AirFighter/FormMap.cs @@ -0,0 +1,111 @@ +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 AirFighter +{ + public partial class FormMap : Form + { + private DrawingAirFighter _airFighter; + private AbstractMap _abstractMap; + + public FormMap() + { + InitializeComponent(); + _abstractMap = new SimpleMap(); + } + + + private void SetData(DrawingAirFighter airFighter) + { + toolStripStatusLabelSpeed.Text = $"Скорость: {_airFighter.AirFighter.Speed}"; + toolStripStatusLabelWeight.Text = $"Вес: {_airFighter.AirFighter.Weight}"; + toolStripStatusLabelBodyColor.Text = $"Цвет: { _airFighter.AirFighter.BodyColor.Name}"; + + pictureBox.Image = _abstractMap.CreateMap(pictureBox.Width, pictureBox.Height, new DrawingObjectAirFighter(_airFighter)); + } + + private void CreateButton_Click(object sender, EventArgs e) + { + Random rnd = new(); + + _airFighter = new DrawingAirFighter(rnd.Next(100, 300), rnd.Next(1000, 2000), + Color.FromArgb(rnd.Next(0, 256), rnd.Next(0, 256), rnd.Next(0, 256))); + + SetData(_airFighter); + } + + private void CreateModernButton_Click(object sender, EventArgs e) + { + Random rnd = new(); + + _airFighter = new DrawingModernAirFighter(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(_airFighter); + } + + private void ButtonMove_Click(object sender, EventArgs e) + { + string name = ((Button)sender)?.Name ?? string.Empty; + Direction dir = Direction.None; + switch (name) + { + case "UpButton": + dir = Direction.Up; + break; + case "DownButton": + dir = Direction.Down; + break; + case "LeftButton": + dir = Direction.Left; + break; + case "RightButton": + dir = Direction.Right; + break; + } + pictureBox.Image = _abstractMap?.MoveObject(dir); + + } + + private void PictureBox_Resize(object sender, EventArgs e) + { + _airFighter?.ChangeBorders(pictureBox.Width, pictureBox.Height); + } + + + public void Draw() + { + if (pictureBox.Width == 0 || pictureBox.Height == 0) return; + Bitmap bmp = new(pictureBox.Width, pictureBox.Height); + Graphics gr = Graphics.FromImage(bmp); + _airFighter?.DrawTransport(gr); + pictureBox.Image = bmp; + } + + private void ComboBoxSelectorMap_SelectedIndexChanged(object sender, EventArgs e) + { + switch (comboBoxSelectorMap.Text) + { + case "простая карта": + _abstractMap = new SimpleMap(); + break; + case "моя карта": + _abstractMap = new MyMap(); + break; + } + } + + + } +} diff --git a/AirFighter/AirFighter/FormMap.resx b/AirFighter/AirFighter/FormMap.resx new file mode 100644 index 0000000..5cb320f --- /dev/null +++ b/AirFighter/AirFighter/FormMap.resx @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + 17, 17 + + \ No newline at end of file diff --git a/AirFighter/AirFighter/IDrawingObject.cs b/AirFighter/AirFighter/IDrawingObject.cs index cdc5255..ef278d8 100644 --- a/AirFighter/AirFighter/IDrawingObject.cs +++ b/AirFighter/AirFighter/IDrawingObject.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace AirFighter { - internal interface IDrawningObject + internal interface IDrawingObject { public float Step { get; } void SetObject(int x, int y, int width, int height); diff --git a/AirFighter/AirFighter/MyMap.cs b/AirFighter/AirFighter/MyMap.cs new file mode 100644 index 0000000..b06218d --- /dev/null +++ b/AirFighter/AirFighter/MyMap.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AirFighter +{ + internal class MyMap : AbstractMap + { + + /// + /// Цвет участка закрытого + /// + private readonly Brush barrierColor = new SolidBrush(Color.Black); + /// + /// Цвет участка открытого + /// + private readonly Brush roadColor = new SolidBrush(Color.Gray); + protected override void DrawBarrierPart(Graphics g, int i, int j) + { + g.FillRectangle(barrierColor, j * _size_x, i * _size_y, _size_x, _size_y); + } + protected override void DrawRoadPart(Graphics g, int i, int j) + { + g.FillRectangle(roadColor, j * _size_x, i * _size_y, _size_x, _size_y); + } + protected override void GenerateMap() + { + _map = new int[10, 10] { + { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, + { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + }; + + _size_x = (float)_width / _map.GetLength(0); + _size_y = (float)_height / _map.GetLength(1); + } + + } +} diff --git a/AirFighter/AirFighter/Program.cs b/AirFighter/AirFighter/Program.cs index 61bec04..b613151 100644 --- a/AirFighter/AirFighter/Program.cs +++ b/AirFighter/AirFighter/Program.cs @@ -11,7 +11,7 @@ namespace AirFighter // To customize application configuration such as set high DPI settings or default font, // see https://aka.ms/applicationconfiguration. ApplicationConfiguration.Initialize(); - Application.Run(new FormAirFighter()); + Application.Run(new FormMap()); } } } \ No newline at end of file diff --git a/AirFighter/AirFighter/SimpleMap.cs b/AirFighter/AirFighter/SimpleMap.cs new file mode 100644 index 0000000..81618c5 --- /dev/null +++ b/AirFighter/AirFighter/SimpleMap.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AirFighter +{ + internal class SimpleMap : AbstractMap + { + + /// + /// Цвет участка закрытого + /// + private readonly Brush barrierColor = new SolidBrush(Color.Black); + /// + /// Цвет участка открытого + /// + private readonly Brush roadColor = new SolidBrush(Color.Gray); + protected override void DrawBarrierPart(Graphics g, int i, int j) + { + g.FillRectangle(barrierColor, j * _size_x, i * _size_y, _size_x, _size_y); + } + protected override void DrawRoadPart(Graphics g, int i, int j) + { + g.FillRectangle(roadColor, j * _size_x, i * _size_y, _size_x, _size_y); + } + protected override void GenerateMap() + { + _map = new int[100, 100]; + _size_x = (float)_width / _map.GetLength(0); + _size_y = (float)_height / _map.GetLength(1); + int counter = 0; + for (int i = 0; i < _map.GetLength(0); ++i) + { + for (int j = 0; j < _map.GetLength(1); ++j) + { + _map[i, j] = _freeRoad; + } + } + while (counter < 50) + { + int x = _random.Next(0, 100); + int y = _random.Next(0, 100); + if (_map[x, y] == _freeRoad) + { + _map[x, y] = _barrier; + counter++; + } + } + } + + } +}