часть Movement

This commit is contained in:
xom9kxom9k 2024-02-20 18:49:55 +04:00
parent 7feba0a042
commit 9ae3816169
5 changed files with 177 additions and 26 deletions

View File

@ -16,14 +16,13 @@ public class DrawingSeaplane : DrawningPlane
/// <param name="bodyKit">Наличие обвеса</param> /// <param name="bodyKit">Наличие обвеса</param>
/// <param name="floats">Наличие поплавков</param> /// <param name="floats">Наличие поплавков</param>
/// <param name="inflatableBoat">Наличие надувной лодки</param> /// <param name="inflatableBoat">Наличие надувной лодки</param>
public DrawingSeaplane(int speed, double weight, Color bodyColor, Color additionalColor, bool bodyKit, bool wing, bool sportLine) : base(110, 60) public DrawingSeaplane(int speed, double weight, Color bodyColor, Color additionalColor, bool bodyKit, bool floats, bool inflatableBoat) : base(110, 60)
{ {
EntityPlane = new EntitySeaplane(speed, weight, bodyColor, additionalColor, bodyKit, wing, sportLine); EntityPlane = new EntitySeaplane(speed, weight, bodyColor, additionalColor, bodyKit, floats, inflatableBoat);
} }
public override void DrawTransport(Graphics g) public override void DrawTransport(Graphics g)
{ {
if (EntityPlane == null || EntityPlane is not EntitySeaplane seaplane || !_startPosX.HasValue! || _startPosY.HasValue ) if (EntityPlane == null || EntityPlane is not EntitySeaplane seaplane || !_startPosX.HasValue! || _startPosY.HasValue )
@ -31,24 +30,13 @@ public class DrawingSeaplane : DrawningPlane
return; return;
} }
base.DrawTransport(g);
}
/// <summary>
/// Прорисовка объекта
/// </summary>
/// <param name="g"></param>
public void DrawTransport(Graphics g)
{
Pen pen = new(Color.Black); Pen pen = new(Color.Black);
Pen additionalpen = new(EntitySeaplane.AdditionalColor); Pen additionalpen = new(EntityPlane.AdditionalColor);
//корпус гидросамолета //корпус гидросамолета
Brush br = new SolidBrush(EntitySeaplane.BodyColor); Brush br = new SolidBrush(EntityPlane.BodyColor);
g.FillRectangle(br, _startPosX.Value, _startPosY.Value + 20, 100, 20); g.FillRectangle(br, _startPosX.Value, _startPosY.Value + 20, 100, 20);
g.DrawRectangle(pen, _startPosX.Value, _startPosY.Value + 20, 100, 20); g.DrawRectangle(pen, _startPosX.Value, _startPosY.Value + 20, 100, 20);
@ -61,7 +49,7 @@ public class DrawingSeaplane : DrawningPlane
g.DrawLine(pen, _startPosX.Value, _startPosY.Value, _startPosX.Value + 20, _startPosY.Value + 20); g.DrawLine(pen, _startPosX.Value, _startPosY.Value, _startPosX.Value + 20, _startPosY.Value + 20);
//заднее поперечное крыло //заднее поперечное крыло
Brush additionalBrush = new SolidBrush(EntitySeaplane.AdditionalColor); Brush additionalBrush = new SolidBrush(EntityPlane.AdditionalColor);
g.FillEllipse(darkBrush, _startPosX.Value - 7, _startPosY.Value + 15, 20, 5); g.FillEllipse(darkBrush, _startPosX.Value - 7, _startPosY.Value + 15, 20, 5);
//нос самолёта //нос самолёта
@ -79,19 +67,20 @@ public class DrawingSeaplane : DrawningPlane
g.FillEllipse(darkBrush, _startPosX.Value + 87, _startPosY.Value + 45, 6, 6); g.FillEllipse(darkBrush, _startPosX.Value + 87, _startPosY.Value + 45, 6, 6);
// поплавки // поплавки
if (EntitySeaplane.Floats) if (EntityPlane.Floats)
{ {
Brush br2 = new SolidBrush(Color.Red); Brush br2 = new SolidBrush(Color.Red);
g.FillRectangle(br2, _startPosX.Value + 10, _startPosY.Value + 48, 90, 5); g.FillRectangle(br2, _startPosX.Value + 10, _startPosY.Value + 48, 90, 5);
} }
// надувная лодка // надувная лодка
if (EntitySeaplane.InflatableBoat) if (EntityPlane.InflatableBoat)
{ {
g.FillRectangle(additionalBrush, _startPosX.Value + 38, _startPosY.Value + 38, 22, 8); g.FillRectangle(additionalBrush, _startPosX.Value + 38, _startPosY.Value + 38, 22, 8);
} }
} }
} }

View File

@ -57,6 +57,7 @@ public class DrawningPlane
{ {
EntityPlane = new EntityPlane(speed, weight, bodyColor); EntityPlane = new EntityPlane(speed, weight, bodyColor);
} }
/// <summary> /// <summary>
/// Конструктор для наследников /// Конструктор для наследников
/// </summary> /// </summary>
@ -67,6 +68,7 @@ public class DrawningPlane
_drawningPlaneWidth = drawningPlaneWidth; _drawningPlaneWidth = drawningPlaneWidth;
_drawningPlaneHeight = drawningPlaneHeight; _drawningPlaneHeight = drawningPlaneHeight;
} }
/// <summary> /// <summary>
/// Установка границ поля /// Установка границ поля
/// </summary> /// </summary>

View File

