176 lines
4.3 KiB
C#
176 lines
4.3 KiB
C#
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);
|
|
|
|
|
|
}
|
|
}
|