205 lines
7.2 KiB
C#
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);
|
|
}
|
|
}
|
|
} |