import java.awt.*; import java.util.Random; class DrawningLocomotive { public EntityLocomotive Locomotive; public ExtraWheelsDraw extraWheelsDraw; public IDrawningExtra drawningExtra; /// Левая координата отрисовки локомотива protected float _startPosX; /// Верхняя координата отрисовки локомотива protected float _startPosY; /// Ширина окна отрисовки private Integer _pictureWidth = null; /// Высота окна отрисовки private Integer _pictureHeight = null; /// Ширина отрисовки локомотива private int _locomotiveWidth = 110; /// Высота отрисовки локомотива private int _locomotiveHeight = 50; /// Инициализация свойств private final Random random = new Random(); public DrawningLocomotive(int speed, float weight, Color bodyColor) { int randExtra = random.nextInt(2); extraWheelsDraw = new ExtraWheelsDraw(randExtra, bodyColor); switch (random.nextInt(3)){ case 0: drawningExtra = new ExtraStarWheelDraw(randExtra); break; case 1: drawningExtra = new ExtraRoundWheelDraw(randExtra); break; case 2: drawningExtra = new ExtraWheelsDraw(randExtra, bodyColor); break; } Locomotive = new EntityLocomotive(speed, weight, bodyColor); } // Новый конструктор protected DrawningLocomotive (int speed, float weight, Color bodyColor, int locomotiveWidth, int locomotiveHeight) { this(speed, weight, bodyColor); _locomotiveWidth = locomotiveWidth; _locomotiveHeight = locomotiveHeight; } /// Установка позиции локомотива public void SetPosition(int x, int y, int width, int height) { if (x < 0 || x + _locomotiveWidth >= width) { return; } if (y < 0 || y + _locomotiveHeight >= height) { return; } _startPosX = x; _startPosY = y; _pictureWidth = width; _pictureHeight = height; } public void MoveTransport(Direction direction) { if (_pictureWidth == null || _pictureHeight == null) { return; } switch (direction) { // вправо case Right: if (_startPosX + _locomotiveWidth + Locomotive.Step() < _pictureWidth) { _startPosX += Locomotive.Step(); } else _startPosX = _pictureWidth - _locomotiveWidth; break; //влево case Left: if (_startPosX - Locomotive.Step() >= 0) { _startPosX -= Locomotive.Step(); } else _startPosX = 0; break; //вверх case Up: if (_startPosY - Locomotive.Step() >= 0) { _startPosY -= Locomotive.Step(); } else _startPosY = 0; break; //вниз case Down: if (_startPosY + _locomotiveHeight + Locomotive.Step() < _pictureHeight) { _startPosY += Locomotive.Step(); } else _startPosY = _pictureHeight - _locomotiveHeight; break; } } public void DrawTransport(Graphics2D g) { if (_startPosX < 0 || _startPosY < 0 || _pictureHeight == null || _pictureWidth == null) { return; } //тело g.setColor(Locomotive.getBodyColor()); g.fillRect((int)_startPosX , (int)_startPosY, 110 - 10, 50 - 10); //окна g.setColor(Color.BLUE); g.fillRect((int)_startPosX + 10, (int)_startPosY + 10, 10, 10); g.fillRect((int)_startPosX + 30, (int)_startPosY + 10, 10, 10); g.fillRect((int)_startPosX + 80, (int)_startPosY + 10, 10, 10); //дверь g.setColor(Color.BLACK); g.fillRect( (int)_startPosX + 50, (int)_startPosY + 10, 10, 20); //колеса extraWheelsDraw.DrawExtra((int)_startPosX, (int)_startPosY, g); //extra drawningExtra.DrawExtra((int)_startPosX, (int)_startPosY, g); //движок g.setColor(Locomotive.getBodyColor()); g.fillRect((int)_startPosX + 100, (int)_startPosY + 10, 10, 30); } public void ChangeBorders(int width, int height) { _pictureWidth = width; _pictureHeight = height - 75; if (_pictureWidth <= _locomotiveWidth || _pictureHeight <= _locomotiveHeight) { _pictureWidth = null; _pictureHeight = null; return; } if (_startPosX + _locomotiveWidth > _pictureWidth) { _startPosX = _pictureWidth - _locomotiveWidth; } if (_startPosY + _locomotiveHeight > _pictureHeight) { _startPosY = _pictureHeight - _locomotiveHeight; } } // Получение текущей позиции объекта public float[] GetCurrentPosition() { return new float[] {/*UP*/_startPosY, /*RIGHT*/ _startPosX + _locomotiveWidth, /*DOWN*/ _startPosY + _locomotiveHeight, /*LEFT*/ _startPosX}; } }