using System; using System.Collections.Generic; using System.Text; using System.Linq; using System.Threading.Tasks; using System.Drawing; namespace WinFormsApp1 { class TractorDraw { //Сущность public EntityTractor Tractor { get; protected set; } /// Левая координата отрисовки сущности protected float startPosX; /// Верхняя кооридната отрисовки сущности protected float startPosY; /// Ширина окна отрисовки private int? pictureWidth = null; /// Высота окна отрисовки private int? pictureHeight = null; /// Ширина отрисовки сущности private readonly int entWidth = 115; /// Высота отрисовки сущности private readonly int entHeight = 100; public TractorDraw(int speed, float weight, Color bodycolor) { Tractor = new EntityTractor(speed, weight, bodycolor); } /// Инициализация свойств /// Скорость /// Вес автомобиля /// Цвет кузова /// Ширина отрисовки автомобиля /// Высота отрисовки автомобиля /// protected TractorDraw(int speed, float weight, Color bodyColor, int trktrWidth, int trktrHeight) : this(speed, weight, bodyColor) { entWidth = trktrWidth; entHeight = trktrHeight; } //Установка позиции сущности public void SetPosition(int x, int y, int width, int height) { if (x < 0 || y < 0 || width < x + entWidth || height < y + entHeight) { pictureHeight = null; pictureWidth = null; return; } startPosX = x; startPosY = y; pictureHeight = height; pictureWidth = width; } //Изменение направления перемещения public void MoveTransport(Direction direction) { if (!pictureWidth.HasValue || !pictureHeight.HasValue) { return; } switch (direction) { case Direction.Right: if (startPosX + entWidth + Tractor.Step < pictureWidth) { startPosX += Tractor.Step; } break; case Direction.Left: if (startPosX - 10 - Tractor.Step > 0) { startPosX -= Tractor.Step; } break; case Direction.Down: if (startPosY + entHeight + Tractor.Step < pictureHeight) { startPosY += Tractor.Step; } break; case Direction.Up: if (startPosY - Tractor.Step > 0) { startPosY -= Tractor.Step; } break; case Direction.DRDiagonal: if (startPosX + entWidth + Tractor.Step < pictureWidth && startPosY + entHeight + Tractor.Step < pictureHeight) { startPosX += Tractor.Step; startPosY += Tractor.Step; } break; case Direction.DLDiagonal: if (startPosY + entHeight + Tractor.Step < pictureHeight && startPosX - 10 - Tractor.Step > 0) { startPosY += Tractor.Step; startPosX -= Tractor.Step; } break; case Direction.URDiagonal: if (startPosY - Tractor.Step > 0 && startPosX + entWidth + Tractor.Step < pictureWidth) { startPosY -= Tractor.Step; startPosX += Tractor.Step; } break; case Direction.ULDiagonal: if (startPosY - Tractor.Step > 0 && startPosX - 10 - Tractor.Step > 0) { startPosY -= Tractor.Step; startPosX -= Tractor.Step; } break; } } //Отрисовка сущности public virtual void DrawEntity(Graphics g) { if (startPosX < 0 || startPosY < 0 || !pictureHeight.HasValue || !pictureWidth.HasValue) { return; } Pen pen_Black_1pxl = new Pen(Color.Black, 1); Pen pen_Black_2pxl = new Pen(Color.Black, 2); g.DrawRectangle(pen_Black_1pxl, startPosX, startPosY, 40, 30); g.DrawRectangle(pen_Black_1pxl, startPosX, startPosY + 30, 100, 35); g.DrawRectangle(pen_Black_1pxl, startPosX + 72, startPosY + 10, 5, 20); g.DrawEllipse(pen_Black_1pxl, startPosX - 15, startPosY + 67, 30, 30); g.DrawEllipse(pen_Black_1pxl, startPosX + 85, startPosY + 67, 30, 30); g.DrawEllipse(pen_Black_1pxl, startPosX + 20, startPosY + 82, 15, 15); g.DrawEllipse(pen_Black_1pxl, startPosX + 40, startPosY + 82, 15, 15); g.DrawEllipse(pen_Black_1pxl, startPosX + 60, startPosY + 82, 15, 15); g.DrawEllipse(pen_Black_1pxl, startPosX + 35, startPosY + 68, 10, 10); g.DrawEllipse(pen_Black_1pxl, startPosX + 55, startPosY + 68, 10, 10); g.DrawLine(pen_Black_2pxl, startPosX, startPosY + 67, startPosX + 100, startPosY + 67); g.DrawLine(pen_Black_2pxl, startPosX, startPosY + 97, startPosX + 100, startPosY + 97); Brush br = new SolidBrush(Tractor?.BodyColor ?? Color.Black); g.FillRectangle(br, startPosX, startPosY, 40, 30); g.FillRectangle(br, startPosX, startPosY + 30, 100, 35); Brush brBlack = new SolidBrush(Color.Black); g.FillRectangle(brBlack, startPosX + 72, startPosY + 10, 5, 20); g.FillEllipse(brBlack, startPosX - 15, startPosY + 67, 30, 30); g.FillEllipse(brBlack, startPosX + 85, startPosY + 67, 30, 30); g.FillEllipse(brBlack, startPosX + 20, startPosY + 82, 15, 15); g.FillEllipse(brBlack, startPosX + 40, startPosY + 82, 15, 15); g.FillEllipse(brBlack, startPosX + 60, startPosY + 82, 15, 15); g.FillEllipse(brBlack, startPosX + 35, startPosY + 68, 10, 10); g.FillEllipse(brBlack, startPosX + 55, startPosY + 68, 10, 10); } //Смена границ формы public void ChangeBorders(int width, int height) { pictureWidth = width; pictureHeight = height; if (pictureWidth <= entWidth || pictureHeight <= entHeight) { pictureWidth = null; pictureHeight = null; return; } if (startPosX + entWidth > pictureWidth) { startPosX = pictureWidth.Value - entWidth; } if (startPosY + entHeight > pictureHeight) { startPosY = pictureHeight.Value - entHeight; } } public (float Left, float Right, float Top, float Bottom) GetCurrentPosition() { return (startPosX, startPosY, startPosX + entWidth, startPosY + entHeight); } } }