2024-05-07 01:50:39 +04:00

270 lines
10 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using ProjectStormtrooper.Entites;
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()
{
this._drawningAirplaneWidth = drawningAirplaneWidth;
this._pictureHeight = drawningAirplaneHeight;
}
/// <summary>
/// Установка границ поля
/// </summary>
/// <param name="width">Ширина поля</param>
/// <param name="height">Высота поля</param>
/// <returns>true - границы заданы, false - проверка не пройдена, нельзя разместить объект в этих размерах</returns>
public bool SetPictureSize(int width, int height)
{
// TODO проверка, что объект "влезает" в размеры поля
// если влезает, сохраняем границы и корректируем позицию объекта, если она была уже установлена
if (width < _drawningAirplaneWidth || height < _drawningAirplaneHeight) return false;
_pictureWidth = width;
_pictureHeight = height;
if (_startPosX != null || _startPosY != null)
{
if (_startPosX + _drawningAirplaneWidth > _pictureWidth)
{
_startPosX = _startPosX - (_startPosX + _drawningAirplaneWidth - _pictureWidth);
}
else if (_startPosX < 0) _startPosX = 0;
if (_startPosY + _drawningAirplaneHeight > _pictureHeight)
{
_startPosY = _startPosY - (_startPosY + _drawningAirplaneHeight - _pictureHeight);
}
else if (_startPosY < 0) _startPosY = 0;
}
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 если при установке объекта в эти координаты, он будет "выходить" за границы формы
// то надо изменить координаты, чтобы он оставался в этих границах
if (x + _drawningAirplaneWidth > _pictureWidth)
{
_startPosX = x - (x + _drawningAirplaneWidth - _pictureWidth);
}
else if (x < 0) _startPosX = 0;
else _startPosX = x;
if (y + _drawningAirplaneHeight > _pictureHeight)
{
_startPosY = y - (y + _drawningAirplaneHeight - _pictureHeight);
}
else if (y < 0) _startPosY = 0;
else _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);
}
}