using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace HoistingCrane { internal class DrawingHoistingCrane { public EntityHoistingCrane HoistingCrane { get; private set; } private float _startPosX; private float _startPosY; private int? _pictureWidth = null; private int? _pictureHeight = null; private readonly int _hoistingCraneWidth = 80; private readonly int _hoistingCraneHeight = 50; public void Init(int speed, float weight, Color bodyColor) { HoistingCrane = new EntityHoistingCrane(); HoistingCrane.Init(speed, weight, bodyColor); } public void SetPosition(int x, int y, int width, int height) { // TODO checks _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 + _hoistingCraneWidth + HoistingCrane.Step < _pictureWidth) { _startPosX += HoistingCrane.Step; } break; //влево case Direction.Left: if (_startPosX - HoistingCrane.Step > 0) { _startPosX -= HoistingCrane.Step; } break; //вверх case Direction.Up: if (_startPosY - HoistingCrane.Step > 0) { _startPosY -= HoistingCrane.Step; } break; //вниз case Direction.Down: if (_startPosY + _hoistingCraneHeight + HoistingCrane.Step < _pictureHeight) { _startPosY += HoistingCrane.Step; } break; } } public void DrawTransport(Graphics g) { if (_startPosX < 0 || _startPosY < 0 || !_pictureHeight.HasValue || !_pictureWidth.HasValue) { return; } Pen pen = new Pen(Color.Black); //границы g.DrawRectangle(pen, _startPosX, _startPosY + 25, 75, 20); g.DrawRectangle(pen, _startPosX, _startPosY, 25, 25); g.DrawRectangle(pen, _startPosX + 4, _startPosY + 4, 17, 17); g.DrawRectangle(pen, _startPosX + 52, _startPosY + 7, 6, 18); g.DrawEllipse(pen, _startPosX - 5, _startPosY + 45, 20, 20); g.DrawEllipse(pen, _startPosX + 63, _startPosY + 45, 20, 20); g.DrawRectangle(pen, _startPosX + 5, _startPosY + 45, 68, 20); g.DrawEllipse(pen, _startPosX - 1, _startPosY + 46, 18, 18); g.DrawEllipse(pen, _startPosX + 62, _startPosY + 46, 18, 18); g.DrawEllipse(pen, _startPosX + 20, _startPosY + 53, 10, 10); g.DrawEllipse(pen, _startPosX + 35, _startPosY + 53, 10, 10); g.DrawEllipse(pen, _startPosX + 50, _startPosY + 53, 10, 10); g.DrawRectangle(pen, _startPosX + 30, _startPosY + 45, 4, 6); g.DrawRectangle(pen, _startPosX + 45, _startPosY + 45, 4, 6); //корпус Brush br = new SolidBrush(HoistingCrane?.BodyColor ?? Color.Black); g.FillRectangle(br, _startPosX, _startPosY + 25, 75, 25); g.FillRectangle(br, _startPosX, _startPosY, 25, 25); //окно Brush brBlue = new SolidBrush(Color.Blue); g.FillRectangle(brBlue, _startPosX + 4, _startPosY + 4, 17, 17); //выхлопная труба Brush brBrown = new SolidBrush(Color.DarkGray); g.FillRectangle(brBrown, _startPosX + 52, _startPosY + 7, 6, 18); //гусеница Brush brDarkGray = new SolidBrush(Color.DarkGray); g.FillEllipse(brDarkGray, _startPosX - 5, _startPosY + 45, 20, 20); g.FillEllipse(brDarkGray, _startPosX + 63, _startPosY + 45, 20, 20); g.FillRectangle(brDarkGray, _startPosX + 5, _startPosY + 45, 68, 20); Brush brBlack = new SolidBrush(Color.Black); g.FillEllipse(brBlack, _startPosX - 1, _startPosY + 46, 18, 18); g.FillEllipse(brBlack, _startPosX + 62, _startPosY + 46, 18, 18); g.FillEllipse(brBlack, _startPosX + 20, _startPosY + 53, 10, 10); g.FillEllipse(brBlack, _startPosX + 35, _startPosY + 53, 10, 10); g.FillEllipse(brBlack, _startPosX + 50, _startPosY + 53, 10, 10); g.FillRectangle(brBlack, _startPosX + 30, _startPosY + 45, 4, 6); g.FillRectangle(brBlack, _startPosX + 45, _startPosY + 45, 4, 6); } public void ChangeBorders(int width, int height) { _pictureWidth = width; _pictureHeight = height; if (_pictureWidth <= _hoistingCraneWidth || _pictureHeight <= _hoistingCraneHeight) { _pictureWidth = null; _pictureHeight = null; return; } if (_startPosX + _hoistingCraneWidth > _pictureWidth) { _startPosX = _pictureWidth.Value - _hoistingCraneWidth; } if (_startPosY + _hoistingCraneHeight > _pictureHeight) { _startPosY = _pictureHeight.Value - _hoistingCraneHeight; } } } }