using WarmlyLocomotive.Entities; namespace WarmlyLocomotive.Drawnings; /// /// Класс, отвечающий за прорисовку и перемещение объекта-сущности /// public class DrawningLocomotive { /// /// Класс-сущность /// public EntityLocomotive? EntityLocomotive { get; protected set; } /// /// Ширина окна /// private int? _pictureWidth; /// /// Высота окна /// private int? _pictureHeight; /// /// Левая координата прорисовки паровоза /// protected int? _startPosX; /// /// Верхняя кооридната прорисовки паровоза /// protected int? _startPosY; /// /// Ширина прорисовки паровоза /// private readonly int _drawningLocomotiveWidth = 150; /// /// Высота прорисовки паровоза /// private readonly int _drawningLocomotiveHeight = 100; /// /// Координата X объекта /// public int? GetPosX => _startPosX; /// /// Координата Y объекта /// public int? GetPosY => _startPosY; /// /// Ширина объекта /// public int GetWidth => _drawningLocomotiveWidth; /// /// Высота объекта /// public int GetHeight => _drawningLocomotiveHeight; /// /// Пустой конструктор /// private DrawningLocomotive() { _pictureWidth = null; _pictureHeight = null; _startPosX = null; _startPosY = null; } /// /// Конструктор /// /// Скорость /// Вес /// Основной цвет public DrawningLocomotive(int speed, double weight, Color bodyColor) : this() { EntityLocomotive = new EntityLocomotive(speed, weight, bodyColor); } /// /// Конструктор для наследников /// /// Ширина прорисовки паровоза /// Высота прорисовки паровоза protected DrawningLocomotive(int drawningLocomotiveWidth, int drawningLocomotiveHeight) : this() { _drawningLocomotiveWidth = drawningLocomotiveWidth; _pictureHeight = drawningLocomotiveHeight; } //public void Init(int speed, double weight, Color bodyColor, Color //additionalColor, bool tube, bool fuelTank) //{ // EntityWarmlyLocomotive = new EntityWarmlyLocomotive(); // EntityWarmlyLocomotive.Init(speed, weight, bodyColor, additionalColor, // tube, fuelTank); // _pictureWidth = null; // _pictureHeight = null; // _startPosX = null; // _startPosY = null; //} /// /// Установка границ поля /// public bool SetPictureSize(int width, int height) { if (width > _drawningLocomotiveWidth && height > _drawningLocomotiveHeight) { _pictureWidth = width; _pictureHeight = height; //todo if (_startPosX != null && _startPosY != null) { //проверка х if (_startPosX.Value + _drawningLocomotiveWidth > _pictureWidth) { _startPosX = _pictureWidth - _drawningLocomotiveWidth; } else if (_startPosX.Value < 0) { _startPosX = 0; } //проверка у if (_startPosY.Value + _drawningLocomotiveHeight > _pictureHeight) { _startPosY = _pictureHeight - _drawningLocomotiveHeight; } else if (_startPosY.Value < 0) { _startPosY = 0; } } return true; } return false; } /// /// Установка позиции /// public void SetPosition(int x, int y) { if (!_pictureHeight.HasValue || !_pictureWidth.HasValue) { return; } //проверка у if (y + _drawningLocomotiveHeight > _pictureHeight) { _startPosY = _pictureHeight - _drawningLocomotiveHeight; } else if (y < 0) { _startPosY = 0; } else { _startPosY = y; } //проверка х if (x + _drawningLocomotiveWidth > _pictureWidth) { _startPosX = _pictureWidth - _drawningLocomotiveWidth; } else if (x < 0) { _startPosX = 0; } else { _startPosX = x; } } /// /// Изменение направления перемещения /// public bool MoveTransport(DirectionType direction) { if (EntityLocomotive == null || !_startPosX.HasValue || !_startPosY.HasValue) { return false; } switch (direction) { //влево case DirectionType.Left: if (_startPosX.Value - EntityLocomotive.Step > 0) { _startPosX -= (int)EntityLocomotive.Step; } return true; //вверх case DirectionType.Up: if (_startPosY.Value - EntityLocomotive.Step > 0) { _startPosY -= (int)EntityLocomotive.Step; } return true; // вправо case DirectionType.Right: if (_startPosX.Value + EntityLocomotive.Step + _drawningLocomotiveWidth < _pictureWidth) { _startPosX += (int)EntityLocomotive.Step; } return true; //вниз case DirectionType.Down: if (_startPosY.Value + EntityLocomotive.Step + _drawningLocomotiveHeight < _pictureHeight) { _startPosY += (int)EntityLocomotive.Step; } return true; default: return false; } } /// /// Прорисовка объекта /// public virtual void DrawTransport(Graphics g) { if (EntityLocomotive == null || !_startPosX.HasValue || !_startPosY.HasValue) { return; } Pen pen = new(Color.Black); //Brush additionalBrush = new SolidBrush(EntityWarmlyLocomotive.AdditionalColor); //труба //if (EntityWarmlyLocomotive.Tube) //{ // g.DrawRectangle(pen, _startPosX.Value + 40, _startPosY.Value, 20, 30); // g.FillRectangle(additionalBrush, _startPosX.Value + 40, _startPosY.Value, 20, 40); //} //локомотив Brush br = new SolidBrush(EntityLocomotive.BodyColor); Brush blBr = new SolidBrush(Color.Black); g.DrawRectangle(pen, _startPosX.Value, _startPosY.Value + 60, 140, 20); g.FillRectangle(br, _startPosX.Value, _startPosY.Value + 60, 140, 20); Point point1 = new Point(_startPosX.Value, _startPosY.Value + 60); Point point2 = new Point(_startPosX.Value + 20, _startPosY.Value + 30); Point point3 = new Point(_startPosX.Value + 140, _startPosY.Value + 30); Point point4 = new Point(_startPosX.Value + 140, _startPosY.Value + 60); Point[] body = { point1, point2, point3, point4 }; g.DrawPolygon(pen, body); g.FillPolygon(br, body); g.DrawRectangle(pen, _startPosX.Value + 140, _startPosY.Value + 40, 10, 40); g.FillRectangle(br, _startPosX.Value + 140, _startPosY.Value + 40, 10, 40); //колеса g.DrawEllipse(pen, _startPosX.Value, _startPosY.Value + 80, 20, 20); g.FillEllipse(blBr, _startPosX.Value, _startPosY.Value + 80, 20, 20); g.DrawEllipse(pen, _startPosX.Value + 30, _startPosY.Value + 80, 20, 20); g.FillEllipse(blBr, _startPosX.Value + 30, _startPosY.Value + 80, 20, 20); g.DrawEllipse(pen, _startPosX.Value + 90, _startPosY.Value + 80, 20, 20); g.FillEllipse(blBr, _startPosX.Value + 90, _startPosY.Value + 80, 20, 20); g.DrawEllipse(pen, _startPosX.Value + 120, _startPosY.Value + 80, 20, 20); g.FillEllipse(blBr, _startPosX.Value + 120, _startPosY.Value + 80, 20, 20); // отсек для топлива //if (EntityWarmlyLocomotive.FuelTank) //{ // g.DrawRectangle(pen, _startPosX.Value + 80, _startPosY.Value + 40, 50, 40); // g.FillRectangle(additionalBrush, _startPosX.Value + 80, _startPosY.Value + 40, 50, 40); //} } }