2023-11-27 13:18:25 +04:00

197 lines
9.3 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 Airbus_Base
{
internal class DrawningAirbus
{
/// <summary>
/// Класс-сущность
/// </summary>
public EntityAirbus? EntityAirbus { 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 _airbusWidth = 159;
/// <summary>
/// Высота прорисовки аэробуса
/// </summary>
private readonly int _airbusHeight = 103;
/// <summary>
/// Инициализация свойств
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес</param>
/// <param name="bodyColor">Цвет корпуса</param>
/// <param name="additionalColor">Дополнительный цвет</param>
/// <param name="additionalEngine">Признак наличия дополнительных двигателей</param>
/// <param name="additionalPassengerCompartment">Признак наличия дополнительного отсека для пассажиров</param>
/// <param name="width">Ширина картинки</param>
/// <param name="height">Высота картинки</param>
/// <returns>true - объект создан, false - проверка не пройдена, нельзя создать объект в этих размерах</returns>
public bool Init(int speed, double weight, Color bodyColor, Color
additionalColor, bool additionalEngine, bool additionalPassengerCompartment, int width, int height)
{
if (width > _airbusWidth & height > _airbusHeight)
{
_pictureWidth = width;
_pictureHeight = height;
EntityAirbus = new EntityAirbus();
EntityAirbus.Init(speed, weight, bodyColor, additionalColor,
additionalEngine, additionalPassengerCompartment);
return true;
}
else return false;
}
/// <summary>
/// Установка позиции
/// </summary>
/// <param name="x">Координата X</param>
/// <param name="y">Координата Y</param>
public void SetPosition(int x, int y)
{
if (_startPosY + _airbusHeight < _pictureHeight)
_startPosY = y;
else
_startPosY = _pictureHeight - _airbusHeight;
if (_startPosX + _airbusWidth < _pictureWidth)
_startPosX = x;
else
_startPosX = _pictureWidth - _airbusWidth;
}
/// <summary>
/// Изменение направления перемещения
/// </summary>
/// <param name="direction">Направление</param>
public void MoveTransport(DirectionType direction)
{
if (EntityAirbus == null)
{
return;
}
switch (direction)
{
//влево
case DirectionType.Left:
if (_startPosX - EntityAirbus.Step > 0)
{
_startPosX -= (int)EntityAirbus.Step;
}
else _startPosX = 0;
break;
//вверх
case DirectionType.Up:
if (_startPosY - EntityAirbus.Step > 0)
{
_startPosY -= (int)EntityAirbus.Step;
}
else _startPosY = 0;
break;
// вправо
case DirectionType.Right:
if (_startPosX + _airbusWidth + EntityAirbus.Step < _pictureWidth)
{
_startPosX += (int)EntityAirbus.Step;
}
else _startPosX = _pictureWidth - _airbusWidth;
break;
//вниз
case DirectionType.Down:
if (_startPosY + _airbusHeight + EntityAirbus.Step < _pictureHeight)
{
_startPosY += (int)EntityAirbus.Step;
}
else _startPosY = _pictureHeight - _airbusHeight;
break;
}
}
/// <summary>
/// Прорисовка объекта
/// </summary>
/// <param name="g"></param>
public void DrawTransport(Graphics g)
{
if (EntityAirbus == null)
{
return;
}
Pen pen = new(Color.Black);
Brush brBlack = new SolidBrush(Color.Black);
Brush bodybrush = new SolidBrush(EntityAirbus.BodyColor);
Brush brAdd = new SolidBrush(EntityAirbus.AdditionalColor);
//передняя часть
Point[] k = { new Point(_startPosX + 140, _startPosY + 30),
new Point(_startPosX + 160, _startPosY + 56), new Point(_startPosX + 140, _startPosY + 81)};
g.FillPolygon(brBlack, k);
//корпус
g.FillRectangle(bodybrush, _startPosX + 20, _startPosY + 30, 120, 50);
g.DrawRectangle(pen, _startPosX + 20, _startPosY + 30, 120, 50);
//колеса
g.DrawLine(pen, _startPosX + 45, _startPosY + 81, _startPosX + 45, _startPosY + 90);
g.DrawLine(pen, _startPosX + 110, _startPosY + 81, _startPosX + 110, _startPosY + 90);
g.FillEllipse(brBlack, _startPosX + 45, _startPosY + 85, 10, 10);
g.FillEllipse(brBlack, _startPosX + 35, _startPosY + 85, 10, 10);
g.FillEllipse(brBlack, _startPosX + 100, _startPosY + 85, 10, 10);
g.FillEllipse(brBlack, _startPosX + 110, _startPosY + 85, 10, 10);
//хвост
Point[] points1 = { new Point(_startPosX + 20, _startPosY + 30),
new Point(_startPosX + 20, _startPosY + 0), new Point(_startPosX + 50, _startPosY + 30)};
g.FillPolygon(bodybrush, points1);
g.DrawLine(pen, _startPosX + 20, _startPosY + 30, _startPosX + 20, _startPosY + 0);
g.DrawLine(pen, _startPosX + 20, _startPosY + 0, _startPosX + 50, _startPosY + 30);
//крылья
Point[] points2 = { new Point(_startPosX + 65, _startPosY + 30),
new Point(_startPosX + 45, _startPosY + 10), new Point(_startPosX + 88, _startPosY + 30)};
g.FillPolygon(bodybrush, points2);
g.DrawLine(pen, _startPosX + 65, _startPosY + 30, _startPosX + 45, _startPosY + 10);
g.DrawLine(pen, _startPosX + 45, _startPosY + 10, _startPosX + 88, _startPosY + 30);
Point[] points3 = { new Point(_startPosX + 65, _startPosY + 60),
new Point(_startPosX + 45, _startPosY + 100), new Point(_startPosX + 100, _startPosY + 60)};
g.FillPolygon(bodybrush, points3);
g.DrawLine(pen, _startPosX + 65, _startPosY + 60, _startPosX + 45, _startPosY + 100);
g.DrawLine(pen, _startPosX + 45, _startPosY + 100, _startPosX + 100, _startPosY + 60);
g.FillEllipse(brBlack, _startPosX + 16, _startPosY + 27, 30, 6);
//Дополнительные двигатели
if (EntityAirbus.AdditionalEngine)
{
Point[] enginedraw = { new Point(_startPosX + 55, _startPosY + 30),
new Point(_startPosX + 69, _startPosY + 25), new Point(_startPosX + 55, _startPosY + 20)};
g.FillPolygon(brAdd, enginedraw);
Point[] enginedraw1 = { new Point(_startPosX + 55, _startPosY + 75),
new Point(_startPosX + 70, _startPosY + 70), new Point(_startPosX + 55, _startPosY + 65)};
g.FillPolygon(brAdd, enginedraw1);
}
//Дополнительный отсек для пассажиров
if (EntityAirbus.AdditionalPassengerCompartment)
{
Point[] points = { new Point(_startPosX + 90, _startPosY + 30),
new Point(_startPosX + 100, _startPosY + 15), new Point(_startPosX + 130, _startPosY + 15),
new Point(_startPosX + 140, _startPosY + 30) };
g.FillPolygon(brAdd, points);
g.DrawLine(pen, _startPosX + 90, _startPosY + 30, _startPosX + 100, _startPosY + 15);
g.DrawLine(pen, _startPosX + 100, _startPosY + 15, _startPosX + 130, _startPosY + 15);
g.DrawLine(pen, _startPosX + 130, _startPosY + 15, _startPosX + 140, _startPosY + 30);
}
}
}
}