From 3fdb16964650be8cbf76426ca17a640d220fe0d7 Mon Sep 17 00:00:00 2001 From: jez04 <david.jezek@post.cz> Date: Mon, 7 Oct 2024 03:00:54 +0200 Subject: [PATCH] feat: solution --- src/main/java/lab/BulletAnimated.java | 6 + src/main/java/lab/Ufo.java | 50 ++++++++ src/main/java/lab/World.java | 18 +++ src/main/resources/lab/ufo-small.gif | Bin 0 -> 6370 bytes src/main/resources/lab/ufo.gif | Bin 0 -> 37038 bytes .../structure/test/ClassStructureTest.java | 117 ++++++++++++++++++ 6 files changed, 191 insertions(+) create mode 100644 src/main/java/lab/Ufo.java create mode 100644 src/main/resources/lab/ufo-small.gif create mode 100644 src/main/resources/lab/ufo.gif create mode 100644 src/test/java/jez04/structure/test/ClassStructureTest.java diff --git a/src/main/java/lab/BulletAnimated.java b/src/main/java/lab/BulletAnimated.java index 02b9a32..cc7d236 100644 --- a/src/main/java/lab/BulletAnimated.java +++ b/src/main/java/lab/BulletAnimated.java @@ -1,6 +1,7 @@ package lab; import javafx.geometry.Point2D; +import javafx.geometry.Rectangle2D; import javafx.scene.canvas.GraphicsContext; import javafx.scene.image.Image; @@ -19,6 +20,7 @@ public class BulletAnimated { public void draw(GraphicsContext gc) { gc.drawImage(image, getPosition().getX(), getPosition().getY(), SIZE, SIZE); + gc.strokeRect(position.getX(), position.getY(), SIZE, SIZE); } private final Point2D acceleration; @@ -35,4 +37,8 @@ public class BulletAnimated { return position; } + public Rectangle2D getBoundingBox() { + return new Rectangle2D(position.getX(), position.getY(), SIZE,SIZE); + } + } diff --git a/src/main/java/lab/Ufo.java b/src/main/java/lab/Ufo.java new file mode 100644 index 0000000..472c4f1 --- /dev/null +++ b/src/main/java/lab/Ufo.java @@ -0,0 +1,50 @@ +package lab; + +import java.util.Random; + +import javafx.geometry.Point2D; +import javafx.geometry.Rectangle2D; +import javafx.scene.canvas.GraphicsContext; +import javafx.scene.image.Image; + +public class Ufo { + + private static final Random RANDOM = new Random(); + private Image image = new Image(this.getClass().getResourceAsStream("ufo-small.gif")); + private final World world; + private Point2D position; + private Point2D velocity; + + public Ufo(World world) { + this(world, + new Point2D(RANDOM.nextDouble(world.getWidth()), + RANDOM.nextDouble(0, world.getHeight()*0.3)), + new Point2D(RANDOM.nextDouble(70, 150), 0)); + } + + public Ufo(World world, Point2D position, Point2D velocity) { + this.world = world; + this.position = position; + this.velocity = velocity; + } + + public void draw(GraphicsContext gc) { + gc.drawImage(image, getPosition().getX(), getPosition().getY()); + } + + public void changeDirection(){ + velocity = velocity.multiply(-1); + } + public void simulate(double deltaT) { + position = position.add(velocity.multiply(deltaT)); + position = new Point2D(position.getX()%world.getWidth(), position.getY()); + } + + protected Point2D getPosition() { + return position; + } + + public Rectangle2D getBoundingBox() { + return new Rectangle2D(position.getX(), position.getY(), image.getWidth(), image.getHeight()); + } +} diff --git a/src/main/java/lab/World.java b/src/main/java/lab/World.java index 3417a42..6abd918 100644 --- a/src/main/java/lab/World.java +++ b/src/main/java/lab/World.java @@ -1,5 +1,7 @@ package lab; +import java.util.Iterator; + import javafx.geometry.Point2D; import javafx.scene.canvas.GraphicsContext; @@ -12,6 +14,7 @@ public class World { private final Bullet bullet; private final BulletAnimated bullet2; private final Cannon cannon; + private Ufo[] ufos; public World(double width, double height) { this.width = width; @@ -19,6 +22,10 @@ public class World { bullet = new Bullet(this, new Point2D(0, height), new Point2D(30, -30), new Point2D(0, 9.81)); bullet2 = new BulletAnimated(this, new Point2D(0, height), new Point2D(50, -80), new Point2D(0, 9.81)); cannon = new Cannon(this, new Point2D(0, height-20), -45); + ufos = new Ufo[5]; + for (int i = 0; i < ufos.length; i++) { + ufos[i] = new Ufo(this); + } } public void draw(GraphicsContext gc) { @@ -28,6 +35,9 @@ public class World { bullet.draw(gc); bullet2.draw(gc); cannon.draw(gc); + for (int i = 0; i < ufos.length; i++) { + ufos[i].draw(gc); + } gc.restore(); } @@ -35,6 +45,14 @@ public class World { bullet.simulate(deltaT); bullet2.simulate(deltaT); cannon.simulate(deltaT); + for (int i = 0; i < ufos.length; i++) { + ufos[i].simulate(deltaT); + } + for (Ufo ufo : ufos) { + if(ufo.getBoundingBox().intersects(bullet2.getBoundingBox())) { + ufo.changeDirection(); + } + } } public double getWidth() { diff --git a/src/main/resources/lab/ufo-small.gif b/src/main/resources/lab/ufo-small.gif new file mode 100644 index 0000000000000000000000000000000000000000..a1aca24e41f2d04912a45c703663c2b607f722dd GIT binary patch literal 6370 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 Ap8x;= literal 0 HcmV?d00001 diff --git a/src/main/resources/lab/ufo.gif b/src/main/resources/lab/ufo.gif new file mode 100644 index 0000000000000000000000000000000000000000..d07613c8999847572bffb44d7b161cffd874ca0f GIT binary patch literal 37038 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 literal 0 HcmV?d00001 diff --git a/src/test/java/jez04/structure/test/ClassStructureTest.java b/src/test/java/jez04/structure/test/ClassStructureTest.java new file mode 100644 index 0000000..ac5f14c --- /dev/null +++ b/src/test/java/jez04/structure/test/ClassStructureTest.java @@ -0,0 +1,117 @@ +package jez04.structure.test; + +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.junit.jupiter.api.Test; +import org.reflections.Configuration; +import org.reflections.Reflections; +import org.reflections.scanners.Scanners; +import org.reflections.util.ConfigurationBuilder; + +import javafx.geometry.Rectangle2D; + +class ClassStructureTest { + + @Test + void ufoClassEexistanceTest() { + Set<String> allClasses = getNameOfAllClasses(); + assertTrue(allClasses.stream().anyMatch(c -> c.endsWith("Ufo")), "Class Ufo not found"); + } + + @Test + void ufoClassPropertiesTest() { + Set<String> allClasses = getNameOfAllClasses(); + String ufoClassName = allClasses.stream().filter(c -> c.endsWith("Ufo")).findAny().orElse(null); + assertNotNull(ufoClassName, "Class Ufo not found"); + try { + Class<?> ufoClass = Class.forName(ufoClassName); + List<Method> methods = Arrays.asList(ufoClass.getMethods()); + assertTrue(methods.stream().anyMatch(m -> m.getName().contains("draw")), "No method draw"); + assertTrue(methods.stream().anyMatch(m -> m.getName().contains("simulate")), "No method simulate"); + assertTrue(methods.stream().anyMatch(m -> m.getName().contains("getBoundingBox")), + "No method getBoundingBox"); + assertTrue( + methods.stream().filter(m -> m.getName().contains("getBoundingBox")) + .anyMatch(m -> m.getReturnType().equals(Rectangle2D.class)), + "Method getBoundingBox not return Rectangle2D"); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + } + + @Test + void worldClassPropertyTest() { + Set<String> allClasses = getNameOfAllClasses(); + String ufoClassName = allClasses.stream().filter(c -> c.endsWith("Ufo")).findAny().orElse(null); + String worldClassName = allClasses.stream().filter(c -> c.endsWith("World")).findAny().orElse(null); + assertNotNull(worldClassName, "Class World not found"); + try { + Class<?> worldClass = Class.forName(worldClassName); + List<Field> fields = Arrays.asList(worldClass.getDeclaredFields()); + Class<?> ufoClass = Class.forName(ufoClassName); + assertTrue( + fields.stream() + .anyMatch(f -> f.getType().isArray() && f.getType().getComponentType().equals(ufoClass)), + "No array of Ufo in World class"); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + } + + @Test + void drawingClassExistenceTest() { + Set<String> allClasses = getNameOfAllClasses(); + int detectedClassCount = 0; + for (String className : allClasses) { + try { + Class<?> clazz = Class.forName(className); + List<Constructor<?>> constructorList = Arrays.asList(clazz.getConstructors()); + List<Method> methodList = Arrays.asList(clazz.getMethods()); + long drawMethodCount = methodList.stream().filter(m -> m.getName().contains("draw")).count(); + long simulateMethodCount = methodList.stream().filter(m -> m.getName().contains("sim")).count(); + if (!constructorList.isEmpty() && (drawMethodCount > 0 || simulateMethodCount > 0)) { + System.out.println("DETECT:" + className); + detectedClassCount++; + } + } catch (ClassNotFoundException e) { + System.out.println(String.format("Class '%s' cannot be loaded: %s", className, e.getMessage())); + } + } + assertTrue(detectedClassCount >= 2, ""); + } + + private Set<String> getNameOfAllClasses() { + List<String> initClassesName = Arrays.asList("lab.Routines", "lab.App", "lab.DrawingThread"); + for (String className : initClassesName) { + try { + Class.forName(className); + } catch (ClassNotFoundException e) { + System.out.println(String.format("Class '%s' cannot be loaded: %s", className, e.getMessage())); + } + } + Set<String> allClasses = new HashSet<>(); + for (Package p : Package.getPackages()) { + if (p.getName().startsWith("java.") || p.getName().startsWith("com.") || p.getName().startsWith("jdk.") + || p.getName().startsWith("javafx.") || p.getName().startsWith("org.") + || p.getName().startsWith("sun.") || p.getName().startsWith("javax.") + || p.getName().startsWith("javassist")) { + continue; + } + System.out.println(p.getName()); + Configuration conf = new ConfigurationBuilder().addScanners(Scanners.SubTypes.filterResultsBy(pc -> true)) + .forPackages(p.getName()); + Reflections reflections = new Reflections(conf); + allClasses.addAll(reflections.getAll(Scanners.SubTypes.filterResultsBy(c -> true))); + } + return allClasses; + } +} -- GitLab