using ProjectPlane.Entities; namespace ProjectPlane.Drawnings; public class DrawningShip { public EntityShip? EntityShip { get; protected set; } private int? _PictureWidth; private int? _PictureHeight; protected int? _StartPosX; protected int? _StartPosY; private readonly int _drawingContWidth = 160; private readonly int _drawingContHeight = 50; public int? GetPosX => _StartPosX; public int? GetPosY => _StartPosY; public int GetWidth => _drawingContWidth; public int GetHeight => _drawingContHeight; private DrawningShip() { _PictureWidth = null; _PictureHeight = null; _StartPosX = null; _StartPosY = null; } public DrawningShip(int speed, double weight, Color shipColor) : this() { EntityShip = new EntityShip(speed, weight, shipColor); } protected DrawningShip(int drawingShipWidth, int drawingShipHeight) : this() { _drawingContWidth = drawingShipWidth; _drawingContHeight = drawingShipHeight; } public bool SetPictureSize(int width, int height) { if (EntityShip == null) { return false; } if (width >= _drawingContWidth && height >= _drawingContHeight) { _PictureWidth = width; _PictureHeight = height; if (_StartPosX.HasValue && _StartPosY.HasValue) { if (_StartPosX.Value + _drawingContWidth > width) { _StartPosX = width - _drawingContWidth; } if (_StartPosY.Value + _drawingContHeight > height) { _StartPosY = _PictureHeight - height; } } return true; } return false; } public void SetPosition(int x, int y) { if (!_PictureHeight.HasValue || !_PictureWidth.HasValue) { return; } if (x < 0) { x = 0; } else if (x + _drawingContWidth > _PictureWidth) { x = _PictureWidth.Value - _drawingContWidth; } if (y < 0) { y = 0; } else if (y + _drawingContHeight > _PictureHeight) { y = _PictureHeight.Value - _drawingContHeight; } _StartPosX = x; _StartPosY = y; } public bool MoveTransport(DirectionType direction) { if (EntityShip == null || !_StartPosX.HasValue || !_StartPosY.HasValue) { return false; } switch (direction) { case DirectionType.Left: if (_StartPosX.Value - EntityShip.Step > 0) { _StartPosX -= (int)EntityShip.Step; } return true; case DirectionType.Right: if (_StartPosX.Value + EntityShip.Step < _PictureWidth - _drawingContWidth) { _StartPosX += (int)EntityShip.Step; } return true; case DirectionType.Up: if (_StartPosY.Value - EntityShip.Step > 0) { _StartPosY -= (int)EntityShip.Step; } return true; case DirectionType.Down: if (_StartPosY.Value + EntityShip.Step < _PictureHeight - _drawingContHeight) { _StartPosY += (int)EntityShip.Step; } return true; default: return false; } } public virtual void DrawTransport(Graphics g) { if (EntityShip == null || !_StartPosX.HasValue || !_StartPosY.HasValue) { return; } Pen pen = new(Color.Black); Brush ShipBrush = new SolidBrush(EntityShip.ShipColor); //отрисовка корабля Point[] points = { new Point(_StartPosX.Value, _StartPosY.Value), new Point(_StartPosX.Value + 160, _StartPosY.Value), new Point(_StartPosX.Value + 150, _StartPosY.Value + 50), new Point(_StartPosX.Value + 10, _StartPosY.Value + 50), }; g.DrawPolygon(pen, points); g.FillPolygon(ShipBrush, points); } }