From 0f9caec5c3e129070c3c0ab6af0e0ddd1c7a18e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=B0=D0=BD=D0=B8=D1=8F=D1=80=20=D0=90=D0=B3=D0=BB?= =?UTF-8?q?=D0=B8=D1=83=D0=BB=D0=BB=D0=BE=D0=B2?= Date: Wed, 2 Nov 2022 00:55:25 +0400 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=20=D0=B8=D0=BD=D1=82=D0=B5=D1=80=D1=84=D0=B5?= =?UTF-8?q?=D0=B9=D1=81=20=D0=B8=D1=82=D0=B5=D1=80=D0=B0=D1=82=D0=BE=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=20=D0=B4=D0=BB=D1=8F=20Airplane=20=D0=B8=20AirBomb?= =?UTF-8?q?er?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AirBomber/AirBomber/DrawningAirBomber.cs | 18 +++++++++ AirBomber/AirBomber/DrawningAirplane.cs | 49 +++++++++++++++++++++--- 2 files changed, 61 insertions(+), 6 deletions(-) diff --git a/AirBomber/AirBomber/DrawningAirBomber.cs b/AirBomber/AirBomber/DrawningAirBomber.cs index f4af376..b240427 100644 --- a/AirBomber/AirBomber/DrawningAirBomber.cs +++ b/AirBomber/AirBomber/DrawningAirBomber.cs @@ -80,5 +80,23 @@ namespace AirBomber g.DrawLine(pen, baseTail, new PointF(r.Right, r.Top)); g.DrawLine(pen, baseTail, new PointF(r.Right, r.Bottom)); } + + /// + /// Возвращает итератор со свойствами самолета в порядке: + /// Скорость -> Вес -> Цвет корпуса -> Тип двигателя, либо null если их нет -> Количество двигателей -> Дополнительный цвет -> Наличие бомб -> Наличие топливных баков + /// + public override IEnumerator GetEnumerator() + { + IEnumerator enumBase = base.GetEnumerator(); + while (enumBase.MoveNext()) + { + yield return enumBase.Current; + } + var entity = (EntityAirBomber)Airplane; + yield return entity.DopColor; + yield return entity.HasBombs; + yield return entity.HasFuelTanks; + yield break; + } } } diff --git a/AirBomber/AirBomber/DrawningAirplane.cs b/AirBomber/AirBomber/DrawningAirplane.cs index 4c3c0c4..abeabfc 100644 --- a/AirBomber/AirBomber/DrawningAirplane.cs +++ b/AirBomber/AirBomber/DrawningAirplane.cs @@ -1,16 +1,24 @@ -namespace AirBomber +using Microsoft.CodeAnalysis.CSharp.Syntax; +using System.Collections; + +namespace AirBomber { /// /// Класс, отвечающий за прорисовку и перемещение объекта-сущности /// - public class DrawningAirplane + public class DrawningAirplane : IEnumerator, IEnumerable { /// /// Класс-сущность /// public EntityAirplane Airplane { get; protected set; } - + public IAirplaneEngines? DrawningEngines { get; protected set; } + + private IEnumerator? _machineStateEnum = null; + + public object Current => _machineStateEnum?.Current; + /// /// Левая координата отрисовки самолета /// @@ -97,7 +105,7 @@ _pictureHeight = height; // Проверка на нахождение предмета полностью в границах окна if (width <= _airplaneWidth || height <= _airplaneHeight - || _startPosX < 0 || _startPosX + _airplaneWidth > width || + || _startPosX < 0 || _startPosX + _airplaneWidth > width || _startPosY < 0 || _startPosY + _airplaneHeight > height) { _pictureWidth = null; @@ -163,14 +171,14 @@ var h = _airplaneHeight; SolidBrush BodyColorBrush = new(Airplane.BodyColor); // Треугольник самолета - g.FillPolygon(BodyColorBrush, new PointF[] { + g.FillPolygon(BodyColorBrush, new PointF[] { new PointF(x , y + h / 2), new PointF(x + 15, y + h / 2 - 7), new PointF(x + 15, y + h / 2 + 8), }); // Тело самолета g.FillRectangle(BodyColorBrush, x + 15, y + h / 2 - 7, w - 35, 15); - DrawWing(g, BodyColorBrush, new PointF(x + w / 2 - 20, y + h / 2 - 7), new PointF(x + w / 2, y + h / 2 - 7), true , h / 2 - 7); + DrawWing(g, BodyColorBrush, new PointF(x + w / 2 - 20, y + h / 2 - 7), new PointF(x + w / 2, y + h / 2 - 7), true, h / 2 - 7); DrawWing(g, BodyColorBrush, new PointF(x + w / 2 - 20, y + h / 2 + 7), new PointF(x + w / 2, y + h / 2 + 7), false, h / 2 - 7); // Линия примыкающая к хвосту слева @@ -241,5 +249,34 @@ { return new(_startPosX, _startPosY, _airplaneWidth, _airplaneHeight); } + + public bool MoveNext() + { + if (_machineStateEnum == null) + { + _machineStateEnum = GetEnumerator(); + } + return _machineStateEnum.MoveNext(); + } + + public void Reset() => throw new NotSupportedException(); + + public void Dispose() => GC.SuppressFinalize(this); + + /// + /// Возвращает итератор со свойствами самолета в порядке: + /// Скорость -> Вес -> Цвет корпуса -> Тип двигателя, либо null если их нет -> Количество двигателей + /// + virtual public IEnumerator GetEnumerator() + { + yield return Airplane.Speed; + yield return Airplane.Weight; + yield return Airplane.BodyColor; + yield return DrawningEngines; + yield return DrawningEngines?.CountEngines ?? 0; + yield break; + } + + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); } } \ No newline at end of file