2024-03-27 00:02:52 +04:00

284 lines
11 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.

namespace ProjectStormtrooper;
/// <summary>
/// Класс, отвечающий за прорисовку и перемещение объекта-сущности
/// </summary>
public class DrawningStormtrooper
{
/// <summary>
/// Класс-сущность
/// </summary>
public EntityStormtrooper? EntityStormtrooper { get; private set; }
/// <summary>
/// Ширина окна
/// </summary>
private int? _pictureWidth;
/// <summary>
/// Высота окна
/// </summary>
private int? _pictureHeight;
/// <summary>
/// Левая координата прорисовки автомобиля
/// </summary>
private int? _startPosX;
/// <summary>
/// Верхняя кооридната прорисовки автомобиля
/// </summary>
private int? _startPosY;
/// <summary>
/// Ширина прорисовки автомобиля
/// </summary>
private readonly int _drawningStormtrooperWidth = 150;
/// <summary>
/// Высота прорисовки автомобиля
/// </summary>
private readonly int _drawningStormtrooperHeight = 120;
/// <summary>
/// Инициализация свойств
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес</param>
/// <param name="bodyColor">Основной цвет</param>
/// <param name="additionalColor">Дополнительный цвет</param>
/// <param name="dvigatel">Признак наличия обвеса</param>
/// <param name="vint">Признак наличия антикрыла</param>
public void Init(int speed, double weight, Color bodyColor, Color additionalColor, bool dvigatel, bool vint)
{
EntityStormtrooper = new EntityStormtrooper();
EntityStormtrooper.Init(speed, weight, bodyColor, additionalColor, dvigatel, vint);
_pictureWidth = null;
_pictureHeight = null;
_startPosX = null;
_startPosY = null;
}
/// <summary>
/// Установка границ поля
/// </summary>
/// <param name="width">Ширина поля</param>
/// <param name="height">Высота поля</param>
/// <returns>true - границы заданы, false - проверка не пройдена, нельзя разместить объект в этих размерах</returns>
/// <summary>
/// Установка границ поля
/// </summary>
/// <param name="width">Ширина поля</param>
/// <param name="height">Высота поля</param>
/// <returns>true - границы заданы, false - проверка не пройдена, нельзя
public bool SetPictureSize(int width, int height)
{
if (_drawningStormtrooperWidth <= width && _drawningStormtrooperHeight <= height)
{
_pictureWidth = width;
_pictureHeight = height;
if (_startPosX.HasValue && _startPosY.HasValue)
{
if (_startPosX + _drawningStormtrooperWidth > _pictureWidth)
{
_startPosX = _pictureWidth - _drawningStormtrooperWidth;
}
if (_startPosY + _drawningStormtrooperHeight > _pictureHeight)
{
_startPosY = _pictureHeight - _drawningStormtrooperHeight;
}
}
return true;
}
return false;
}
/// <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;
}
if (x < 0) x = 0;
else if (x + _drawningStormtrooperWidth > _pictureWidth) x = _pictureWidth.Value - _drawningStormtrooperWidth;
if (y < 0) y = 0;
else if (y + _drawningStormtrooperHeight > _pictureHeight) y = _pictureHeight.Value - _drawningStormtrooperHeight;
_startPosX = x;
_startPosY = y;
}
/// <summary>
/// Изменение направления перемещения
/// </summary>
/// <param name="direction">Направление</param>
/// <returns>true - перемещене выполнено, false - перемещение невозможно</returns>
public bool MoveTransport(DirectionType direction)
{
if (EntityStormtrooper == null || !_startPosX.HasValue || !_startPosY.HasValue)
{
return false;
}
switch (direction)
{
//влево
case DirectionType.Left:
if (_startPosX.Value - EntityStormtrooper.Step > 0)
_startPosX -= (int)EntityStormtrooper.Step;
return true;
//вверх
case DirectionType.Up:
if (_startPosY.Value - EntityStormtrooper.Step > 0)
_startPosY -= (int)EntityStormtrooper.Step;
return true;
// вправо
case DirectionType.Right:
if (_startPosX.Value + _drawningStormtrooperWidth + EntityStormtrooper.Step < _pictureWidth)
_startPosX += (int)EntityStormtrooper.Step;
return true;
//вниз
case DirectionType.Down:
if (_startPosY.Value + _drawningStormtrooperHeight + EntityStormtrooper.Step < _pictureHeight)
_startPosY += (int)EntityStormtrooper.Step;
return true;
default:
return false;
}
}
/// <summary>
/// Прорисовка объекта
/// </summary>
/// <param name="g"></param>
public void DrawTransport(Graphics g)
{
if (EntityStormtrooper == null || !_startPosX.HasValue || !_startPosY.HasValue)
{
return;
}
Pen pen = new(Color.Black);
Brush additionalBrush = new SolidBrush(EntityStormtrooper.AdditionalColor);
Brush nosBrush = new SolidBrush(Color.Black);
///отрисовка носа
Point p = new Point(_startPosX.Value +10, _startPosY.Value + 60 );
Point p2 = new Point(_startPosX.Value + 30, _startPosY.Value + 50);
Point p3 = new Point(_startPosX.Value + 30, _startPosY.Value + 70);
Point p4 = new Point(_startPosX.Value +10, _startPosY.Value + 60);
Brush bortBrush = new SolidBrush(EntityStormtrooper.BodyColor);
///отрисовка борта
g.FillRectangle(bortBrush, _startPosX.Value + 30, _startPosY.Value + 50, 130, 20);
g.DrawRectangle(pen, _startPosX.Value + 30, _startPosY.Value + 50, 130, 20);
///отрисовка вепхнего крыла
Point p5 = new Point(_startPosX.Value + 50, _startPosY.Value);
Point p6 = new Point(_startPosX.Value + 65, _startPosY.Value);
Point p7 = new Point(_startPosX.Value + 80, _startPosY.Value + 50);
Point p8 = new Point(_startPosX.Value + 50, _startPosY.Value + 50);
Point p9 = new Point(_startPosX.Value + 50, _startPosY.Value);
///отрисовка нижнего крыла
Point p10 = new Point(_startPosX.Value +50, _startPosY.Value + 70);
Point p11 = new Point(_startPosX.Value +80, _startPosY.Value + 70);
Point p12 = new Point(_startPosX.Value +65, _startPosY.Value + 120);
Point p13 = new Point(_startPosX.Value +50, _startPosY.Value + 120);
Point p14 = new Point(_startPosX.Value +50, _startPosY.Value + 70);
///отрисовка верхнего хвоста
Point p15 = new Point(_startPosX.Value + 125, _startPosY.Value + 50);
Point p16 = new Point(_startPosX.Value + 125, _startPosY.Value + 37);
Point p17 = new Point(_startPosX.Value + 150, _startPosY.Value + 20);
Point p18 = new Point(_startPosX.Value + 150, _startPosY.Value + 50);
Point p19 = new Point(_startPosX.Value + 125, _startPosY.Value + 50);
///отрисовка нижнего хвоста
Point p20 = new Point(_startPosX.Value + 125, _startPosY.Value + 70);
Point p21 = new Point(_startPosX.Value + 125, _startPosY.Value + 83);
Point p22 = new Point(_startPosX.Value + 150, _startPosY.Value + 100);
Point p23 = new Point(_startPosX.Value + 150, _startPosY.Value + 70);
Point p24 = new Point(_startPosX.Value + 125, _startPosY.Value + 70);
///отрисовка крепления нижнего двигателя
Point p33 = new Point(_startPosX.Value + 90, _startPosY.Value + 70);
Point p34 = new Point(_startPosX.Value + 95, _startPosY.Value + 75);
Point p35 = new Point(_startPosX.Value + 110, _startPosY.Value + 75);
Point p36 = new Point(_startPosX.Value + 115, _startPosY.Value + 70);
///отрисовка крепления верхнего двигателя
Point p37 = new Point(_startPosX.Value + 90, _startPosY.Value + 50);
Point p38 = new Point(_startPosX.Value + 95, _startPosY.Value + 45);
Point p39 = new Point(_startPosX.Value + 110, _startPosY.Value + 45);
Point p40 = new Point(_startPosX.Value + 115, _startPosY.Value + 50);
///отрисовка верхней ракеты
g.DrawEllipse(pen, _startPosX.Value +88, _startPosY.Value + 35, 34, 10);
///отрисовка нижней ракеты
g.DrawEllipse(pen, _startPosX.Value + 88, _startPosY.Value + 75, 34, 10);
///отрисовка винта
Point p25 = new Point(_startPosX.Value +10, _startPosY.Value + 60);
Point p26 = new Point(_startPosX.Value +5, _startPosY.Value + 35);
Point p27 = new Point(_startPosX.Value + 15, _startPosY.Value + 35);
Point p28 = new Point(_startPosX.Value +10, _startPosY.Value + 60);
Point p29 = new Point(_startPosX.Value + 10, _startPosY.Value + 60);
Point p30 = new Point(_startPosX.Value + 5, _startPosY.Value + 85);
Point p31 = new Point(_startPosX.Value + 15, _startPosY.Value + 85);
Point p32 = new Point(_startPosX.Value + 10, _startPosY.Value + 60);
if (EntityStormtrooper.Vint)
{
Point[] p_vint = { p25, p26, p27, p28, p29, p30, p31, p32 };
g.DrawPolygon(pen, p_vint);
}
// отрисовка двигателей
if (EntityStormtrooper.Dvigatel)
{
g.FillEllipse(additionalBrush, _startPosX.Value + 75, _startPosY.Value + 25, 15, 15);
g.FillEllipse(additionalBrush, _startPosX.Value + 75, _startPosY.Value + 75, 15, 15);
}
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 };
Point[] p_kreplenie2 = { p33, p34, p35, p36 };
Point[] p_kreplenie1 = { p37, p38, p39, p40 };
g.FillPolygon(nosBrush, 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_krilo1);
g.DrawPolygon(pen, p_krilo2);
g.DrawPolygon(pen, p_hvost1);
g.DrawPolygon(pen, p_hvost2);
g.DrawPolygon(pen, p_kreplenie2);
g.DrawPolygon(pen, p_kreplenie1);
}
}