251 lines
9.1 KiB
C#
Raw Normal View History

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
{
/// <summary>
/// Класс-сущность
/// </summary>
public EntityAirplane? EntityAirplane { get; protected set; }
/// <summary>
/// Ширина окна
/// </summary>
private int? _pictureWidth;
/// <summary>
/// Высота окна
/// </summary>
private int? _pictureHeight;
/// <summary>
/// Левая координата прорисовки самолета
/// </summary>
protected int? _startPosX;
/// <summary>
/// Верхняя кооридната прорисовки самолета
/// </summary>
protected int? _startPosY;
/// <summary>
/// Ширина прорисовки самолета
/// </summary>
private readonly int _drawningAirplaneWidth = 153;
/// <summary>
/// Высота прорисовки самолета
/// </summary>
private readonly int _drawningAirplaneHeight = 110;
/// <summary>
/// Координата X объекта
/// </summary>
public int? GetPosX => _startPosX;
/// <summary>
/// Координата Y объекта
/// </summary>
public int? GetPosY => _startPosY;
/// <summary>
/// Ширина объекта
/// </summary>
public int GetWidth => _drawningAirplaneWidth;
/// <summary>
/// Высота объекта
/// </summary>
public int GetHeight => _drawningAirplaneHeight;
/// <summary>
/// пустой конструктор
/// </summary>
private DrawningAirplane()
{
_pictureWidth = null;
_pictureHeight = null;
_startPosX = null;
_startPosY = null;
}
/// <summary>
/// конструктор
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес</param>
/// <param name="bodyColor">Основной цвет</param>
public DrawningAirplane(int speed, double weight, Color bodyColor) : this()
{
EntityAirplane = new EntityAirplane(speed, weight, bodyColor);
}
/// <summary>
/// конструктор для наследников
/// </summary>
/// <param name="drawningAirplaneWidth">Ширина прорисовки самолета</param>
/// <param name="drawningAirplaneHeight">Высота прорисовки самолета</param>
protected DrawningAirplane(int drawningAirplaneWidth, int drawningAirplaneHeight) : this()
{
_drawningAirplaneWidth = drawningAirplaneWidth;
_pictureHeight = drawningAirplaneHeight;
}
/// <summary>
/// Установка границ поля
/// </summary>
/// <param name="width">Ширина поля</param>
/// <param name="height">Высота поля</param>
/// <returns>true - границы заданы, false - проверка не пройдена, нельзя разместить объект в этих размерах</returns>
public bool SetPictureSize(int width, int height)
{
// TODO проверка, что объект "влезает" в размеры поля
// если влезает, сохраняем границы и корректируем позицию объекта, если она была уже установлена
_pictureWidth = width;
_pictureHeight = height;
return true;
}
/// <summary>
/// Установка позиции
/// </summary>
/// <param name="x">Координата X</param>
/// <param name="y">Координата Y</param>
public void SetPosition(int x, int y)
{
if (!_pictureHeight.HasValue || !_pictureWidth.HasValue)
{
return;
}
// TODO если при установке объекта в эти координаты, он будет "выходить" за границы формы
// то надо изменить координаты, чтобы он оставался в этих границах
_startPosX = x;
_startPosY = y;
}
/// <summary>
/// Изменение направления перемещения
/// </summary>
/// <param name="direction">Направление</param>
/// <returns>true - перемещене выполнено, false - перемещение невозможно</returns>
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;
}
}
/// <summary>
/// Прорисовка объекта
/// </summary>
/// <param name="g"></param>
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);
}
}