210 lines
9.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.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AirplaneWithRadar
{
/// <summary>
/// Класс, отвечающий за прорисовку и перемещение объекта-сущности
/// </summary>
internal class DrawingAirplane
{
/// <summary>
/// Класс-сущность
/// </summary>
public EntityAirplane Airplane { get; protected set; }
/// <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 = 303;
/// <summary>
/// Высота отрисовки самолета
/// </summary>
private readonly int _airplaneHeight = 108;
/// <summary>
/// Инициализация свойств
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес самолета</param>
/// <param name="bodyColor">Цвет кузова</param>
public DrawingAirplane(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 DrawingAirplane(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)
{
if (x > 0 && x < width)
{
_startPosX = x;
}
if (y > 0 && y < height)
{
_startPosY = y;
}
if (width > 0)
{
_pictureWidth = width;
}
if (height > 0)
{
_pictureHeight = height;
}
}
/// <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, 5);
g.DrawEllipse(pen, _startPosX, _startPosY + 50, 40, 40);
Brush br = new SolidBrush(Airplane?.BodyColor ?? Color.Black);
g.FillEllipse(br, _startPosX, _startPosY + 50, 40, 40);
g.FillRectangle(br, _startPosX + 20, _startPosY + 50, 230, 40);
Point point1 = new Point((int)_startPosX + 5, (int)_startPosY);
Point point2 = new Point((int)_startPosX + 5, (int)_startPosY + 50);
Point point3 = new Point((int)_startPosX + 70, (int)_startPosY + 50);
Point[] trianglePoints = { point1, point2, point3 };
g.FillPolygon(br, trianglePoints);
Point point4 = new Point((int)_startPosX + 250, (int)_startPosY + 47);
Point point5 = new Point((int)_startPosX + 297, (int)_startPosY + 70);
Point point6 = new Point((int)_startPosX + 250, (int)_startPosY + 93);
Point[] frontPoints = { point4, point5, point6 };
g.FillPolygon(br, frontPoints);
Pen thinPen = new(Color.Black, 3);
g.DrawLine(thinPen, _startPosX + 20, _startPosY + 50, _startPosX + 250, _startPosY + 50);
g.DrawLine(thinPen, _startPosX + 20, _startPosY + 91, _startPosX + 250, _startPosY + 91);
g.DrawLine(thinPen, _startPosX + 250, _startPosY + 47, _startPosX + 250, _startPosY + 93);
g.DrawLine(thinPen, _startPosX + 250, _startPosY + 70, _startPosX + 303, _startPosY + 70);
g.DrawLine(thinPen, _startPosX + 250, _startPosY + 47, _startPosX + 297, _startPosY + 70);
g.DrawLine(thinPen, _startPosX + 250, _startPosY + 93, _startPosX + 297, _startPosY + 70);
g.DrawLine(thinPen, _startPosX + 5, _startPosY, _startPosX + 5, _startPosY + 50);
g.DrawLine(thinPen, _startPosX + 5, _startPosY, _startPosX + 70, _startPosY + 50);
g.DrawLine(thinPen, _startPosX + 75, _startPosY + 90, _startPosX + 75, _startPosY + 100);
g.DrawRectangle(thinPen, _startPosX + 65, _startPosY + 100, 7, 7);
g.DrawRectangle(thinPen, _startPosX + 78, _startPosY + 100, 7, 7);
g.DrawLine(thinPen, _startPosX + 225, _startPosY + 90, _startPosX + 225, _startPosY + 100);
g.DrawRectangle(thinPen, _startPosX + 222, _startPosY + 100, 7, 7);
Brush brBlack = new SolidBrush(Color.Black);
g.FillRectangle(brBlack, _startPosX + 5, _startPosY + 45, 43, 12);
g.FillEllipse(brBlack, _startPosX, _startPosY + 45, 12, 12);
g.FillEllipse(brBlack, _startPosX + 40, _startPosY + 45, 12, 12);
g.FillRectangle(brBlack, _startPosX + 90, _startPosY + 67, 90, 8);
g.FillEllipse(brBlack, _startPosX + 83, _startPosY + 66, 9, 9);
g.FillEllipse(brBlack, _startPosX + 175, _startPosY + 66, 9, 9);
}
/// <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 Right, float Top, float Bottom) GetCurrentPosition()
{
return (_startPosX, _startPosX + _airplaneWidth, _startPosY, _startPosY + _airplaneHeight);
}
}
}