using ProjectStormtrooper.Entites;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectStormtrooper.Drawnings;
public class DrawningAirplane
{
///
/// Класс-сущность
///
public EntityAirplane? EntityAirplane { get; protected set; }
///
/// Ширина окна
///
private int? _pictureWidth;
///
/// Высота окна
///
private int? _pictureHeight;
///
/// Левая координата прорисовки самолета
///
protected int? _startPosX;
///
/// Верхняя кооридната прорисовки самолета
///
protected int? _startPosY;
///
/// Ширина прорисовки самолета
///
private readonly int _drawningAirplaneWidth = 153;
///
/// Высота прорисовки самолета
///
private readonly int _drawningAirplaneHeight = 110;
///
/// Координата X объекта
///
public int? GetPosX => _startPosX;
///
/// Координата Y объекта
///
public int? GetPosY => _startPosY;
///
/// Ширина объекта
///
public int GetWidth => _drawningAirplaneWidth;
///
/// Высота объекта
///
public int GetHeight => _drawningAirplaneHeight;
///
/// пустой конструктор
///
private DrawningAirplane()
{
_pictureWidth = null;
_pictureHeight = null;
_startPosX = null;
_startPosY = null;
}
///
/// конструктор
///
/// Скорость
/// Вес
/// Основной цвет
public DrawningAirplane(int speed, double weight, Color bodyColor) : this()
{
EntityAirplane = new EntityAirplane(speed, weight, bodyColor);
}
///
/// конструктор для наследников
///
/// Ширина прорисовки самолета
/// Высота прорисовки самолета
protected DrawningAirplane(int drawningAirplaneWidth, int drawningAirplaneHeight) : this()
{
_drawningAirplaneWidth = drawningAirplaneWidth;
_pictureHeight = drawningAirplaneHeight;
}
///
/// Установка границ поля
///
/// Ширина поля
/// Высота поля
/// true - границы заданы, false - проверка не пройдена, нельзя разместить объект в этих размерах
public bool SetPictureSize(int width, int height)
{
// TODO проверка, что объект "влезает" в размеры поля
// если влезает, сохраняем границы и корректируем позицию объекта, если она была уже установлена
_pictureWidth = width;
_pictureHeight = height;
return true;
}
///
/// Установка позиции
///
/// Координата X
/// Координата Y
public void SetPosition(int x, int y)
{
if (!_pictureHeight.HasValue || !_pictureWidth.HasValue)
{
return;
}
// TODO если при установке объекта в эти координаты, он будет "выходить" за границы формы
// то надо изменить координаты, чтобы он оставался в этих границах
_startPosX = x;
_startPosY = y;
}
///
/// Изменение направления перемещения
///
/// Направление
/// true - перемещене выполнено, false - перемещение невозможно
public bool MoveTransport(DirectionType direction)
{
if (EntityAirplane == null || !_startPosX.HasValue || !_startPosY.HasValue)
{
return false;
}
switch (direction)
{
//влево
case DirectionType.Left:
if (_startPosX.Value - EntityAirplane.Step > 0)
_startPosX -= (int)EntityAirplane.Step;
return true;
//вверх
case DirectionType.Up:
if (_startPosY.Value - EntityAirplane.Step > 0)
_startPosY -= (int)EntityAirplane.Step;
return true;
// вправо
case DirectionType.Right:
if (_startPosX.Value + _drawningAirplaneWidth + EntityAirplane.Step < _pictureWidth)
_startPosX += (int)EntityAirplane.Step;
return true;
//вниз
case DirectionType.Down:
if (_startPosY.Value + _drawningAirplaneHeight + EntityAirplane.Step < _pictureHeight)
_startPosY += (int)EntityAirplane.Step;
return true;
default:
return false;
}
}
///
/// Прорисовка объекта
///
///
public virtual void DrawTransport(Graphics g)
{
if (EntityAirplane == null || !_startPosX.HasValue || !_startPosY.HasValue)
{
return;
}
Pen pen = new(Color.Black);
///отрисовка носа
Point p = new Point(_startPosX.Value, _startPosY.Value + 50);
Point p2 = new Point(_startPosX.Value + 20, _startPosY.Value + 40);
Point p3 = new Point(_startPosX.Value + 20, _startPosY.Value + 60);
Point p4 = new Point(_startPosX.Value, _startPosY.Value + 50);
Brush bortBrush = new SolidBrush(EntityAirplane.BodyColor);
///отрисовка борта
g.FillRectangle(bortBrush, _startPosX.Value + 20, _startPosY.Value + 40, 120, 20);
g.DrawRectangle(pen, _startPosX.Value + 20, _startPosY.Value + 40, 120, 20);
///отрисовка вепхнего крыла
Point p5 = new Point(_startPosX.Value + 40, _startPosY.Value);
Point p6 = new Point(_startPosX.Value + 55, _startPosY.Value);
Point p7 = new Point(_startPosX.Value + 70, _startPosY.Value + 40);
Point p8 = new Point(_startPosX.Value + 40, _startPosY.Value + 40);
Point p9 = new Point(_startPosX.Value + 40, _startPosY.Value);
///отрисовка нижнего крыла
Point p10 = new Point(_startPosX.Value + 40, _startPosY.Value + 60);
Point p11 = new Point(_startPosX.Value + 70, _startPosY.Value + 60);
Point p12 = new Point(_startPosX.Value + 55, _startPosY.Value + 110);
Point p13 = new Point(_startPosX.Value + 40, _startPosY.Value + 110);
Point p14 = new Point(_startPosX.Value + 40, _startPosY.Value + 60);
///отрисовка верхнего хвоста
Point p15 = new Point(_startPosX.Value + 115, _startPosY.Value + 40);
Point p16 = new Point(_startPosX.Value + 115, _startPosY.Value + 27);
Point p17 = new Point(_startPosX.Value + 140, _startPosY.Value + 10);
Point p18 = new Point(_startPosX.Value + 140, _startPosY.Value + 40);
Point p19 = new Point(_startPosX.Value + 115, _startPosY.Value + 40);
///отрисовка нижнего хвоста
Point p20 = new Point(_startPosX.Value + 115, _startPosY.Value + 60);
Point p21 = new Point(_startPosX.Value + 115, _startPosY.Value + 73);
Point p22 = new Point(_startPosX.Value + 140, _startPosY.Value + 90);
Point p23 = new Point(_startPosX.Value + 140, _startPosY.Value + 60);
Point p24 = new Point(_startPosX.Value + 115, _startPosY.Value + 60);
Point[] p_nos = { p, p2, p3, p4, };
Point[] p_krilo1 = { p5, p6, p7, p8, p9 };
Point[] p_krilo2 = { p10, p11, p12, p13, p14 };
Point[] p_hvost1 = { p15, p16, p17, p18, p19 };
Point[] p_hvost2 = { p20, p21, p22, p23, p24 };
g.FillPolygon(bortBrush, p_nos);
g.FillPolygon(bortBrush, p_krilo1);
g.FillPolygon(bortBrush, p_krilo2);
g.FillPolygon(bortBrush, p_hvost1);
g.FillPolygon(bortBrush, p_hvost2);
g.DrawPolygon(pen, p_nos);
g.DrawPolygon(pen, p_krilo1);
g.DrawPolygon(pen, p_krilo2);
g.DrawPolygon(pen, p_hvost1);
g.DrawPolygon(pen, p_hvost2);
}
}