using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Hydroplane { public class DrawningHydroplane { /// /// Класс-сущность /// public EntityHydroplane? EntityHydroplane { get; private set; } /// /// Ширина окна /// private int _pictureWidth; /// /// Высота окна /// private int _pictureHeight; /// /// Левая координата прорисовки гидроплана /// private int _startPosX; /// /// Верхняя кооридната прорисовки гидроплана /// private int _startPosY; /// /// Ширина прорисовки гидроплана /// private readonly int _planeWidth = 175; /// /// Высота прорисовки гидроплана /// private readonly int _planeHeight = 80; /// /// Инициализация свойств /// /// Скорость /// Вес /// Цвет кузова /// Дополнительный цвет /// Признак наличия надувной лодки /// Признак наличия поплавков /// Ширина картинки /// Высота картинки /// true - объект создан, false - проверка не пройдена, нельзя создать объект в этих размерах public bool Init(int speed, double weight, Color bodyColor, Color additionalColor, bool boat, bool bobber, int width, int height) { _pictureWidth = width; _pictureHeight = height; if (_pictureWidth < _planeWidth || _pictureHeight < _planeHeight) { return false; } EntityHydroplane = new EntityHydroplane(); EntityHydroplane.Init(speed, weight, bodyColor, additionalColor, boat, bobber); return true; } /// /// Установка позиции /// /// Координата X /// Координата Y public void SetPosition(int x, int y) { _startPosX = Math.Min(x, _pictureWidth - _planeWidth); _startPosY = Math.Min(y, _pictureHeight - _planeHeight); } /// /// Изменение направления перемещения /// /// Направление public void MoveTransport(DirectionType direction) { if (EntityHydroplane == null) { return; } switch (direction) { //влево case DirectionType.Left: if (_startPosX - EntityHydroplane.Step > 0) { _startPosX -= (int)EntityHydroplane.Step; } break; //вверх case DirectionType.Up: if (_startPosY - EntityHydroplane.Step > 0) { _startPosY -= (int)EntityHydroplane.Step; } break; // вправо case DirectionType.Right: if (_startPosX + EntityHydroplane.Step + _planeWidth < _pictureWidth) { _startPosX += (int)EntityHydroplane.Step; } break; //вниз case DirectionType.Down: if (_startPosY + EntityHydroplane.Step + _planeHeight < _pictureHeight) { _startPosY += (int)EntityHydroplane.Step; } break; } } /// /// Прорисовка объекта /// /// public void DrawTransport(Graphics g) { if (EntityHydroplane == null) { return; } Pen pen = new(Color.Black); Brush additionalBrush = new SolidBrush(EntityHydroplane.AdditionalColor); Brush bodyBrush = new SolidBrush(EntityHydroplane.BodyColor); //раскраска основы g.FillPolygon(bodyBrush, new[] { new Point(_startPosX + 5, _startPosY), new Point(_startPosX + 5, _startPosY + 55), new Point(_startPosX + 130, _startPosY + 55), new Point(_startPosX + 160, _startPosY + 40), new Point(_startPosX + 130, _startPosY + 40), new Point(_startPosX + 130, _startPosY + 25), new Point(_startPosX + 55, _startPosY + 25) }); //раскраска ножек g.FillRectangle(bodyBrush, _startPosX + 65, _startPosY + 55, 5, 15); g.FillRectangle(bodyBrush, _startPosX + 125, _startPosY + 55, 5, 15); //раскраска иллюминаторов g.FillEllipse(additionalBrush, _startPosX + 40, _startPosY + 30, 10, 10); g.FillEllipse(additionalBrush, _startPosX + 60, _startPosY + 30, 10, 10); g.FillEllipse(additionalBrush, _startPosX + 80, _startPosY + 30, 10, 10); //раскраска окна g.FillPolygon(additionalBrush, new[] { new Point(_startPosX + 160, _startPosY + 40), new Point(_startPosX + 130, _startPosY + 40), new Point(_startPosX + 130, _startPosY + 25) }); //основа g.DrawRectangle(pen, _startPosX + 5, _startPosY + 25, 125, 30); //хвост g.DrawLine(pen, _startPosX + 5, _startPosY + 25, _startPosX + 5, _startPosY); g.DrawLine(pen, _startPosX + 55, _startPosY + 25, _startPosX + 5, _startPosY); //нос g.DrawLine(pen, _startPosX + 130, _startPosY + 25, _startPosX + 160, _startPosY + 40); g.DrawLine(pen, _startPosX + 130, _startPosY + 55, _startPosX + 160, _startPosY + 40); g.DrawLine(pen, _startPosX + 130, _startPosY + 40, _startPosX + 160, _startPosY + 40); //иллюминаторы g.DrawEllipse(pen, _startPosX + 40, _startPosY + 30, 10, 10); g.DrawEllipse(pen, _startPosX + 60, _startPosY + 30, 10, 10); g.DrawEllipse(pen, _startPosX + 80, _startPosY + 30, 10, 10); //крыло сбоку g.DrawEllipse(pen, _startPosX + 35, _startPosY + 43, 80, 7); //ножки снизу g.DrawLine(pen, _startPosX + 65, _startPosY + 55, _startPosX + 65, _startPosY + 70); g.DrawLine(pen, _startPosX + 70, _startPosY + 55, _startPosX + 70, _startPosY + 70); g.DrawLine(pen, _startPosX + 125, _startPosY + 55, _startPosX + 125, _startPosY + 70); g.DrawLine(pen, _startPosX + 130, _startPosY + 55, _startPosX + 130, _startPosY + 70); //поплавки(лыжи) или колеса if (EntityHydroplane.Bobber) { g.FillPolygon(additionalBrush, new[] { new Point(_startPosX + 55, _startPosY + 70), new Point(_startPosX + 55, _startPosY + 80), new Point(_startPosX + 155, _startPosY + 80), new Point(_startPosX + 175, _startPosY + 70) }); g.DrawPolygon(pen, new[] { new Point(_startPosX + 55, _startPosY + 70), new Point(_startPosX + 55, _startPosY + 80), new Point(_startPosX + 155, _startPosY + 80), new Point(_startPosX + 175, _startPosY + 70) }); } else { g.FillEllipse(additionalBrush, _startPosX + 60, _startPosY + 70, 15, 15); g.FillEllipse(additionalBrush, _startPosX + 120, _startPosY + 70, 15, 15); g.DrawEllipse(pen, _startPosX + 60, _startPosY + 70, 15, 15); g.DrawEllipse(pen, _startPosX + 120, _startPosY + 70, 15, 15); } //надувная лодка if (EntityHydroplane.Boat) { g.FillEllipse(additionalBrush, _startPosX, _startPosY + 21, 32, 8); g.DrawEllipse(pen, _startPosX, _startPosY + 21, 32, 8); } } } }