using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using DumpTruck.Entities; using DumpTruck.MovementStrategy; namespace DumpTruck.DrawingObjects { public class DrawingTruck { /// /// Класс-сущность /// public EntityTruck? EntityTruck { get; protected set; } /// /// Ширина окна /// private int _pictureWidth; /// /// Высота окна /// private int _pictureHeight; /// /// Левая координата прорисовки грузовика /// protected int _startPosX; /// /// Верхняя кооридната прорисовки грузовика /// protected int _startPosY; /// /// Ширина прорисовки грузовика /// protected readonly int _truckWidth = 160; /// /// Высота прорисовки грузовика /// protected readonly int _truckHeight = 90; /// /// Координата X объекта /// public int GetPosX => _startPosX; /// /// Координата Y объекта /// public int GetPosY => _startPosY; /// /// Ширина объекта /// public int GetWidth => _truckWidth; /// /// Высота объекта /// public int GetHeight => _truckHeight; /// /// Получение объекта IMoveableObject из объекта DrawingTruck /// public IMoveableObject GetMoveableObject => new DrawningObjectTruck(this); /// /// Конструктор /// /// Скорость /// Вес /// Основной цвет /// Ширина картинки /// Высота картинки public DrawingTruck(int speed, double weight, Color bodyColor, int width, int height) { if (width < _truckWidth || height < _truckHeight) return; _pictureWidth = width; _pictureHeight = height; EntityTruck = new EntityTruck(speed, weight, bodyColor); } /// /// Конструктор /// /// Скорость /// Вес /// Основной цвет /// Ширина картинки /// Высота картинки /// Ширина прорисовки грузовика /// Высота прорисовки грузовика protected DrawingTruck(int speed, double weight, Color bodyColor, int width, int height, int truckWidth, int truckHeight) { if (width < truckWidth || height < truckHeight) return; _pictureWidth = width; _pictureHeight = height; _truckWidth = truckWidth; _truckHeight = truckHeight; EntityTruck = new EntityTruck(speed, weight, bodyColor); } /// /// Установка позиции /// /// Координата X /// Координата Y public void SetPosition(int x, int y) { if (x < 0 || x + _truckWidth > _pictureWidth) x = 0; if (y < 0 || y + _truckHeight > _pictureHeight) y = 0; _startPosX = x; _startPosY = y; } /// /// Проверка, что объект может переместится по указанному направлению /// /// Направление /// true - можно переместится по указанному направлению public bool CanMove(Direction direction) { if (EntityTruck == null) { return false; } return direction switch { //влево Direction.Left => _startPosX - EntityTruck.Step > 0, //вверх Direction.Up => _startPosY - EntityTruck.Step > 0, // вправо Direction.Right => _startPosX + _truckWidth + EntityTruck.Step < _pictureWidth, //вниз Direction.Down => _startPosY + _truckHeight + EntityTruck.Step < _pictureHeight, _ => false, }; } /// /// Изменение направления перемещения /// /// Направление public void MoveTransport(Direction direction) { if (!CanMove(direction) || EntityTruck == null) { return; } switch (direction) { //влево case Direction.Left: if (_startPosX - EntityTruck.Step > 0) { _startPosX -= (int)EntityTruck.Step; } break; //вверх case Direction.Up: if (_startPosY - EntityTruck.Step > 0) { _startPosY -= (int)EntityTruck.Step; } break; // вправо case Direction.Right: if (_startPosX + _truckWidth + EntityTruck.Step < _pictureWidth) { _startPosX += (int)EntityTruck.Step; } break; //вниз case Direction.Down: if (_startPosY + _truckHeight + EntityTruck.Step < _pictureHeight) { _startPosY += (int)EntityTruck.Step; } break; } } /// /// Прорисовка объекта /// /// public virtual void DrawTransport(Graphics g) { if (EntityTruck == null) { return; } Brush brush = new SolidBrush(EntityTruck.BodyColor); g.FillRectangle(brush, _startPosX, _startPosY + 40, 160, 10); g.FillRectangle(brush, _startPosX + 120, _startPosY, 40, 40); g.FillEllipse(brush, _startPosX, _startPosY + 50, 40, 40); g.FillEllipse(brush, _startPosX + 40, _startPosY + 50, 40, 40); g.FillEllipse(brush, _startPosX + 120, _startPosY + 50, 40, 40); } } }