Реализован интерфейс итераторов для Airplane и AirBomber

This commit is contained in:
Данияр Аглиуллов 2022-11-02 00:55:25 +04:00
parent 8c6ce67917
commit 0f9caec5c3
2 changed files with 61 additions and 6 deletions

View File

@ -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.Top));
g.DrawLine(pen, baseTail, new PointF(r.Right, r.Bottom)); g.DrawLine(pen, baseTail, new PointF(r.Right, r.Bottom));
} }
/// <summary>
/// Возвращает итератор со свойствами самолета в порядке:
/// Скорость -> Вес -> Цвет корпуса -> Тип двигателя, либо null если их нет -> Количество двигателей -> Дополнительный цвет -> Наличие бомб -> Наличие топливных баков
/// </summary>
public override IEnumerator<object> GetEnumerator()
{
IEnumerator<object> 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;
}
} }
} }

View File

@ -1,9 +1,12 @@
namespace AirBomber using Microsoft.CodeAnalysis.CSharp.Syntax;
using System.Collections;
namespace AirBomber
{ {
/// <summary> /// <summary>
/// Класс, отвечающий за прорисовку и перемещение объекта-сущности /// Класс, отвечающий за прорисовку и перемещение объекта-сущности
/// </summary> /// </summary>
public class DrawningAirplane public class DrawningAirplane : IEnumerator<object>, IEnumerable<object>
{ {
/// <summary> /// <summary>
/// Класс-сущность /// Класс-сущность
@ -11,6 +14,11 @@
public EntityAirplane Airplane { get; protected set; } public EntityAirplane Airplane { get; protected set; }
public IAirplaneEngines? DrawningEngines { get; protected set; } public IAirplaneEngines? DrawningEngines { get; protected set; }
private IEnumerator<object>? _machineStateEnum = null;
public object Current => _machineStateEnum?.Current;
/// <summary> /// <summary>
/// Левая координата отрисовки самолета /// Левая координата отрисовки самолета
/// </summary> /// </summary>
@ -97,7 +105,7 @@
_pictureHeight = height; _pictureHeight = height;
// Проверка на нахождение предмета полностью в границах окна // Проверка на нахождение предмета полностью в границах окна
if (width <= _airplaneWidth || height <= _airplaneHeight if (width <= _airplaneWidth || height <= _airplaneHeight
|| _startPosX < 0 || _startPosX + _airplaneWidth > width || || _startPosX < 0 || _startPosX + _airplaneWidth > width ||
_startPosY < 0 || _startPosY + _airplaneHeight > height) _startPosY < 0 || _startPosY + _airplaneHeight > height)
{ {
_pictureWidth = null; _pictureWidth = null;
@ -170,7 +178,7 @@
}); });
// Тело самолета // Тело самолета
g.FillRectangle(BodyColorBrush, x + 15, y + h / 2 - 7, w - 35, 15); 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); 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); 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);
/// <summary>
/// Возвращает итератор со свойствами самолета в порядке:
/// Скорость -> Вес -> Цвет корпуса -> Тип двигателя, либо null если их нет -> Количество двигателей
/// </summary>
virtual public IEnumerator<object> 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();
} }
} }