diff --git a/src/projectMonorail/DrawingMonorail.java b/src/projectMonorail/DrawingMonorail.java deleted file mode 100644 index 80b4886..0000000 --- a/src/projectMonorail/DrawingMonorail.java +++ /dev/null @@ -1,230 +0,0 @@ -package projectMonorail; - -import java.awt.*; - -public class DrawingMonorail { - - private EntityMonorail entityMonorail; - - public EntityMonorail getEntityMonorail() { - return entityMonorail; - } - - private DrawingWheels drawingWheels; - - private int pictureWidth; - - private int pictureHeight; - - private int startPosX; - - private int startPosY; - - private int monorailWidth = 117; - - private int monorailHeight = 56; - - public boolean Init(int speed, double weight, Color mainColor, Color additionalColor, boolean magneticRail, - boolean extraCabin, int width, int height, int wheelNumber) { - if (extraCabin) { - monorailWidth = 183; - } - if (magneticRail) { - monorailWidth = 186; - monorailHeight = 92; - } - if (width < monorailWidth || height < monorailHeight) { return false; } - pictureWidth = width; - pictureHeight = height; - entityMonorail = new EntityMonorail(); - entityMonorail.Init(speed, weight, mainColor, additionalColor, - magneticRail, extraCabin); - drawingWheels = new DrawingWheels(); - drawingWheels.setWheelNumber(wheelNumber); - return true; - } - - public void SetPosition(int x, int y) { - if (x < 0 || x + monorailWidth > pictureWidth) { x = 0; } - if (y < 0 || y + monorailHeight > pictureHeight) { y = 0; } - - startPosX = x; - startPosY = y; - } - - public void MoveTransport(DirectionType direction) { - if (entityMonorail == null) { - return; - } - - switch (direction) { - //влево - case Left: - if (startPosX - entityMonorail.getStep() > 0) - { - startPosX -= (int)entityMonorail.getStep(); - } - break; - //вверх - case Up: - if (startPosY - entityMonorail.getStep() > 0) - { - startPosY -= (int)entityMonorail.getStep(); - } - break; - //вправо - case Right: - if (startPosX + monorailWidth + entityMonorail.getStep() < pictureWidth) - { - startPosX += (int)entityMonorail.getStep(); - } - break; - //вниз - case Down: - if (startPosY + monorailHeight + entityMonorail.getStep() < pictureHeight) - { - startPosY += (int)entityMonorail.getStep(); - } - break; - } - } - - public void DrawTransport(Graphics2D g2d) - { - if (entityMonorail == null) { - return; - } - - Color mainColor = entityMonorail.getMainColor(); - Color additionalColor = entityMonorail.getAdditionalColor(); - BasicStroke standardWidth = new BasicStroke(1); - BasicStroke largerWidth = new BasicStroke(2); - - //надстройка - g2d.setStroke(largerWidth); - g2d.setColor(mainColor); - g2d.fillRect( startPosX + 55, startPosY , 25, 15); - - g2d.setColor(Color.BLACK); - g2d.drawRect(startPosX + 55, startPosY , 25, 15); - - //корпус локомотива - Polygon locoPolygon = new Polygon(); - locoPolygon.addPoint(startPosX + 29, startPosY + 15); - locoPolygon.addPoint(startPosX + 112, startPosY + 15); - locoPolygon.addPoint(startPosX + 112, startPosY + 46); - locoPolygon.addPoint(startPosX + 25, startPosY + 46); - locoPolygon.addPoint(startPosX + 25, startPosY + 31); - - g2d.setColor(mainColor); - g2d.fillPolygon(locoPolygon); - - g2d.setColor(Color.BLACK); - g2d.drawPolygon(locoPolygon); - - g2d.setStroke(standardWidth); - g2d.setColor(Color.BLUE); - g2d.drawLine( startPosX + 25, startPosY + 31, startPosX + 112, startPosY + 31); - - //дверь локомотива - g2d.setColor(Color.GRAY); - g2d.fillRect( startPosX + 54, startPosY + 21, 7, 20); - - g2d.setStroke(largerWidth); - g2d.setColor(Color.BLACK); - g2d.drawRect(startPosX + 54, startPosY + 21, 7, 20); - - //окна локомотива - g2d.setColor(Color.BLUE); - - g2d.fillRect( startPosX + 32, startPosY + 18, 6, 9); - g2d.fillRect( startPosX + 44, startPosY + 18, 6, 9); - g2d.fillRect( startPosX + 103, startPosY + 18, 6, 9); - - g2d.setColor(Color.BLACK); - - g2d.drawRect( startPosX + 32, startPosY + 18, 6, 9); - g2d.drawRect( startPosX + 44, startPosY + 18, 6, 9); - g2d.drawRect( startPosX + 103, startPosY + 18, 6, 9); - - //колеса и тележка локомотива - g2d.fillRect( startPosX + 23, startPosY + 47, 33, 6); - g2d.fillRect( startPosX + 76, startPosY + 47, 30, 6); - g2d.drawRect( startPosX + 23, startPosY + 47, 33, 6); - g2d.drawRect( startPosX + 76, startPosY + 47, 30, 6); - - drawingWheels.drawWheels(g2d, Color.WHITE, startPosX, startPosY); - - Polygon bogiePolygon = new Polygon(); - bogiePolygon.addPoint(startPosX + 26, startPosY + 46); - bogiePolygon.addPoint(startPosX + 24, startPosY + 54); - bogiePolygon.addPoint(startPosX + 12, startPosY + 54); - bogiePolygon.addPoint(startPosX + 8, startPosY + 51); - bogiePolygon.addPoint(startPosX + 12, startPosY + 48); - bogiePolygon.addPoint(startPosX + 18, startPosY + 46); - - g2d.fillPolygon(bogiePolygon); - - //соединение между кабинами - g2d.drawRect( startPosX + 112, startPosY + 18, 5, 28); - g2d.fillRect( startPosX + 112, startPosY + 18, 5, 28); - - //магнитная рельса - if (entityMonorail.getMagneticRail()) { - g2d.drawRect( startPosX + 2, startPosY + 58, 184, 18); - g2d.setColor(Color.GRAY); - g2d.fillRect( startPosX + 2, startPosY + 58, 184, 18); - for (int i = 0; i < 4; i++) - { - g2d.setColor(Color.BLACK); - g2d.drawRect( startPosX + 35 + 35 * i, startPosY + 77, 8, 15); - g2d.setColor(Color.GRAY); - g2d.fillRect( startPosX + 35 + 35 * i, startPosY + 77, 8, 15); - } - } - - //дополнительная кабина - if (entityMonorail.getExtraCabin()) { - //корпус дополнительной кабины - g2d.setColor(mainColor); - g2d.fillRect( startPosX + 118, startPosY + 15, 65, 31); - g2d.setColor(Color.BLACK); - g2d.drawRect( startPosX + 118, startPosY + 15, 65, 31); - - g2d.setStroke(standardWidth); - g2d.setColor(Color.BLUE); - g2d.drawLine( startPosX + 118, startPosY + 31, startPosX + 183, startPosY + 31); - - //дверь дополнительной кабины - g2d.setColor(additionalColor); - g2d.fillRect( startPosX + 146, startPosY + 21, 7, 20); - - g2d.setStroke(largerWidth); - g2d.setColor(Color.BLACK); - g2d.drawRect(startPosX + 146, startPosY + 21, 7, 20); - - //окна дополнительной кабины - g2d.setColor(Color.BLUE); - g2d.fillRect( startPosX + 130, startPosY + 18, 6, 9); - g2d.fillRect( startPosX + 169, startPosY + 18, 6, 9); - - g2d.setColor(Color.BLACK); - g2d.drawRect( startPosX + 130, startPosY + 18, 6, 9); - g2d.drawRect( startPosX + 169, startPosY + 18, 6, 9); - - //колеса и тележка дополнительной кабины - g2d.fillRect( startPosX + 126, startPosY + 47, 15, 6); - g2d.fillRect( startPosX + 159, startPosY + 47, 15, 6); - g2d.drawRect( startPosX + 126, startPosY + 47, 15, 6); - g2d.drawRect( startPosX + 159, startPosY + 47, 15, 6); - - g2d.setColor(Color.WHITE); - g2d.fillOval( startPosX + 128, startPosY + 47, 10, 9); - g2d.fillOval( startPosX + 161, startPosY + 47, 10, 9); - - g2d.setColor(Color.BLACK); - g2d.drawOval( startPosX + 128, startPosY + 47, 10, 9); - g2d.drawOval( startPosX + 161, startPosY + 47, 10, 9); - } - } -} diff --git a/src/projectMonorail/DrawingObjects/DrawingLocomotive.java b/src/projectMonorail/DrawingObjects/DrawingLocomotive.java new file mode 100644 index 0000000..9e696d4 --- /dev/null +++ b/src/projectMonorail/DrawingObjects/DrawingLocomotive.java @@ -0,0 +1,217 @@ +package projectMonorail.DrawingObjects; + +import projectMonorail.DirectionType; +import projectMonorail.Entities.*; +import projectMonorail.Extras.*; + +import java.awt.*; +import java.util.Random; + +public class DrawingLocomotive { + + private EntityLocomotive entityLocomotive; + + public EntityLocomotive getEntityLocomotive() { + return entityLocomotive; + } + + protected void setEntityLocomotive(EntityLocomotive entityLocomotive) { + this.entityLocomotive = entityLocomotive; + } + + private IDrawingWheels drawingWheels; + + private int pictureWidth; + + private int pictureHeight; + + protected int startPosX; + + protected int startPosY; + + protected int locomotiveWidth = 117; + + protected int locomotiveHeight = 56; + + public int getPosX() { + return startPosX; + } + + public int getPosY() { + return startPosY; + } + + public int getWidth() { + return locomotiveWidth; + } + + public int getHeight() { + return locomotiveHeight; + } + + public DrawingLocomotive(int speed, double weight, Color mainColor, int width, int height, int wheelNumber) { + if (width < locomotiveWidth || height < locomotiveHeight) { + return; + } + pictureWidth = width; + pictureHeight = height; + entityLocomotive = new EntityLocomotive(speed, weight, mainColor); + Random rand = new Random(); + drawingWheels = switch (rand.nextInt(0, 3)) { + case 0 -> new DrawingNormalWheels(); + case 1 -> new DrawingSquarePatternWheels(); + case 2 -> new DrawingVintageWheels(); + default -> new DrawingNormalWheels(); + }; + drawingWheels.setWheelNumber(wheelNumber); + } + + protected DrawingLocomotive(int speed, double weight, Color mainColor, + int width, int height, int locoWidth, int locoHeight, int wheelNumber) { + if (width < locoWidth || height < locoHeight) { + return; + } + pictureWidth = width; + pictureHeight = height; + locomotiveWidth = locoWidth; + locomotiveHeight = locoHeight; + entityLocomotive = new EntityLocomotive(speed, weight, mainColor); + Random rand = new Random(); + drawingWheels = switch (rand.nextInt(0, 3)) { + case 0 -> new DrawingNormalWheels(); + case 1 -> new DrawingSquarePatternWheels(); + case 2 -> new DrawingVintageWheels(); + default -> new DrawingNormalWheels(); + }; + drawingWheels.setWheelNumber(wheelNumber); + } + + public void setPosition(int x, int y) { + if (x < 0 || x + locomotiveWidth > pictureWidth) { + x = 0; + } + if (y < 0 || y + locomotiveHeight > pictureHeight) { + y = 0; + } + + startPosX = x; + startPosY = y; + } + + public boolean canMove(DirectionType direction) { + if (entityLocomotive == null) { + return false; + } + + return switch (direction) { + case Left -> startPosX - entityLocomotive.getStep() > 0; + case Up -> startPosY - entityLocomotive.getStep() > 0; + case Right -> startPosX + locomotiveWidth + entityLocomotive.getStep() < pictureWidth; + case Down -> startPosY + locomotiveHeight + entityLocomotive.getStep() < pictureHeight; + default -> false; + }; + } + + public void moveTransport(DirectionType direction) { + if (!canMove(direction) || entityLocomotive == null) { + return; + } + + switch (direction) { + case Left: + startPosX -= (int) entityLocomotive.getStep(); + break; + + case Up: + startPosY -= (int) entityLocomotive.getStep(); + break; + + case Right: + startPosX += (int) entityLocomotive.getStep(); + break; + + case Down: + startPosY += (int) entityLocomotive.getStep(); + break; + } + } + + public void drawTransport(Graphics2D g2d) { + if (entityLocomotive == null) { + return; + } + + Color mainColor = entityLocomotive.getMainColor(); + BasicStroke standardWidth = new BasicStroke(1); + BasicStroke largerWidth = new BasicStroke(2); + + //надстройка + g2d.setStroke(largerWidth); + g2d.setColor(mainColor); + g2d.fillRect(startPosX + 55, startPosY, 25, 15); + + g2d.setColor(Color.BLACK); + g2d.drawRect(startPosX + 55, startPosY, 25, 15); + + //корпус локомотива + Polygon locoPolygon = new Polygon(); + locoPolygon.addPoint(startPosX + 29, startPosY + 15); + locoPolygon.addPoint(startPosX + 112, startPosY + 15); + locoPolygon.addPoint(startPosX + 112, startPosY + 46); + locoPolygon.addPoint(startPosX + 25, startPosY + 46); + locoPolygon.addPoint(startPosX + 25, startPosY + 31); + + g2d.setColor(mainColor); + g2d.fillPolygon(locoPolygon); + + g2d.setColor(Color.BLACK); + g2d.drawPolygon(locoPolygon); + + g2d.setStroke(standardWidth); + g2d.setColor(Color.BLUE); + g2d.drawLine(startPosX + 25, startPosY + 31, startPosX + 112, startPosY + 31); + + //дверь локомотива + g2d.setColor(Color.GRAY); + g2d.fillRect(startPosX + 54, startPosY + 21, 7, 20); + + g2d.setStroke(largerWidth); + g2d.setColor(Color.BLACK); + g2d.drawRect(startPosX + 54, startPosY + 21, 7, 20); + + //окна локомотива + g2d.setColor(Color.BLUE); + + g2d.fillRect(startPosX + 32, startPosY + 18, 6, 9); + g2d.fillRect(startPosX + 44, startPosY + 18, 6, 9); + g2d.fillRect(startPosX + 103, startPosY + 18, 6, 9); + + g2d.setColor(Color.BLACK); + + g2d.drawRect(startPosX + 32, startPosY + 18, 6, 9); + g2d.drawRect(startPosX + 44, startPosY + 18, 6, 9); + g2d.drawRect(startPosX + 103, startPosY + 18, 6, 9); + + //колеса и тележка локомотива + g2d.fillRect(startPosX + 23, startPosY + 47, 33, 6); + g2d.fillRect(startPosX + 76, startPosY + 47, 30, 6); + g2d.drawRect(startPosX + 23, startPosY + 47, 33, 6); + g2d.drawRect(startPosX + 76, startPosY + 47, 30, 6); + + drawingWheels.drawWheels(g2d, Color.WHITE, startPosX, startPosY); + + Polygon bogiePolygon = new Polygon(); + bogiePolygon.addPoint(startPosX + 26, startPosY + 46); + bogiePolygon.addPoint(startPosX + 24, startPosY + 54); + bogiePolygon.addPoint(startPosX + 12, startPosY + 54); + bogiePolygon.addPoint(startPosX + 8, startPosY + 51); + bogiePolygon.addPoint(startPosX + 12, startPosY + 48); + bogiePolygon.addPoint(startPosX + 18, startPosY + 46); + + g2d.fillPolygon(bogiePolygon); + + //соединение между кабинами + g2d.drawRect(startPosX + 112, startPosY + 18, 5, 28); + g2d.fillRect(startPosX + 112, startPosY + 18, 5, 28); + } +} diff --git a/src/projectMonorail/DrawingObjects/DrawingMonorail.java b/src/projectMonorail/DrawingObjects/DrawingMonorail.java new file mode 100644 index 0000000..2a9b3ab --- /dev/null +++ b/src/projectMonorail/DrawingObjects/DrawingMonorail.java @@ -0,0 +1,99 @@ +package projectMonorail.DrawingObjects; + +import projectMonorail.Entities.*; + +import java.awt.*; + +public class DrawingMonorail extends DrawingLocomotive { + + public DrawingMonorail(int speed, double weight, Color mainColor, Color additionalColor, + boolean magneticRail, boolean extraCabin, int width, int height, int wheelNumber) { + super(speed, weight, mainColor, width, height, 186, 92, wheelNumber); + + if (!magneticRail && !extraCabin) { + locomotiveWidth = 117; + locomotiveHeight = 56; + } + if (!magneticRail && extraCabin) { + locomotiveWidth = 183; + locomotiveHeight = 56; + } + + if (getEntityLocomotive() != null) { + setEntityLocomotive(new EntityMonorail(speed, weight, mainColor, + additionalColor, magneticRail, extraCabin)); + } + } + + @Override + public void drawTransport(Graphics2D g2d) { + if (!(getEntityLocomotive() instanceof EntityMonorail monorail)) { + return; + } + + super.drawTransport(g2d); + + Color mainColor = monorail.getMainColor(); + Color additionalColor = monorail.getAdditionalColor(); + BasicStroke standardWidth = new BasicStroke(1); + BasicStroke largerWidth = new BasicStroke(2); + + //магнитная рельса + if (monorail.getMagneticRail()) { + g2d.drawRect(startPosX + 2, startPosY + 58, 184, 18); + g2d.setColor(Color.GRAY); + g2d.fillRect(startPosX + 2, startPosY + 58, 184, 18); + for (int i = 0; i < 4; i++) { + g2d.setColor(Color.BLACK); + g2d.drawRect(startPosX + 35 + 35 * i, startPosY + 77, 8, 15); + g2d.setColor(Color.GRAY); + g2d.fillRect(startPosX + 35 + 35 * i, startPosY + 77, 8, 15); + } + } + + //дополнительная кабина + if (monorail.getExtraCabin()) { + //корпус дополнительной кабины + g2d.setColor(mainColor); + g2d.fillRect(startPosX + 118, startPosY + 15, 65, 31); + g2d.setColor(Color.BLACK); + g2d.drawRect(startPosX + 118, startPosY + 15, 65, 31); + + g2d.setStroke(standardWidth); + g2d.setColor(Color.BLUE); + g2d.drawLine(startPosX + 118, startPosY + 31, startPosX + 183, startPosY + 31); + + //дверь дополнительной кабины + g2d.setColor(additionalColor); + g2d.fillRect(startPosX + 146, startPosY + 21, 7, 20); + + g2d.setStroke(largerWidth); + g2d.setColor(Color.BLACK); + g2d.drawRect(startPosX + 146, startPosY + 21, 7, 20); + + //окна дополнительной кабины + g2d.setColor(Color.BLUE); + g2d.fillRect(startPosX + 130, startPosY + 18, 6, 9); + g2d.fillRect(startPosX + 169, startPosY + 18, 6, 9); + + g2d.setColor(Color.BLACK); + g2d.drawRect(startPosX + 130, startPosY + 18, 6, 9); + g2d.drawRect(startPosX + 169, startPosY + 18, 6, 9); + + //колеса и тележка дополнительной кабины + g2d.fillRect(startPosX + 126, startPosY + 47, 15, 6); + g2d.fillRect(startPosX + 159, startPosY + 47, 15, 6); + g2d.drawRect(startPosX + 126, startPosY + 47, 15, 6); + g2d.drawRect(startPosX + 159, startPosY + 47, 15, 6); + + g2d.setColor(Color.WHITE); + g2d.fillOval(startPosX + 128, startPosY + 47, 10, 9); + g2d.fillOval(startPosX + 161, startPosY + 47, 10, 9); + + g2d.setColor(Color.BLACK); + g2d.drawOval(startPosX + 128, startPosY + 47, 10, 9); + g2d.drawOval(startPosX + 161, startPosY + 47, 10, 9); + } + } + +} diff --git a/src/projectMonorail/DrawingWheels.java b/src/projectMonorail/DrawingWheels.java deleted file mode 100644 index 25986c3..0000000 --- a/src/projectMonorail/DrawingWheels.java +++ /dev/null @@ -1,97 +0,0 @@ -package projectMonorail; - -import java.awt.*; - -public class DrawingWheels { - - private WheelNumber wheelNumber; - - public void setWheelNumber(int number) { - switch (number) { - case 2: - wheelNumber = wheelNumber.Two; - break; - case 3: - wheelNumber = wheelNumber.Three; - break; - case 4: - wheelNumber = wheelNumber.Four; - break; - default: wheelNumber = wheelNumber.Two; - } - } - - public void drawWheels(Graphics2D g2d, Color color, int startPosX, int startPosY) { - switch (wheelNumber) { - case Two: - drawTwoWheels(g2d, color, startPosX, startPosY); - break; - case Three: - drawThreeWheels(g2d, color, startPosX, startPosY); - break; - case Four: - drawFourWheels(g2d, color, startPosX, startPosY); - break; - } - } - - private void drawTwoWheels(Graphics2D g2d, Color color, int startPosX, int startPosY) { - g2d.setColor(color); - - g2d.fillOval( startPosX + 25, startPosY + 47, 10, 9); - g2d.fillOval( startPosX + 45, startPosY + 47, 10, 9); - g2d.fillOval( startPosX + 75, startPosY + 47, 10, 9); - g2d.fillOval( startPosX + 95, startPosY + 47, 10, 9); - - g2d.setColor(Color.BLACK); - - g2d.drawOval( startPosX + 25, startPosY + 47, 10, 9); - g2d.drawOval( startPosX + 45, startPosY + 47, 10, 9); - g2d.drawOval( startPosX + 75, startPosY + 47, 10, 9); - g2d.drawOval( startPosX + 95, startPosY + 47, 10, 9); - } - - private void drawThreeWheels(Graphics2D g2d, Color color, int startPosX, int startPosY) { - g2d.setColor(color); - - g2d.fillOval( startPosX + 25, startPosY + 47, 8, 9); - g2d.fillOval( startPosX + 36, startPosY + 47, 8, 9); - g2d.fillOval( startPosX + 47, startPosY + 47, 8, 9); - g2d.fillOval( startPosX + 76, startPosY + 47, 8, 9); - g2d.fillOval( startPosX + 87, startPosY + 47, 8, 9); - g2d.fillOval( startPosX + 98, startPosY + 47, 8, 9); - - g2d.setColor(Color.BLACK); - - g2d.drawOval( startPosX + 25, startPosY + 47, 8, 9); - g2d.drawOval( startPosX + 36, startPosY + 47, 8, 9); - g2d.drawOval( startPosX + 47, startPosY + 47, 8, 9); - g2d.drawOval( startPosX + 76, startPosY + 47, 8, 9); - g2d.drawOval( startPosX + 87, startPosY + 47, 8, 9); - g2d.drawOval( startPosX + 98, startPosY + 47, 8, 9); - } - - private void drawFourWheels(Graphics2D g2d, Color color, int startPosX, int startPosY) { - g2d.setColor(color); - - g2d.fillOval( startPosX + 25, startPosY + 47, 6, 9); - g2d.fillOval( startPosX + 33, startPosY + 47, 6, 9); - g2d.fillOval( startPosX + 41, startPosY + 47, 6, 9); - g2d.fillOval( startPosX + 49, startPosY + 47, 6, 9); - g2d.fillOval( startPosX + 75, startPosY + 47, 6, 9); - g2d.fillOval( startPosX + 83, startPosY + 47, 6, 9); - g2d.fillOval( startPosX + 91, startPosY + 47, 6, 9); - g2d.fillOval( startPosX + 99, startPosY + 47, 6, 9); - - g2d.setColor(Color.BLACK); - - g2d.drawOval( startPosX + 25, startPosY + 47, 6, 9); - g2d.drawOval( startPosX + 33, startPosY + 47, 6, 9); - g2d.drawOval( startPosX + 41, startPosY + 47, 6, 9); - g2d.drawOval( startPosX + 49, startPosY + 47, 6, 9); - g2d.drawOval( startPosX + 76, startPosY + 47, 6, 9); - g2d.drawOval( startPosX + 84, startPosY + 47, 6, 9); - g2d.drawOval( startPosX + 92, startPosY + 47, 6, 9); - g2d.drawOval( startPosX + 100, startPosY + 47, 6, 9); - } -} diff --git a/src/projectMonorail/Entities/EntityLocomotive.java b/src/projectMonorail/Entities/EntityLocomotive.java new file mode 100644 index 0000000..5aedab8 --- /dev/null +++ b/src/projectMonorail/Entities/EntityLocomotive.java @@ -0,0 +1,34 @@ +package projectMonorail.Entities; + +import java.awt.*; + +public class EntityLocomotive { + + private int speed; + + public int getSpeed() { + return speed; + } + + private double weight; + + public double getWeight() { + return weight; + } + + private Color mainColor; + + public Color getMainColor() { + return mainColor; + } + + public double getStep() { + return (double) speed * 100 / weight; + } + + public EntityLocomotive(int speed, double weight, Color mainColor) { + this.speed = speed; + this.weight = weight; + this.mainColor = mainColor; + } +} diff --git a/src/projectMonorail/Entities/EntityMonorail.java b/src/projectMonorail/Entities/EntityMonorail.java new file mode 100644 index 0000000..b347562 --- /dev/null +++ b/src/projectMonorail/Entities/EntityMonorail.java @@ -0,0 +1,32 @@ +package projectMonorail.Entities; + +import java.awt.*; + +public class EntityMonorail extends EntityLocomotive { + + private Color additionalColor; + + public Color getAdditionalColor() { + return additionalColor; + } + + private boolean magneticRail; + + public boolean getMagneticRail() { + return magneticRail; + } + + private boolean extraCabin; + + public boolean getExtraCabin() { + return extraCabin; + } + + public EntityMonorail(int speed, double weight, Color mainColor, Color + additionalColor, boolean magneticRail, boolean extraCabin) { + super(speed, weight, mainColor); + this.additionalColor = additionalColor; + this.magneticRail = magneticRail; + this.extraCabin = extraCabin; + } +} diff --git a/src/projectMonorail/EntityMonorail.java b/src/projectMonorail/EntityMonorail.java deleted file mode 100644 index 8eee9e4..0000000 --- a/src/projectMonorail/EntityMonorail.java +++ /dev/null @@ -1,55 +0,0 @@ -package projectMonorail; - -import java.awt.*; - -public class EntityMonorail { - - private int speed; - - public int getSpeed() { - return speed; - } - - private double weight; - - public double getWeight() { - return weight; - } - - private Color mainColor; - - public Color getMainColor() { - return mainColor; - } - - private Color additionalColor; - - public Color getAdditionalColor() { - return additionalColor; - } - - private boolean magneticRail; - - public boolean getMagneticRail() { - return magneticRail; - } - - private boolean extraCabin; - - public boolean getExtraCabin() { - return extraCabin; - } - - public double getStep() { - return (double)speed * 100 / weight; - } - - public void Init(int speed, double weight, Color mainColor , Color additionalColor , boolean magneticRail, boolean extraCabin) { - this.speed = speed; - this.weight = weight; - this.mainColor = mainColor; - this.additionalColor = additionalColor; - this.magneticRail = magneticRail; - this.extraCabin = extraCabin; - } -} diff --git a/src/projectMonorail/Extras/DrawingNormalWheels.java b/src/projectMonorail/Extras/DrawingNormalWheels.java new file mode 100644 index 0000000..0b11097 --- /dev/null +++ b/src/projectMonorail/Extras/DrawingNormalWheels.java @@ -0,0 +1,105 @@ +package projectMonorail.Extras; + +import java.awt.*; + +public class DrawingNormalWheels implements IDrawingWheels { + + private WheelNumber wheelNumber; + + @Override + public WheelNumber getWheelNumber() { + return wheelNumber; + } + + @Override + public void setWheelNumber(int number) { + switch (number) { + case 2: + wheelNumber = WheelNumber.Two; + break; + case 3: + wheelNumber = WheelNumber.Three; + break; + case 4: + wheelNumber = WheelNumber.Four; + break; + default: + wheelNumber = WheelNumber.Two; + } + } + + @Override + public void drawWheels(Graphics2D g2d, Color color, int startPosX, int startPosY) { + switch (wheelNumber) { + case Two: + drawTwoWheels(g2d, color, startPosX, startPosY); + break; + case Three: + drawThreeWheels(g2d, color, startPosX, startPosY); + break; + case Four: + drawFourWheels(g2d, color, startPosX, startPosY); + break; + } + } + + private void drawTwoWheels(Graphics2D g2d, Color color, int startPosX, int startPosY) { + g2d.setColor(color); + + g2d.fillOval(startPosX + 25, startPosY + 47, 10, 9); + g2d.fillOval(startPosX + 45, startPosY + 47, 10, 9); + g2d.fillOval(startPosX + 75, startPosY + 47, 10, 9); + g2d.fillOval(startPosX + 95, startPosY + 47, 10, 9); + + g2d.setColor(Color.BLACK); + + g2d.drawOval(startPosX + 25, startPosY + 47, 10, 9); + g2d.drawOval(startPosX + 45, startPosY + 47, 10, 9); + g2d.drawOval(startPosX + 75, startPosY + 47, 10, 9); + g2d.drawOval(startPosX + 95, startPosY + 47, 10, 9); + } + + private void drawThreeWheels(Graphics2D g2d, Color color, int startPosX, int startPosY) { + g2d.setColor(color); + + g2d.fillOval(startPosX + 25, startPosY + 47, 8, 9); + g2d.fillOval(startPosX + 36, startPosY + 47, 8, 9); + g2d.fillOval(startPosX + 47, startPosY + 47, 8, 9); + g2d.fillOval(startPosX + 76, startPosY + 47, 8, 9); + g2d.fillOval(startPosX + 87, startPosY + 47, 8, 9); + g2d.fillOval(startPosX + 98, startPosY + 47, 8, 9); + + g2d.setColor(Color.BLACK); + + g2d.drawOval(startPosX + 25, startPosY + 47, 8, 9); + g2d.drawOval(startPosX + 36, startPosY + 47, 8, 9); + g2d.drawOval(startPosX + 47, startPosY + 47, 8, 9); + g2d.drawOval(startPosX + 76, startPosY + 47, 8, 9); + g2d.drawOval(startPosX + 87, startPosY + 47, 8, 9); + g2d.drawOval(startPosX + 98, startPosY + 47, 8, 9); + } + + private void drawFourWheels(Graphics2D g2d, Color color, int startPosX, int startPosY) { + g2d.setColor(color); + + g2d.fillOval(startPosX + 25, startPosY + 47, 6, 9); + g2d.fillOval(startPosX + 33, startPosY + 47, 6, 9); + g2d.fillOval(startPosX + 41, startPosY + 47, 6, 9); + g2d.fillOval(startPosX + 49, startPosY + 47, 6, 9); + g2d.fillOval(startPosX + 75, startPosY + 47, 6, 9); + g2d.fillOval(startPosX + 83, startPosY + 47, 6, 9); + g2d.fillOval(startPosX + 91, startPosY + 47, 6, 9); + g2d.fillOval(startPosX + 99, startPosY + 47, 6, 9); + + g2d.setColor(Color.BLACK); + + g2d.drawOval(startPosX + 25, startPosY + 47, 6, 9); + g2d.drawOval(startPosX + 33, startPosY + 47, 6, 9); + g2d.drawOval(startPosX + 41, startPosY + 47, 6, 9); + g2d.drawOval(startPosX + 49, startPosY + 47, 6, 9); + g2d.drawOval(startPosX + 76, startPosY + 47, 6, 9); + g2d.drawOval(startPosX + 84, startPosY + 47, 6, 9); + g2d.drawOval(startPosX + 92, startPosY + 47, 6, 9); + g2d.drawOval(startPosX + 100, startPosY + 47, 6, 9); + } +} diff --git a/src/projectMonorail/Extras/DrawingSquarePatternWheels.java b/src/projectMonorail/Extras/DrawingSquarePatternWheels.java new file mode 100644 index 0000000..8c018fe --- /dev/null +++ b/src/projectMonorail/Extras/DrawingSquarePatternWheels.java @@ -0,0 +1,114 @@ +package projectMonorail.Extras; + +import java.awt.*; + +public class DrawingSquarePatternWheels implements IDrawingWheels { + + private WheelNumber wheelNumber; + + @Override + public WheelNumber getWheelNumber() { + return wheelNumber; + } + + @Override + public void setWheelNumber(int number) { + switch (number) { + case 2: + wheelNumber = WheelNumber.Two; + break; + case 3: + wheelNumber = WheelNumber.Three; + break; + case 4: + wheelNumber = WheelNumber.Four; + break; + default: + wheelNumber = WheelNumber.Two; + } + } + + @Override + public void drawWheels(Graphics2D g2d, Color color, int startPosX, int startPosY) { + switch (wheelNumber) { + case Two: + drawTwoWheels(g2d, color, startPosX, startPosY); + break; + case Three: + drawThreeWheels(g2d, color, startPosX, startPosY); + break; + case Four: + drawFourWheels(g2d, color, startPosX, startPosY); + break; + } + } + + private void drawTwoWheels(Graphics2D g2d, Color color, int startPosX, int startPosY) { + g2d.setColor(color); + + g2d.fillOval(startPosX + 25, startPosY + 47, 10, 9); + g2d.fillOval(startPosX + 45, startPosY + 47, 10, 9); + g2d.fillOval(startPosX + 75, startPosY + 47, 10, 9); + g2d.fillOval(startPosX + 95, startPosY + 47, 10, 9); + + g2d.setColor(Color.BLACK); + + drawWheel(g2d, startPosX, startPosY, 25, 47, 10, 9); + drawWheel(g2d, startPosX, startPosY, 45, 47, 10, 9); + drawWheel(g2d, startPosX, startPosY, 75, 47, 10, 9); + drawWheel(g2d, startPosX, startPosY, 95, 47, 10, 9); + } + + private void drawThreeWheels(Graphics2D g2d, Color color, int startPosX, int startPosY) { + g2d.setColor(color); + + g2d.fillOval(startPosX + 25, startPosY + 47, 8, 9); + g2d.fillOval(startPosX + 36, startPosY + 47, 8, 9); + g2d.fillOval(startPosX + 47, startPosY + 47, 8, 9); + g2d.fillOval(startPosX + 76, startPosY + 47, 8, 9); + g2d.fillOval(startPosX + 87, startPosY + 47, 8, 9); + g2d.fillOval(startPosX + 98, startPosY + 47, 8, 9); + + g2d.setColor(Color.BLACK); + + drawWheel(g2d, startPosX, startPosY, 25, 47, 8, 9); + drawWheel(g2d, startPosX, startPosY, 36, 47, 8, 9); + drawWheel(g2d, startPosX, startPosY, 47, 47, 8, 9); + drawWheel(g2d, startPosX, startPosY, 76, 47, 8, 9); + drawWheel(g2d, startPosX, startPosY, 87, 47, 8, 9); + drawWheel(g2d, startPosX, startPosY, 98, 47, 8, 9); + } + + private void drawFourWheels(Graphics2D g2d, Color color, int startPosX, int startPosY) { + g2d.setColor(color); + + g2d.fillOval(startPosX + 25, startPosY + 47, 6, 9); + g2d.fillOval(startPosX + 33, startPosY + 47, 6, 9); + g2d.fillOval(startPosX + 41, startPosY + 47, 6, 9); + g2d.fillOval(startPosX + 49, startPosY + 47, 6, 9); + g2d.fillOval(startPosX + 75, startPosY + 47, 6, 9); + g2d.fillOval(startPosX + 83, startPosY + 47, 6, 9); + g2d.fillOval(startPosX + 91, startPosY + 47, 6, 9); + g2d.fillOval(startPosX + 99, startPosY + 47, 6, 9); + + g2d.setColor(Color.BLACK); + + drawWheel(g2d, startPosX, startPosY, 25, 47, 6, 9); + drawWheel(g2d, startPosX, startPosY, 33, 47, 6, 9); + drawWheel(g2d, startPosX, startPosY, 41, 47, 6, 9); + drawWheel(g2d, startPosX, startPosY, 49, 47, 6, 9); + drawWheel(g2d, startPosX, startPosY, 75, 47, 6, 9); + drawWheel(g2d, startPosX, startPosY, 83, 47, 6, 9); + drawWheel(g2d, startPosX, startPosY, 91, 47, 6, 9); + drawWheel(g2d, startPosX, startPosY, 99, 47, 6, 9); + } + + private void drawWheel(Graphics2D g2d, int startPosX, int startPosY, int xChange, int yChange, int width, int height) { + g2d.drawOval(startPosX + xChange, startPosY + yChange, width, height); + + g2d.setColor(Color.RED); + g2d.fillRect((int)(startPosX + xChange + width * 0.335), startPosY + yChange + height/3, width/2, height/2); + + g2d.setColor(Color.BLACK); + } +} diff --git a/src/projectMonorail/Extras/DrawingVintageWheels.java b/src/projectMonorail/Extras/DrawingVintageWheels.java new file mode 100644 index 0000000..e59b603 --- /dev/null +++ b/src/projectMonorail/Extras/DrawingVintageWheels.java @@ -0,0 +1,117 @@ +package projectMonorail.Extras; + +import java.awt.*; + +public class DrawingVintageWheels implements IDrawingWheels { + + private WheelNumber wheelNumber; + + @Override + public WheelNumber getWheelNumber() { + return wheelNumber; + } + + @Override + public void setWheelNumber(int number) { + switch (number) { + case 2: + wheelNumber = WheelNumber.Two; + break; + case 3: + wheelNumber = WheelNumber.Three; + break; + case 4: + wheelNumber = WheelNumber.Four; + break; + default: + wheelNumber = WheelNumber.Two; + } + } + + @Override + public void drawWheels(Graphics2D g2d, Color color, int startPosX, int startPosY) { + switch (wheelNumber) { + case Two: + drawTwoWheels(g2d, color, startPosX, startPosY); + break; + case Three: + drawThreeWheels(g2d, color, startPosX, startPosY); + break; + case Four: + drawFourWheels(g2d, color, startPosX, startPosY); + break; + } + } + + private void drawTwoWheels(Graphics2D g2d, Color color, int startPosX, int startPosY) { + g2d.setColor(color); + + g2d.fillOval(startPosX + 25, startPosY + 47, 10, 9); + g2d.fillOval(startPosX + 45, startPosY + 47, 10, 9); + g2d.fillOval(startPosX + 75, startPosY + 47, 10, 9); + g2d.fillOval(startPosX + 95, startPosY + 47, 10, 9); + + g2d.setColor(Color.BLACK); + + drawWheel(g2d, startPosX, startPosY, 25, 47, 10, 9); + drawWheel(g2d, startPosX, startPosY, 45, 47, 10, 9); + drawWheel(g2d, startPosX, startPosY, 75, 47, 10, 9); + drawWheel(g2d, startPosX, startPosY, 95, 47, 10, 9); + } + + private void drawThreeWheels(Graphics2D g2d, Color color, int startPosX, int startPosY) { + g2d.setColor(color); + + g2d.fillOval(startPosX + 25, startPosY + 47, 8, 9); + g2d.fillOval(startPosX + 36, startPosY + 47, 8, 9); + g2d.fillOval(startPosX + 47, startPosY + 47, 8, 9); + g2d.fillOval(startPosX + 76, startPosY + 47, 8, 9); + g2d.fillOval(startPosX + 87, startPosY + 47, 8, 9); + g2d.fillOval(startPosX + 98, startPosY + 47, 8, 9); + + g2d.setColor(Color.BLACK); + + drawWheel(g2d, startPosX, startPosY, 25, 47, 8, 9); + drawWheel(g2d, startPosX, startPosY, 36, 47, 8, 9); + drawWheel(g2d, startPosX, startPosY, 47, 47, 8, 9); + drawWheel(g2d, startPosX, startPosY, 76, 47, 8, 9); + drawWheel(g2d, startPosX, startPosY, 87, 47, 8, 9); + drawWheel(g2d, startPosX, startPosY, 98, 47, 8, 9); + } + + private void drawFourWheels(Graphics2D g2d, Color color, int startPosX, int startPosY) { + g2d.setColor(color); + + g2d.fillOval(startPosX + 25, startPosY + 47, 6, 9); + g2d.fillOval(startPosX + 33, startPosY + 47, 6, 9); + g2d.fillOval(startPosX + 41, startPosY + 47, 6, 9); + g2d.fillOval(startPosX + 49, startPosY + 47, 6, 9); + g2d.fillOval(startPosX + 75, startPosY + 47, 6, 9); + g2d.fillOval(startPosX + 83, startPosY + 47, 6, 9); + g2d.fillOval(startPosX + 91, startPosY + 47, 6, 9); + g2d.fillOval(startPosX + 99, startPosY + 47, 6, 9); + + g2d.setColor(Color.BLACK); + + drawWheel(g2d, startPosX, startPosY, 25, 47, 6, 9); + drawWheel(g2d, startPosX, startPosY, 33, 47, 6, 9); + drawWheel(g2d, startPosX, startPosY, 41, 47, 6, 9); + drawWheel(g2d, startPosX, startPosY, 49, 47, 6, 9); + drawWheel(g2d, startPosX, startPosY, 75, 47, 6, 9); + drawWheel(g2d, startPosX, startPosY, 83, 47, 6, 9); + drawWheel(g2d, startPosX, startPosY, 91, 47, 6, 9); + drawWheel(g2d, startPosX, startPosY, 99, 47, 6, 9); + } + + private void drawWheel(Graphics2D g2d, int startPosX, int startPosY, int xChange, int yChange, int width, int height) { + g2d.setStroke(new BasicStroke(1)); + g2d.drawOval(startPosX + xChange, startPosY + yChange, width, height); + + g2d.drawLine(startPosX + xChange + width/2, startPosY + yChange, startPosX + xChange + width/2, startPosY + yChange + height); + g2d.drawLine(startPosX + xChange, startPosY + yChange + height/2, startPosX + xChange + width, startPosY + yChange + height/2); + g2d.drawLine(startPosX + xChange + width/8, startPosY + yChange + height/8, + startPosX + xChange + width * 7/8, startPosY + yChange + height * 7/8); + g2d.drawLine(startPosX + xChange + width * 7/8, startPosY + yChange + height/8, + startPosX + xChange + width/8, startPosY + yChange + height * 7/8); + } +} diff --git a/src/projectMonorail/Extras/IDrawingWheels.java b/src/projectMonorail/Extras/IDrawingWheels.java new file mode 100644 index 0000000..da4b2e8 --- /dev/null +++ b/src/projectMonorail/Extras/IDrawingWheels.java @@ -0,0 +1,11 @@ +package projectMonorail.Extras; + +import java.awt.*; + +public interface IDrawingWheels { + void setWheelNumber(int number); + + WheelNumber getWheelNumber(); + + void drawWheels(Graphics2D g2d, Color color, int startPosX, int startPosY); +} diff --git a/src/projectMonorail/WheelNumber.java b/src/projectMonorail/Extras/WheelNumber.java similarity index 65% rename from src/projectMonorail/WheelNumber.java rename to src/projectMonorail/Extras/WheelNumber.java index f6111f6..61a2724 100644 --- a/src/projectMonorail/WheelNumber.java +++ b/src/projectMonorail/Extras/WheelNumber.java @@ -1,4 +1,4 @@ -package projectMonorail; +package projectMonorail.Extras; public enum WheelNumber { Two, diff --git a/src/projectMonorail/MovementStrategy/AbstractStrategy.java b/src/projectMonorail/MovementStrategy/AbstractStrategy.java new file mode 100644 index 0000000..2d3a60b --- /dev/null +++ b/src/projectMonorail/MovementStrategy/AbstractStrategy.java @@ -0,0 +1,99 @@ +package projectMonorail.MovementStrategy; + +import projectMonorail.DirectionType; + +public abstract class AbstractStrategy { + + private IMoveableObject moveableObject; + + private Status state = Status.NotInit; + + private int fieldWidth; + + protected int getFieldWidth() { + return fieldWidth; + } + + private int fieldHeight; + + protected int getFieldHeight() { + return fieldHeight; + } + + public Status getStatus() { + return state; + } + + public void setData(IMoveableObject moveableObject, int width, int height) { + if (moveableObject == null) { + state = Status.NotInit; + return; + } + state = Status.InProgress; + this.moveableObject = moveableObject; + fieldWidth = width; + fieldHeight = height; + } + + public void makeStep() { + if (state != Status.InProgress) { + return; + } + if (isTargetDestination()) { + state = Status.Finish; + return; + } + moveToTarget(); + } + + protected boolean moveLeft() { + return moveTo(DirectionType.Left); + } + + protected boolean moveRight() { + return moveTo(DirectionType.Right); + } + + protected boolean moveUp() { + return moveTo(DirectionType.Up); + } + + protected boolean moveDown() { + return moveTo(DirectionType.Down); + } + + protected ObjectParameters getObjectParameters() { + if (moveableObject == null) { + return null; + } + return moveableObject.getObjectsPosition(); + } + + protected Integer getStep() { + if (state != Status.InProgress) { + return null; + } + if (moveableObject == null) { + return null; + } + return moveableObject.getStep(); + } + + protected abstract void moveToTarget(); + + protected abstract boolean isTargetDestination(); + + private boolean moveTo(DirectionType directionType) { + if (state != Status.InProgress) { + return false; + } + if (moveableObject == null) { + return false; + } + if (moveableObject.checkCanMove(directionType)) { + moveableObject.moveObject(directionType); + return true; + } + return false; + } +} diff --git a/src/projectMonorail/MovementStrategy/DrawingObjectLocomotive.java b/src/projectMonorail/MovementStrategy/DrawingObjectLocomotive.java new file mode 100644 index 0000000..8b9f356 --- /dev/null +++ b/src/projectMonorail/MovementStrategy/DrawingObjectLocomotive.java @@ -0,0 +1,43 @@ +package projectMonorail.MovementStrategy; + + +import projectMonorail.DirectionType; +import projectMonorail.DrawingObjects.DrawingLocomotive; + +public class DrawingObjectLocomotive implements IMoveableObject { + + private DrawingLocomotive drawingLocomotive = null; + + public DrawingObjectLocomotive(DrawingLocomotive drawingLocomotive) { + this.drawingLocomotive = drawingLocomotive; + } + + @Override + public ObjectParameters getObjectsPosition() { + if (drawingLocomotive == null || drawingLocomotive.getEntityLocomotive() == null) { + return null; + } + return new ObjectParameters(drawingLocomotive.getPosX(), drawingLocomotive.getPosY(), + drawingLocomotive.getWidth(), drawingLocomotive.getHeight()); + } + + @Override + public int getStep() { + if (drawingLocomotive == null) + return 0; + return (int) ((drawingLocomotive.getEntityLocomotive() != null) ? drawingLocomotive.getEntityLocomotive().getStep() : 0); + } + + @Override + public boolean checkCanMove(DirectionType direction) { + if (drawingLocomotive == null) + return false; + return drawingLocomotive.canMove(direction); + } + + @Override + public void moveObject(DirectionType direction) { + if (drawingLocomotive != null) + drawingLocomotive.moveTransport(direction); + } +} diff --git a/src/projectMonorail/MovementStrategy/IMoveableObject.java b/src/projectMonorail/MovementStrategy/IMoveableObject.java new file mode 100644 index 0000000..5a64e1c --- /dev/null +++ b/src/projectMonorail/MovementStrategy/IMoveableObject.java @@ -0,0 +1,14 @@ +package projectMonorail.MovementStrategy; + +import projectMonorail.DirectionType; + +public interface IMoveableObject { + + ObjectParameters getObjectsPosition(); + + int getStep(); + + boolean checkCanMove(DirectionType direction); + + void moveObject(DirectionType direction); +} diff --git a/src/projectMonorail/MovementStrategy/MoveToBorder.java b/src/projectMonorail/MovementStrategy/MoveToBorder.java new file mode 100644 index 0000000..5189eb4 --- /dev/null +++ b/src/projectMonorail/MovementStrategy/MoveToBorder.java @@ -0,0 +1,36 @@ +package projectMonorail.MovementStrategy; + +public class MoveToBorder extends AbstractStrategy { + + @Override + protected boolean isTargetDestination() { + var objParams = getObjectParameters(); + if (objParams == null) { + return false; + } + return objParams.rightBorder() <= getFieldWidth() && + objParams.rightBorder() + getStep() >= getFieldWidth() && + objParams.downBorder() <= getFieldHeight() && + objParams.downBorder() + getStep() >= getFieldHeight(); + } + + @Override + protected void moveToTarget() { + var objParams = getObjectParameters(); + if (objParams == null) { + return; + } + var diffX = objParams.objectMiddleHorizontal() - getFieldWidth(); + if (Math.abs(diffX) > getStep()) { + if (diffX < 0) { + moveRight(); + } + } + var diffY = objParams.objectMiddleVertical() - getFieldHeight(); + if (Math.abs(diffY) > getStep()) { + if (diffY < 0) { + moveDown(); + } + } + } +} diff --git a/src/projectMonorail/MovementStrategy/MoveToCenter.java b/src/projectMonorail/MovementStrategy/MoveToCenter.java new file mode 100644 index 0000000..38f05fa --- /dev/null +++ b/src/projectMonorail/MovementStrategy/MoveToCenter.java @@ -0,0 +1,40 @@ +package projectMonorail.MovementStrategy; + +public class MoveToCenter extends AbstractStrategy { + + @Override + protected boolean isTargetDestination() { + var objParams = getObjectParameters(); + if (objParams == null) { + return false; + } + return objParams.objectMiddleHorizontal() <= getFieldWidth() / 2 && + objParams.objectMiddleHorizontal() + getStep() >= getFieldWidth() / 2 && + objParams.objectMiddleVertical() <= getFieldHeight() / 2 && + objParams.objectMiddleVertical() + getStep() >= getFieldHeight() / 2; + } + + @Override + protected void moveToTarget() { + var objParams = getObjectParameters(); + if (objParams == null) { + return; + } + var diffX = objParams.objectMiddleHorizontal() - getFieldWidth() / 2; + if (Math.abs(diffX) > getStep()) { + if (diffX > 0) { + moveLeft(); + } else { + moveRight(); + } + } + var diffY = objParams.objectMiddleVertical() - getFieldHeight() / 2; + if (Math.abs(diffY) > getStep()) { + if (diffY > 0) { + moveUp(); + } else { + moveDown(); + } + } + } +} diff --git a/src/projectMonorail/MovementStrategy/ObjectParameters.java b/src/projectMonorail/MovementStrategy/ObjectParameters.java new file mode 100644 index 0000000..807becc --- /dev/null +++ b/src/projectMonorail/MovementStrategy/ObjectParameters.java @@ -0,0 +1,43 @@ +package projectMonorail.MovementStrategy; + +public class ObjectParameters { + + private final int x; + + private final int y; + + private final int width; + + private final int height; + + public int leftBorder() { + return x; + } + + public int topBorder() { + return y; + } + + public int rightBorder() { + return x + width; + } + + public int downBorder() { + return y + height; + } + + public int objectMiddleHorizontal() { + return x + width / 2; + } + + public int objectMiddleVertical() { + return y + height / 2; + } + + public ObjectParameters(int x, int y, int width, int height) { + this.x = x; + this.y = y; + this.width = width; + this.height = height; + } +} diff --git a/src/projectMonorail/MovementStrategy/Status.java b/src/projectMonorail/MovementStrategy/Status.java new file mode 100644 index 0000000..5305272 --- /dev/null +++ b/src/projectMonorail/MovementStrategy/Status.java @@ -0,0 +1,9 @@ +package projectMonorail.MovementStrategy; + +public enum Status { + NotInit, + + InProgress, + + Finish +} diff --git a/src/projectMonorail/PictureBox.java b/src/projectMonorail/PictureBox.java index 8ac6a6c..03473ae 100644 --- a/src/projectMonorail/PictureBox.java +++ b/src/projectMonorail/PictureBox.java @@ -1,5 +1,8 @@ package projectMonorail; +import projectMonorail.DrawingObjects.*; +import projectMonorail.MovementStrategy.*; + import javax.swing.*; import java.awt.*; import java.awt.event.ActionListener; @@ -7,7 +10,9 @@ import java.util.Random; public class PictureBox extends JPanel { - private DrawingMonorail drawingMonorail; + private DrawingLocomotive drawingLocomotive; + + private AbstractStrategy abstractStrategy; private JButton buttonLeft; @@ -17,13 +22,23 @@ public class PictureBox extends JPanel { private JButton buttonDown; + private JButton buttonCreateLocomotive; + private JButton buttonCreateMonorail; + private JButton buttonStep; + + private JComboBox comboBoxStrategy; + private JPanel buttonsPanel; private JPanel buttonsMovePanel; - private JPanel paddingPanel; + private JPanel movePaddingPanel; + + private JPanel strategyPaddingPanel; + + private JPanel strategyPanel; public PictureBox() { setLayout(new BorderLayout()); @@ -32,29 +47,44 @@ public class PictureBox extends JPanel { buttonsPanel.setLayout(new BoxLayout(buttonsPanel, BoxLayout.X_AXIS)); buttonsPanel.setOpaque(false); - buttonCreateMonorail = new JButton("Create"); + buttonCreateLocomotive = new JButton("Create locomotive"); + buttonCreateLocomotive.setFocusable(false); + buttonCreateLocomotive.setFont(new Font("Segoe UI", Font.PLAIN, 12)); + buttonCreateLocomotive.setBackground(Color.LIGHT_GRAY); + buttonCreateLocomotive.setMaximumSize(new Dimension(140, 42)); + + buttonCreateLocomotive.addActionListener(e -> { + Random random = new Random(); + drawingLocomotive = new DrawingLocomotive(random.nextInt(200, 300), + random.nextInt(1000, 3000), + new Color(random.nextInt(0, 256), random.nextInt(0, 256), + random.nextInt(0, 256)), + this.getWidth(), this.getHeight(), random.nextInt(2, 5)); + drawingLocomotive.setPosition(random.nextInt(10, 100), random.nextInt(10, 100)); + repaint(); + }); + + buttonCreateMonorail = new JButton("Create monorail"); buttonCreateMonorail.setFocusable(false); buttonCreateMonorail.setFont(new Font("Segoe UI", Font.PLAIN, 12)); buttonCreateMonorail.setBackground(Color.LIGHT_GRAY); - buttonCreateMonorail.setPreferredSize(new Dimension(75, 23)); + buttonCreateMonorail.setMaximumSize(new Dimension(140, 42)); - buttonCreateMonorail.addActionListener (e -> { + buttonCreateMonorail.addActionListener(e -> { Random random = new Random(); - drawingMonorail = new DrawingMonorail(); - drawingMonorail.Init(random.nextInt(200, 300), + drawingLocomotive = new DrawingMonorail(random.nextInt(200, 300), random.nextInt(1000, 3000), new Color(random.nextInt(0, 256), random.nextInt(0, 256), random.nextInt(0, 256)), new Color(random.nextInt(0, 256), random.nextInt(0, 256), random.nextInt(0, 256)), random.nextBoolean(), random.nextBoolean(), this.getWidth(), this.getHeight(), random.nextInt(2, 5)); - drawingMonorail.SetPosition(random.nextInt(10, 100), random.nextInt(10, 100)); + drawingLocomotive.setPosition(random.nextInt(10, 100), random.nextInt(10, 100)); repaint(); }); ActionListener buttonMoveListener = e -> { - if (drawingMonorail == null) - { + if (drawingLocomotive == null) { return; } @@ -62,16 +92,16 @@ public class PictureBox extends JPanel { switch (buttonName) { case ("buttonUp"): - drawingMonorail.MoveTransport(DirectionType.Up); + drawingLocomotive.moveTransport(DirectionType.Up); break; case ("buttonDown"): - drawingMonorail.MoveTransport(DirectionType.Down); + drawingLocomotive.moveTransport(DirectionType.Down); break; case ("buttonLeft"): - drawingMonorail.MoveTransport(DirectionType.Left); + drawingLocomotive.moveTransport(DirectionType.Left); break; case ("buttonRight"): - drawingMonorail.MoveTransport(DirectionType.Right); + drawingLocomotive.moveTransport(DirectionType.Right); break; } repaint(); @@ -110,7 +140,7 @@ public class PictureBox extends JPanel { buttonsMovePanel.setOpaque(false); GridBagConstraints constrains = new GridBagConstraints(); - constrains.insets = new Insets(5,5,5,5); + constrains.insets = new Insets(5, 5, 5, 5); constrains.gridx = 0; constrains.gridy = 0; @@ -141,30 +171,94 @@ public class PictureBox extends JPanel { buttonsMovePanel.add(buttonRight, constrains); - paddingPanel = new JPanel(); - paddingPanel.setLayout(new BoxLayout(paddingPanel, BoxLayout.Y_AXIS)); - paddingPanel.setOpaque(false); + movePaddingPanel = new JPanel(); + movePaddingPanel.setLayout(new BoxLayout(movePaddingPanel, BoxLayout.Y_AXIS)); + movePaddingPanel.setOpaque(false); - paddingPanel.add(buttonsMovePanel); - paddingPanel.add(Box.createVerticalStrut(15)); + movePaddingPanel.add(buttonsMovePanel); + movePaddingPanel.add(Box.createVerticalStrut(22)); - buttonsPanel.add(Box.createHorizontalStrut(20)); + buttonsPanel.add(Box.createHorizontalStrut(12)); buttonsPanel.add(buttonCreateMonorail); - buttonsPanel.add(Box.createHorizontalStrut(650)); - buttonsPanel.add(paddingPanel); + buttonsPanel.add(Box.createHorizontalStrut(16)); + buttonsPanel.add(buttonCreateLocomotive); + buttonsPanel.add(Box.createHorizontalStrut(460)); + buttonsPanel.add(movePaddingPanel); add(buttonsPanel, BorderLayout.SOUTH); + + strategyPaddingPanel = new JPanel(); + strategyPaddingPanel.setLayout(new BoxLayout(strategyPaddingPanel, BoxLayout.X_AXIS)); + strategyPaddingPanel.setOpaque(false); + + String[] items = { + "Form center", + "Form border" + }; + comboBoxStrategy = new JComboBox(items); + comboBoxStrategy.setMaximumSize(new Dimension(150, 23)); + + buttonStep = new JButton("Step"); + buttonStep.setFocusable(false); + buttonStep.setFont(new Font("Segoe UI", Font.PLAIN, 12)); + buttonStep.setBackground(Color.LIGHT_GRAY); + buttonStep.setMaximumSize(new Dimension(75, 28)); + + buttonStep.addActionListener(e -> { + if (drawingLocomotive == null) { + return; + } + if (comboBoxStrategy.isEnabled()) { + abstractStrategy = switch (comboBoxStrategy.getSelectedIndex()) { + case 0 -> new MoveToCenter(); + case 1 -> new MoveToBorder(); + default -> null; + }; + if (abstractStrategy == null) + { + return; + } + abstractStrategy.setData(new DrawingObjectLocomotive(drawingLocomotive), this.getWidth(), this.getHeight()); + } + if (abstractStrategy == null) + { + return; + } + comboBoxStrategy.setEnabled(false); + abstractStrategy.makeStep(); + repaint(); + if (abstractStrategy.getStatus() == Status.Finish) + { + comboBoxStrategy.setEnabled(true); + abstractStrategy = null; + } + }); + + strategyPanel = new JPanel(); + strategyPanel.setLayout(new BoxLayout(strategyPanel, BoxLayout.Y_AXIS)); + strategyPanel.setOpaque(false); + + strategyPanel.add(Box.createVerticalStrut(10)); + strategyPanel.add(comboBoxStrategy); + strategyPanel.add(Box.createVerticalStrut(15)); + strategyPanel.add(buttonStep); + + strategyPaddingPanel.add(Box.createHorizontalStrut(735)); + strategyPaddingPanel.add(strategyPanel); + + add(strategyPaddingPanel, BorderLayout.NORTH); + setPreferredSize(new Dimension(900, 500)); } @Override protected void paintComponent(Graphics g) { - if (drawingMonorail == null) { + if (drawingLocomotive == null) { return; } super.paintComponent(g); Graphics2D g2d = (Graphics2D) g; - drawingMonorail.DrawTransport(g2d); + drawingLocomotive.drawTransport(g2d); } }