205 lines
7.2 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Airbus
{
//класс, отвечающий за прорисовку и перемещение объект
public class DrawningAirbus
{
public EntityAirbus Airbus { get; protected set; } //класс-сущность
protected float _startPosX; //левая координата отрисовки
protected float _startPosY; //верхняя координата отрисовки
private int? _pictureWidth = null; //ширина окна отрисовки
private int? _pictureHeight = null; //высота окна отрисовки
protected readonly int _airbusWidth = 100; //ширина отрисовки самолёта
protected readonly int _airbusHeight = 62; //высота отрисовки самолёта
//инициализаци свойств
public DrawningAirbus(int speed, float weight, Color corpusColor)
{
Airbus = new EntityAirbus(speed, weight, corpusColor);
}
protected DrawningAirbus(int speed, float weight, Color corpusColor, int airbusWidth, int airbusHeight) :
this(speed, weight, corpusColor)
{
_airbusWidth = airbusWidth;
_airbusHeight = airbusHeight;
}
//установка координат позиции самолёта
public void SetPosition(int x, int y, int width, int height)
{
if (x < 0 || y < 0 || width < x + _airbusWidth || height < y + _airbusHeight)
{
_pictureHeight = null;
_pictureWidth = null;
return;
}
_startPosX = x;
_startPosY = y;
_pictureWidth = width;
_pictureHeight = height;
}
//изменение направления движения
public void MoveTransport(Direction direction)
{
if (!_pictureWidth.HasValue || !_pictureHeight.HasValue)
{
return;
}
switch (direction)
{
case Direction.Right: //вправо
if (_startPosX + _airbusWidth + Airbus.Step < _pictureWidth)
{
_startPosX += Airbus.Step;
}
break;
case Direction.Left: //влево
if (_startPosX - Airbus.Step > 0)
{
_startPosX -= Airbus.Step;
}
break;
case Direction.Up: //вверх
if (_startPosY - Airbus.Step > 0)
{
_startPosY -= Airbus.Step;
}
break;
case Direction.Down: //вниз
if (_startPosY + _airbusHeight + Airbus.Step < _pictureHeight)
{
_startPosY += Airbus.Step;
}
break;
}
}
//отрисовка самолёта
public virtual void DrawTransport(Graphics g)
{
if (_startPosX < 0 || _startPosY < 0 || !_pictureHeight.HasValue || !_pictureWidth.HasValue)
{
return;
}
Pen pen = new Pen(Color.Black);
Brush selectedBrush = new SolidBrush(Airbus.CorpusColor);
Brush br = new SolidBrush(Airbus?.CorpusColor ?? Color.Black);
//хвостовое крыло
PointF point1 = new PointF(_startPosX, _startPosY);
PointF point2 = new PointF(_startPosX, _startPosY + 30);
PointF point3 = new PointF(_startPosX + 30, _startPosY + 30);
PointF[] nose = { point1, point2, point3 };
g.DrawPolygon(pen, nose);
g.FillPolygon(selectedBrush, nose);
//корпус
PointF point4 = new PointF(_startPosX, _startPosY + 30);
PointF point5 = new PointF(_startPosX + 80, _startPosY + 30);
PointF point6 = new PointF(_startPosX + 80, _startPosY + 50);
PointF point7 = new PointF(_startPosX, _startPosY + 50);
PointF[] rwing = { point4, point5, point6, point7 };
g.DrawPolygon(pen, rwing);
g.FillPolygon(selectedBrush, rwing);
// нос самолёта
PointF point8 = new PointF(_startPosX + 80, _startPosY + 30);
PointF point9 = new PointF(_startPosX + 80, _startPosY + 50);
PointF point10 = new PointF(_startPosX + 100, _startPosY + 40);
PointF[] lwing = { point8, point9, point10 };
g.DrawPolygon(pen, lwing);
g.FillPolygon(selectedBrush, lwing);
//задние шасси
PointF point12 = new PointF(_startPosX + 10, _startPosY + 50);
PointF point13 = new PointF(_startPosX + 10, _startPosY + 60);
PointF[] lback = { point12, point13 };
g.DrawPolygon(pen, lback);
//переднее шасси
PointF point14 = new PointF(_startPosX + 50, _startPosY + 50);
PointF point15 = new PointF(_startPosX + 50, _startPosY + 60);
PointF[] xback = { point14, point15 };
g.DrawPolygon(pen, xback);
Brush brBack = new SolidBrush(Color.Black);
//задние шасси
g.FillEllipse(selectedBrush, _startPosX + 10, _startPosY + 55, 10, 10);
g.FillEllipse(selectedBrush, _startPosX + 45, _startPosY + 55, 10, 10);
//переднее шасси
g.FillEllipse(selectedBrush, _startPosX, _startPosY + 55, 10, 10);
g.FillPolygon(br, lwing);
g.FillPolygon(br, nose);
g.FillPolygon(br, rwing);
g.FillPolygon(br, lback);
Brush Black = new SolidBrush(Color.Black);
//заднее поперечное крыло
g.FillEllipse(selectedBrush, _startPosX, _startPosY + 25, 25, 10);
//крыло
g.FillEllipse(selectedBrush, _startPosX + 20, _startPosY + 35, 50, 10);
}
//смена границ формы отрисовки
public void ChangeBorders(int width, int height)
{
_pictureWidth = width;
_pictureHeight = height;
if (_pictureWidth <= _airbusWidth || _pictureHeight <= _airbusHeight)
{
_pictureWidth = null;
_pictureHeight = null;
return;
}
if (_startPosX + _airbusWidth > _pictureWidth)
{
_startPosX = _pictureWidth.Value - _airbusWidth;
}
if (_startPosY + _airbusHeight > _pictureHeight)
{
_startPosY = _pictureHeight.Value - _airbusHeight;
}
}
//получение текущей позиции объекта
public (float Left, float Right, float Top, float Bottom) GetCurrentPosition()
{
return (_startPosX, _startPosY, _startPosX + _airbusWidth, _startPosY + _airbusHeight);
}
}
}