2022-10-19 01:56:08 +04:00

212 lines
8.1 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 AirplaneWithRadar
{
/// <summary>
/// Класс, отвечающий за прорисовку и перемещение объекта-сущности
/// </summary>
public class DrawningAirplane
{
/// <summary>
/// Класс-сущность
/// </summary>
public EntityAirplane Airplane { protected set; get; }
/// <summary>
/// Левая координата отрисовки самолёта
/// </summary>
protected float _startPosX;
/// <summary>
/// Верхняя кооридната отрисовки самолёта
/// </summary>
protected float _startPosY;
/// <summary>
/// Ширина окна отрисовки
/// </summary>
private int? _pictureWidth = null;
/// <summary>
/// Высота окна отрисовки
/// </summary>
private int? _pictureHeight = null;
/// <summary>
/// Ширина отрисовки
/// </summary>
private readonly int _airplaneWidth = 100;
/// <summary>
/// Высота отрисовки самолёта
/// </summary>
private readonly int _airplaneHeight = 20;
/// <summary>
/// Инициализация свойств
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес</param>
/// <param name="bodyColor">Цвет</param>
public DrawningAirplane(int speed, float weight, Color bodyColor)
{
Airplane = new EntityAirplane(speed, weight, bodyColor);
}
/// <summary>
/// Инициализация свойств
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес самолёта</param>
/// <param name="bodyColor">Цвет кузова</param>
/// <param name="airplaneWidth">Ширина отрисовки самолёта</param>
/// <param name="airplaneHeight">Высота отрисовки самолёта</param>
protected DrawningAirplane(int speed, float weight, Color bodyColor, int
airplaneWidth, int airplaneHeight) :
this(speed, weight, bodyColor)
{
_airplaneWidth = airplaneWidth;
_airplaneHeight = airplaneHeight;
}
/// <summary>
/// Установка позиции
/// </summary>
/// <param name="x">Координата X</param>
/// <param name="y">Координата Y</param>
/// <param name="width">Ширина картинки</param>
/// <param name="height">Высота картинки</param>
public void SetPosition(int x, int y, int width, int height)
{
_startPosX = x;
_startPosY = y;
_pictureWidth = width;
_pictureHeight = height;
if (x < 0 || y < 0 || width <= _airplaneWidth || height <= _airplaneHeight || x + _airplaneWidth > width || y + _airplaneHeight > height)
{
_pictureHeight = null;
_pictureWidth = null;
}
}
/// <summary>
/// Изменение направления перемещения
/// </summary>
/// <param name="direction">Направление</param>
public void MoveTransport(Direction direction)
{
if (!_pictureWidth.HasValue || !_pictureHeight.HasValue)
{
return;
}
switch (direction)
{
// вправо
case Direction.Right:
if (_startPosX + _airplaneWidth + Airplane.Step < _pictureWidth)
{
_startPosX += Airplane.Step;
}
break;
//влево
case Direction.Left:
if (_startPosX - Airplane.Step > 0)
{
_startPosX -= Airplane.Step;
}
break;
//вверх
case Direction.Up:
if (_startPosY - Airplane.Step > 0)
{
_startPosY -= Airplane.Step;
}
break;
//вниз
case Direction.Down:
if (_startPosY + _airplaneHeight + Airplane.Step < _pictureHeight)
{
_startPosY += Airplane.Step;
}
break;
}
}
/// <summary>
/// Отрисовка самолёта
/// </summary>
/// <param name="g"></param>
public virtual void DrawTransport(Graphics g)
{
if (_startPosX < 0 || _startPosY < 0
|| !_pictureHeight.HasValue || !_pictureWidth.HasValue)
{
return;
}
Pen pen = new(Color.Black);
Brush brush = new SolidBrush(Airplane.BodyColor);
int h = 10;
_startPosY += 4;
//корпус
g.DrawRectangle(pen, _startPosX, _startPosY + h-7, _airplaneWidth-15, h);
//нос
PointF[] point = new PointF[3];
point[0] = new PointF(_startPosX + _airplaneWidth-15, _startPosY + h / 3);
point[1] = new PointF(_startPosX + _airplaneWidth , _startPosY + h-3);
point[2] = new PointF(_startPosX + _airplaneWidth-15, _startPosY + h + (h / 3));
g.FillPolygon(brush, point);
//хвост
point = new PointF[3];
point[0] = new PointF(_startPosX, _startPosY-10);
point[1] = new PointF(_startPosX, _startPosY + h / 3);
point[2] = new PointF(_startPosX + 15, _startPosY + h / 3);
g.FillPolygon(brush, point);
//крылья
g.DrawLine(pen, _startPosX + 20, _startPosY + h - 3, _startPosX + 60, _startPosY + h - 3);
g.DrawLine(pen, _startPosX + 20, _startPosY + h - 2, _startPosX + 60, _startPosY + h - 2);
g.DrawLine(pen, _startPosX-1, _startPosY + h / 3, _startPosX + 15, _startPosY + h / 3);
g.DrawLine(pen, _startPosX-1, _startPosY + h / 3 + 1, _startPosX + 15, _startPosY + h / 3 + 1);
g.DrawLine(pen, _startPosX-1, _startPosY + h / 3 + 2, _startPosX + 15, _startPosY + h / 3 + 2);
//колёса
g.DrawRectangle(pen, _startPosX + 20, _startPosY + h + (h / 3), 2, 2);
g.DrawRectangle(pen, _startPosX + 24, _startPosY + h + (h / 3), 2, 2);
g.DrawRectangle(pen, _startPosX + _airplaneWidth-20, _startPosY + h + (h / 3), 2, 2);
_startPosY -= 4;
}
/// <summary>
/// Смена границ формы отрисовки
/// </summary>
/// <param name="width">Ширина картинки</param>
/// <param name="height">Высота картинки</param>
public void ChangeBorders(int width, int height)
{
_pictureWidth = width;
_pictureHeight = height;
if (_pictureWidth <= _airplaneWidth || _pictureHeight <= _airplaneHeight)
{
_pictureWidth = null;
_pictureHeight = null;
return;
}
if (_startPosX + _airplaneWidth > _pictureWidth)
{
_startPosX = _pictureWidth.Value - _airplaneWidth;
}
if (_startPosY + _airplaneHeight > _pictureHeight)
{
_startPosY = _pictureHeight.Value - _airplaneHeight;
}
}
/// <summary>
/// Получение текущей позиции объекта
/// </summary>
/// <returns></returns>
public (float Left, float Top, float Right, float Bottom)
GetCurrentPosition()
{
return (_startPosX, _startPosY, _startPosX + _airplaneWidth, _startPosY +
_airplaneHeight);
}
}
}