package laba1Loco; import java.awt.*; import java.util.*; import javax.swing.*; import javax.swing.Timer; import java.awt.event.*; public class DrawingLoco{ private WheelDrawing wheelDrawing; /// /// Класс-сущность /// public EntityLoco _EntityLoco; /// /// Ширина окна /// private int _pictureWidth; /// /// Высота окна /// private int _pictureHeight; /// /// Левая координата прорисовки локомотива /// private int _startPosX; /// /// Верхняя кооридната прорисовки локомотива /// private int _startPosY; /// /// Ширина прорисовки локомотива /// private int _locoWidth = 83; /// /// Высота прорисовки локомотива /// private int _locoHeight = 41; /// /// Инициализация свойств /// /// Скорость /// Вес /// Цвет кузова /// Дополнительный цвет /// Признак наличия трубы /// Признак наличия бака /// Признак наличия паровозной полосы /// Ширина картинки /// Высота картинки /// true - объект создан, false - проверка не пройдена, нельзя создать объект в этих размерах public boolean Init(int speed, double weight, Color bodyColor, Color additionalColor, boolean tube, boolean fuelTank, boolean locoLine, int numWheel, int width, int height) { _pictureWidth = width; _pictureHeight = height; if (_pictureHeight < _locoHeight || _pictureWidth < _locoWidth) return false; _EntityLoco = new EntityLoco(); _EntityLoco.Init(speed, weight, bodyColor, additionalColor, tube, fuelTank, locoLine, numWheel); if (fuelTank) _locoWidth = 169; wheelDrawing = new WheelDrawing(); wheelDrawing.setNumWheel(numWheel); return true; } /// /// Установка позиции /// /// Координата X /// Координата Y public void SetPosition(int x, int y) { _startPosX = Math.min(x, _pictureWidth-_locoWidth); _startPosY = Math.min(y, _pictureHeight-_locoHeight); } /// /// Изменение направления перемещения /// /// Направление public void MoveTransport(Direction direction) { if (_EntityLoco == null){ return; } switch (direction) { //влево case Left: if (_startPosX - _EntityLoco.Step > 0) { _startPosX -= (int)_EntityLoco.Step; } break; //вверх case Up: if (_startPosY - _EntityLoco.Step > 0) { _startPosY -= (int)_EntityLoco.Step; } break; // вправо case Right: if (_startPosX + _locoWidth + _EntityLoco.Step < _pictureWidth) { _startPosX += (int)_EntityLoco.Step; } break; //вниз case Down: if (_startPosY + _locoHeight + _EntityLoco.Step < _pictureHeight) { _startPosY += (int)_EntityLoco.Step; } break; } } /// /// Прорисовка объекта /// /// public void DrawTransport(Graphics2D g2d) { if (_EntityLoco == null) { return; } // body g2d.setColor(_EntityLoco.BodyColor); g2d.drawPolyline(new int[]{ _startPosX + 8, _startPosX + 79, _startPosX + 79, _startPosX + 4, _startPosX + 4, _startPosX + 8, }, new int[]{ _startPosY+10, _startPosY+10, _startPosY+32, _startPosY+32, _startPosY+20, _startPosY+10 }, 6); g2d.drawPolyline(new int[]{ _startPosX + 4, _startPosX + 29, _startPosX + 29, _startPosX + 37, _startPosX + 37, _startPosX + 79, _startPosX + 37, _startPosX + 37, _startPosX + 29, _startPosX + 29, }, new int[]{ _startPosY+21, _startPosY+21, _startPosY+14, _startPosY+14, _startPosY+21, _startPosY+21, _startPosY+21, _startPosY+29, _startPosY+29, _startPosY+21 }, 10); // trucks g2d.fillPolygon(new int[]{ _startPosX + 0,_startPosX + 5,_startPosX + 32,_startPosX + 36, }, new int[]{ _startPosY+37,_startPosY+33,_startPosY+33,_startPosY+37 }, 4); g2d.fillPolygon(new int[]{ _startPosX + 44,_startPosX + 49,_startPosX + 76,_startPosX + 80, }, new int[]{ _startPosY+37,_startPosY+33,_startPosY+33,_startPosY+37 }, 4); //back g2d.fillPolygon(new int[]{ _startPosX + 79,_startPosX + 82,_startPosX + 82,_startPosX + 79, }, new int[]{ _startPosY+12,_startPosY+12,_startPosY+30,_startPosY+30 }, 4); //windows g2d.setColor(Color.BLUE); g2d.drawRect(_startPosX + 10, _startPosY + 12, 6, 7); g2d.drawRect(_startPosX + 19, _startPosY + 12, 6, 7); g2d.drawRect(_startPosX + 72, _startPosY + 12, 6, 7); //wheels wheelDrawing.Draw(_startPosX, _startPosY, _EntityLoco.FuelTank, _EntityLoco.BodyColor, g2d); g2d.setColor(_EntityLoco.AdditionalColor); if (_EntityLoco.Tube) { g2d.drawPolyline(new int[] { _startPosX + 40,_startPosX + 40,_startPosX + 45,_startPosX + 41,_startPosX + 41,_startPosX + 44,_startPosX + 44,_startPosX + 45,_startPosX + 45, },new int[] { _startPosY+9,_startPosY+3,_startPosY+3,_startPosY+3,_startPosY,_startPosY,_startPosY+3,_startPosY+3,_startPosY+9, },9); } if (_EntityLoco.LocoLine) { g2d.drawPolyline(new int[] { _startPosX + 60,_startPosX + 38, },new int[] { _startPosY+10,_startPosY+32 },2); g2d.drawPolyline(new int[] { _startPosX + 65,_startPosX + 43, },new int[] { _startPosY+10,_startPosY+32 },2); g2d.drawPolyline(new int[] { _startPosX + 70,_startPosX + 48, },new int[] { _startPosY+10,_startPosY+32 },2); } if (_EntityLoco.FuelTank) { // body g2d.setColor(_EntityLoco.BodyColor); g2d.drawPolyline(new int[]{ _startPosX + 89, _startPosX + 164, _startPosX + 164, _startPosX + 89, _startPosX + 89, }, new int[]{ _startPosY+10, _startPosY+10, _startPosY+32, _startPosY+32, _startPosY+10 }, 5); g2d.drawPolyline(new int[]{ _startPosX + 89, _startPosX + 164, }, new int[]{ _startPosY+21, _startPosY+21, }, 2); // trucks g2d.fillPolygon(new int[]{ _startPosX + 0+85,_startPosX + 5+85,_startPosX + 32+85,_startPosX + 36+85, }, new int[]{ _startPosY+37,_startPosY+33,_startPosY+33,_startPosY+37 }, 4); g2d.fillPolygon(new int[]{ _startPosX + 44+85,_startPosX + 49+85,_startPosX + 76+85,_startPosX + 80+85, }, new int[]{ _startPosY+37,_startPosY+33,_startPosY+33,_startPosY+37 }, 4); //back g2d.fillPolygon(new int[]{ _startPosX + 79+85,_startPosX + 82+85,_startPosX + 82+85,_startPosX + 79+85, }, new int[]{ _startPosY+12,_startPosY+12,_startPosY+30,_startPosY+30 }, 4); //front g2d.fillPolygon(new int[]{ _startPosX + 86,_startPosX + 89,_startPosX + 89,_startPosX + 86, }, new int[]{ _startPosY+12,_startPosY+12,_startPosY+30,_startPosY+30 }, 4); } } }