@ -20,10 +20,7 @@ public class EntitySeaplane : EntityPlane
/// Наличие надувной лодки /// Наличие надувной лодки
/// </summary> /// </summary>
public bool InflatableBoat { get; private set; } public bool InflatableBoat { get; private set; }
/// <summary>
/// Шаг перемещения гидросамолета
/// </summary>
public double Step => Speed * 100 / Weight;
/// <summary> /// <summary>
/// Инициализация полей объекта-класса гидросамолета /// Инициализация полей объекта-класса гидросамолета
/// </summary> /// </summary>
@ -34,7 +31,7 @@ public class EntitySeaplane : EntityPlane
/// <param name="bodyKit">Наличие обвеса</param> /// <param name="bodyKit">Наличие обвеса</param>
/// <param name="floats">Наличие поплавков</param> /// <param name="floats">Наличие поплавков</param>
/// <param name="inflatableBoat">Наличие надувной лодки</param> /// <param name="inflatableBoat">Наличие надувной лодки</param>
public void Init(int speed, double weight, Color bodyColor, Color additionalColor, bool bodyKit, bool floats, bool inflatableBoat) public EntitySeaPlane(int speed, double weight, Color bodyColor, Color additionalColor, bool bodyKit, bool floats, bool inflatableBoat) : base(0,0,Color.Black)
{ {
AdditionalColor = additionalColor; AdditionalColor = additionalColor;
BodyKit = bodyKit; BodyKit = bodyKit;

View File

@ -0,0 +1,139 @@
namespace ProjectSeaplane.MovementStrategy;
/// <summary>
/// Класс-стратегия перемещения объекта
/// </summary>
public abstract class AbstractStrategy
{
/// <summary>
/// Перемещаемый объект
/// </summary>
private IMoveableObject? _moveableObject;
/// <summary>
/// Статус перемещения
/// </summary>
private StrategyStatus _state = StrategyStatus.NotInit;
/// <summary>
/// Ширина поля
/// </summary>
protected int FieldWidth { get; private set; }
/// <summary>
/// Высота поля
/// </summary>
protected int FieldHeight { get; private set; }
/// <summary>
/// Статус перемещения
/// </summary>
public StrategyStatus GetStatus() { return _state; }
/// <summary>
/// Установка данных
/// </summary>
/// <param name="moveableObject">Перемещаемый объект</param>
/// <param name="width">Ширина поля</param>
/// <param name="height">Высота поля</param>
public void SetData(IMoveableObject moveableObject, int width, int height)
{
if (moveableObject == null)
{
_state = StrategyStatus.NotInit;
return;
}
_state = StrategyStatus.InProgress;
_moveableObject = moveableObject;
FieldWidth = width;
FieldHeight = height;
}
/// <summary>
/// Шаг перемещения
/// </summary>
public void MakeStep()
{
if (_state != StrategyStatus.InProgress)
{
return;
}
if (IsTargetDestinaion())
{
_state = StrategyStatus.Finish;
return;
}
MoveToTarget();
}
/// <summary>
/// Перемещение влево
/// </summary>
/// <returns>Результат перемещения (true - удалось переместиться, false - неудача)</returns>
protected bool MoveLeft() => MoveTo(MovementDirection.Left);
/// <summary>
/// Перемещение вправо
/// </summary>
/// <returns>Результат перемещения (true - удалось переместиться, false - неудача)</returns>
protected bool MoveRight() => MoveTo(MovementDirection.Right);
/// <summary>
/// Перемещение вверх
/// </summary>
/// <returns>Результат перемещения (true - удалось переместиться, false - неудача)</returns>
protected bool MoveUp() => MoveTo(MovementDirection.Up);
/// <summary>
/// Перемещение вниз
/// </summary>
/// <returns>Результат перемещения (true - удалось переместиться, false - неудача)</returns>
protected bool MoveDown() => MoveTo(MovementDirection.Down);
/// <summary>
/// Параметры объекта
/// </summary>
protected ObjectParameters? GetObjectParameters => _moveableObject?.GetObjectPosition;
/// <summary>
/// Шаг объекта
/// </summary>
/// <returns></returns>
protected int? GetStep()
{
if (_state != StrategyStatus.InProgress)
{
return null;
}
return _moveableObject?.GetStep;
}
/// <summary>
/// Перемещение к цели
/// </summary>
protected abstract void MoveToTarget();
/// <summary>
/// Достигнута ли цель
/// </summary>
/// <returns></returns>
protected abstract bool IsTargetDestinaion();
/// <summary>
/// Попытка перемещения в требуемом направлении
/// </summary>
/// <param name="movementDirection">Направление</param>
/// <returns>Результат попытки (true - удалось переместиться, false - неудача)</returns>
private bool MoveTo(MovementDirection movementDirection)
{
if (_state != StrategyStatus.InProgress)
{
return false;
}
return _moveableObject?.TryMoveObject(movementDirection) ?? false;
}
}

View File

@ -0,0 +1,24 @@
namespace ProjectSportCar.MovementStrategy;
/// <summary>
/// Интерфейс для работы с перемещаемым объектом
/// </summary>
public interface IMoveableObject
{
/// <summary>
/// Получение координаты объекта
/// </summary>
ObjectParameters? GetObjectPosition { get; }
/// <summary>
/// Шаг объекта
/// </summary>
int GetStep { get; }
/// <summary>
/// Попытка переместить объект в указанном направлении
/// </summary>
/// <param name="direction">Направление</param>
/// <returns>true - объект перемещен, false - перемещение невозможно</returns>
bool TryMoveObject(MovementDirection direction);
}