Реализован интерфейс итераторов для 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.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,16 +1,24 @@
namespace AirBomber
using Microsoft.CodeAnalysis.CSharp.Syntax;
using System.Collections;
namespace AirBomber
{
/// <summary>
/// Класс, отвечающий за прорисовку и перемещение объекта-сущности
/// </summary>
public class DrawningAirplane
public class DrawningAirplane : IEnumerator<object>, IEnumerable<object>
{
/// <summary>
/// Класс-сущность
/// </summary>
public EntityAirplane Airplane { get; protected set; }
public IAirplaneEngines? DrawningEngines { get; protected set; }
private IEnumerator<object>? _machineStateEnum = null;
public object Current => _machineStateEnum?.Current;
/// <summary>
/// Левая координата отрисовки самолета
/// </summary>
@ -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);
/// <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();
}
}