PIbd-23_Lisov_N.A._AirFight.../AirFighter/DrawingAircraft.cs

251 lines
8.6 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AirFighter
{
internal class DrawingAircraft
{
public EntityAircraft Plane { get; protected set; }
protected float _startPosX;
protected float _startPosY;
private int? _pictureWidth = null;
private int? _pictureHeight = null;
private readonly int _aircraftWidth = 100;
private readonly int _aircraftHeight = 100;
public DrawingAircraft(int speed, float weight, Color bodyColor)
{
Plane = new EntityAircraft(speed, weight, bodyColor);
}
protected DrawingAircraft(int speed, float weight, Color bodyColor, int aircraftWidth, int aircraftHeight) : this(speed, weight,bodyColor)
{
_aircraftHeight = aircraftHeight;
_aircraftWidth = aircraftWidth;
}
public void SetPosition(int x, int y, int width, int height)
{
if (x + _aircraftWidth > width || x < 0 || y + _aircraftHeight > height || y < 0)
{
return;
}
else
{
_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 + _aircraftWidth + Plane.Step < _pictureWidth)
{
_startPosX += Plane.Step;
}
}
break;
case Direction.Left:
{
if (_startPosX - Plane.Step > 0)
{
_startPosX -= Plane.Step;
}
}
break;
case Direction.Up:
{
if (_startPosY - Plane.Step > 0)
{
_startPosY -= Plane.Step;
}
}
break;
case Direction.Down:
{
if (_startPosY + _aircraftHeight + Plane.Step < _pictureHeight)
{
_startPosY += Plane.Step;
}
}
break;
case Direction.UpRight:
{
if (_startPosY - Plane.Step > 0 && _startPosX + _aircraftWidth + Plane.Step < _pictureWidth)
{
_startPosY -= Plane.Step;
_startPosX += Plane.Step;
}
}
break;
case Direction.UpLeft:
{
if (_startPosY - Plane.Step > 0 && _startPosX - Plane.Step > 0)
{
_startPosX -= Plane.Step;
_startPosY -= Plane.Step;
}
}
break;
case Direction.DownRight:
{
if (_startPosY + _aircraftHeight + Plane.Step < _pictureHeight && _startPosX + _aircraftWidth + Plane.Step < _pictureWidth)
{
_startPosY += Plane.Step;
_startPosX += Plane.Step;
}
}
break;
case Direction.DownLeft:
{
if (_startPosY + _aircraftHeight + Plane.Step < _pictureHeight && _startPosX - Plane.Step > 0)
{
_startPosY += Plane.Step;
_startPosX -= Plane.Step;
}
}
break;
}
}
public virtual void DrawTransport(Graphics g)
{
if (_startPosX < 0 || _startPosY < 0 || !_pictureHeight.HasValue || !_pictureWidth.HasValue)
{
return;
}
//Aircraft Body
Pen pen = new(Color.Black);
Brush brWhite = new SolidBrush(Plane.BodyColor);
g.FillRectangle(brWhite, _startPosX + 20, _startPosY + 45, 80, 14);
g.DrawRectangle(pen,_startPosX + 20, _startPosY + 45, 80, 14);
//Wings
GraphicsPath pathWing1 = new GraphicsPath();
Point point1B = new Point((int)(_startPosX + 50), (int)(_startPosY + 45));
Point point2B = new Point(point1B.X, point1B.Y - 40);
Point point3B = new Point(point2B.X + 6, point2B.Y);
Point point4B = new Point(point3B.X + 27, point1B.Y);
Point[] pointsWings = new Point[] { point1B, point2B, point3B, point4B };
pathWing1.AddLines(pointsWings);
g.DrawPath(pen, pathWing1);
g.FillPath(brWhite, pathWing1);
GraphicsPath pathWing2 = new GraphicsPath();
Point point1B2 = new Point((int)(_startPosX + 50), (int)(_startPosY + 60));
Point point2B2 = new Point(point1B2.X, point1B2.Y + 40);
Point point3B2 = new Point(point2B2.X + 6, point2B2.Y);
Point point4B2 = new Point(point3B2.X + 27, point1B2.Y);
Point[] pointsWings2 = new Point[] { point1B2, point2B2, point3B2, point4B2 };
pathWing2.AddLines(pointsWings2);
g.DrawPath(pen, pathWing2);
g.FillPath(brWhite, pathWing2);
//BackWings
GraphicsPath pathBackWing1 = new GraphicsPath();
Point point1W = new Point((int)(_startPosX + 85), (int)(_startPosY + 45));
Point point2W = new Point(point1W.X, point1W.Y - 7);
Point point3W = new Point(point2W.X + 15, point2W.Y - 16);
Point point4W = new Point(point3W.X, point1W.Y);
Point[] pointsBackWing1 = new Point[] { point1W, point2W, point3W, point4W };
pathBackWing1.AddLines(pointsBackWing1);
g.DrawPath(pen, pathBackWing1);
g.FillPath(brWhite, pathBackWing1);
GraphicsPath pathBackWing2 = new GraphicsPath();
Point point1W2 = new Point((int)(_startPosX + 85), (int)(_startPosY + 60));
Point point2W2 = new Point(point1W2.X, point1W2.Y + 7);
Point point3W2 = new Point(point2W2.X + 15, point2W2.Y +16);
Point point4W2 = new Point(point3W2.X, point1W2.Y);
Point[] pointsBackWing2 = new Point[] { point1W2, point2W2, point3W2, point4W2 };
pathBackWing2.AddLines(pointsBackWing2);
g.DrawPath(pen,pathBackWing2);
g.FillPath(brWhite,pathBackWing2);
Brush brBlack = new SolidBrush(Color.Black);
//Nose
GraphicsPath pathBoseBody = new GraphicsPath();
Point point1N = new Point((int)(_startPosX + 20), (int)(_startPosY + 45));
Point point2N = new Point(point1N.X - 15 ,point1N.Y + 7);
Point point3N = new Point(point1N.X, point1N.Y + 15);
Point[] pointsBoseBody = new Point[] { point1N,point2N,point3N};
pathBoseBody.AddLines(pointsBoseBody);
g.FillPath(brBlack,pathBoseBody);
}
public void ChangeBorders(int width, int height)
{
_pictureWidth = width;
_pictureHeight = height;
if (_pictureWidth <= _aircraftWidth || _pictureHeight <= _aircraftHeight)
{
_pictureHeight = null;
_pictureWidth = null;
return;
}
if (_startPosX + _aircraftWidth > _pictureWidth)
{
_startPosX = _pictureWidth.Value - _aircraftWidth;
}
if (_startPosY + _aircraftHeight > _pictureHeight)
{
_startPosY = _pictureHeight.Value - _aircraftHeight;
}
}
public (float Left, float Top, float Right, float Bottom) GetCurrentPosition()
{
return (_startPosX, _startPosY, _startPosX + _aircraftWidth - 1, _startPosY + _aircraftHeight - 1);
}
}
}