using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Hydroplane.Entities; using Hydroplane.MovementStrategy; namespace Hydroplane.DrawningObjects { public class DrawningPlane { public EntityPlane? EntityPlane { get; protected set; } private int _pictureWidth; private int _pictureHeight; protected int _startPosX; protected int _startPosY; private readonly int _planeWidth = 175; private readonly int _planeHeight = 80; public int GetPosX => _startPosX; public int GetPosY => _startPosY; public int GetWidth => _planeWidth; public int GetHeight => _planeHeight; public DrawningPlane(int speed, double weight, Color bodyColor, int width, int height) { _pictureWidth = width; _pictureHeight = height; if (width < _pictureWidth || height < _pictureHeight) { return; } EntityPlane = new EntityPlane(speed, weight, bodyColor); } protected DrawningPlane(int speed, double weight, Color bodyColor, int width, int height, int planeWidth, int planeHeight) { _pictureWidth = width; _pictureHeight = height; _pictureWidth = planeWidth; _pictureHeight = planeHeight; if (width < _pictureWidth || height < _pictureHeight) { return; } EntityPlane = new EntityPlane(speed, weight, bodyColor); } public IMoveableObject GetMoveableObject => new DrawningObjectPlane(this); public void SetPosition(int x, int y) { _startPosX = Math.Min(x, _pictureWidth - _planeWidth); _startPosY = Math.Min(y, _pictureHeight - _planeHeight); } public bool CanMove(DirectionType direction) { if (EntityPlane == null) { return false; } return direction switch { //влево DirectionType.Left => _startPosX - EntityPlane.Step > 0, //вверх DirectionType.Up => _startPosY - EntityPlane.Step > 0, // вправо DirectionType.Right => _startPosX + EntityPlane.Step < _pictureWidth, //вниз DirectionType.Down => _startPosY + EntityPlane.Step < _pictureHeight, _ => false }; } public void MoveTransport(DirectionType direction) { if (!CanMove(direction) || EntityPlane == null) { return; } switch (direction) { //влево case DirectionType.Left: if (_startPosX - EntityPlane.Step > 0) { _startPosX -= (int)EntityPlane.Step; } break; //вверх case DirectionType.Up: if (_startPosY - EntityPlane.Step > 0) { _startPosY -= (int)EntityPlane.Step; } break; // вправо case DirectionType.Right: if (_startPosX + EntityPlane.Step + _planeWidth < _pictureWidth) { _startPosX += (int)EntityPlane.Step; } break; //вниз case DirectionType.Down: if (_startPosY + EntityPlane.Step + _planeHeight < _pictureHeight) { _startPosY += (int)EntityPlane.Step; } break; } } /// /// Прорисовка объекта /// /// public virtual void DrawTransport(Graphics g) { if (EntityPlane == null) { return; } Pen pen = new(Color.Black); Brush bodyBrush = new SolidBrush(EntityPlane.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.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); } } }