From 0d5397dbe3156ba4ca0aa280f2afa398c59186e2 Mon Sep 17 00:00:00 2001 From: Nilstrieb Date: Fri, 11 Dec 2020 19:49:03 +0100 Subject: [PATCH] inital commit --- .idea/.gitignore | 3 + .idea/.name | 1 + .idea/Java2DGame.iml | 2 + .idea/compiler.xml | 14 ++ .idea/discord.xml | 6 + .idea/encodings.xml | 6 + .idea/jarRepositories.xml | 25 +++ .idea/libraries/2DGame.xml | 9 + .idea/misc.xml | 14 ++ .idea/uiDesigner.xml | 124 ++++++++++++++ .idea/vcs.xml | 6 + 2DGame.iml | 2 + 2DGame.zip | Bin 30640 -> 0 bytes pom.xml | 31 ++++ src/main/java/BasicEx.java | 47 ++++++ src/main/java/core/Master.java | 123 ++++++++++++++ src/main/java/core/Vector2D.java | 158 ++++++++++++++++++ src/main/java/objects/DebugPos.java | 26 +++ src/main/java/objects/GameObject.java | 67 ++++++++ src/main/java/objects/ships/BattleShip.java | 54 ++++++ src/main/java/objects/ships/Shell.java | 27 +++ src/main/java/objects/ships/Turret.java | 103 ++++++++++++ src/main/java/objects/world/Grid.java | 47 ++++++ src/test/java/core/Vector2DTest.java | 60 +++++++ target/classes/BasicEx$1.class | Bin 0 -> 660 bytes target/classes/BasicEx.class | Bin 0 -> 2155 bytes target/classes/core/Master.class | Bin 0 -> 3807 bytes target/classes/core/Vector2D.class | Bin 0 -> 2836 bytes target/classes/objects/DebugPos.class | Bin 0 -> 1055 bytes target/classes/objects/GameObject.class | Bin 0 -> 1608 bytes target/classes/objects/ships/BattleShip.class | Bin 0 -> 2936 bytes target/classes/objects/ships/Shell.class | Bin 0 -> 1092 bytes target/classes/objects/ships/Turret.class | Bin 0 -> 3543 bytes target/classes/objects/world/Grid.class | Bin 0 -> 1157 bytes target/test-classes/core/Vector2DTest.class | Bin 0 -> 1906 bytes 35 files changed, 955 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/.name create mode 100644 .idea/Java2DGame.iml create mode 100644 .idea/compiler.xml create mode 100644 .idea/discord.xml create mode 100644 .idea/encodings.xml create mode 100644 .idea/jarRepositories.xml create mode 100644 .idea/libraries/2DGame.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/uiDesigner.xml create mode 100644 .idea/vcs.xml create mode 100644 2DGame.iml delete mode 100644 2DGame.zip create mode 100644 pom.xml create mode 100644 src/main/java/BasicEx.java create mode 100644 src/main/java/core/Master.java create mode 100644 src/main/java/core/Vector2D.java create mode 100644 src/main/java/objects/DebugPos.java create mode 100644 src/main/java/objects/GameObject.java create mode 100644 src/main/java/objects/ships/BattleShip.java create mode 100644 src/main/java/objects/ships/Shell.java create mode 100644 src/main/java/objects/ships/Turret.java create mode 100644 src/main/java/objects/world/Grid.java create mode 100644 src/test/java/core/Vector2DTest.java create mode 100644 target/classes/BasicEx$1.class create mode 100644 target/classes/BasicEx.class create mode 100644 target/classes/core/Master.class create mode 100644 target/classes/core/Vector2D.class create mode 100644 target/classes/objects/DebugPos.class create mode 100644 target/classes/objects/GameObject.class create mode 100644 target/classes/objects/ships/BattleShip.class create mode 100644 target/classes/objects/ships/Shell.class create mode 100644 target/classes/objects/ships/Turret.class create mode 100644 target/classes/objects/world/Grid.class create mode 100644 target/test-classes/core/Vector2DTest.class diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..4bd3a9a --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +2DGame \ No newline at end of file diff --git a/.idea/Java2DGame.iml b/.idea/Java2DGame.iml new file mode 100644 index 0000000..78b2cc5 --- /dev/null +++ b/.idea/Java2DGame.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..c2cf4bf --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/discord.xml b/.idea/discord.xml new file mode 100644 index 0000000..cd711a0 --- /dev/null +++ b/.idea/discord.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..c2bae49 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..c8a1523 --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/2DGame.xml b/.idea/libraries/2DGame.xml new file mode 100644 index 0000000..6866d02 --- /dev/null +++ b/.idea/libraries/2DGame.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..0f9e86a --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/2DGame.iml b/2DGame.iml new file mode 100644 index 0000000..78b2cc5 --- /dev/null +++ b/2DGame.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/2DGame.zip b/2DGame.zip deleted file mode 100644 index 0e7bf77ec9ab15a3651850bea9e6746ed3cfcc6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30640 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 tD8NC^LLXp+m + + 4.0.0 + + org.example + 2DGame + 1.0-SNAPSHOT + + + 14 + 14 + + + + org.junit.jupiter + junit-jupiter-api + 5.6.1 + test + + + org.junit.jupiter + junit-jupiter-engine + 5.6.1 + test + + + + + \ No newline at end of file diff --git a/src/main/java/BasicEx.java b/src/main/java/BasicEx.java new file mode 100644 index 0000000..eaca85b --- /dev/null +++ b/src/main/java/BasicEx.java @@ -0,0 +1,47 @@ +import core.Master; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; + +class BasicEx extends JFrame { + + Master master; + Timer timer; + + public BasicEx() { + initUI(); + timer = new Timer(1000/60, e -> { + master.refresh(); + }); + timer.start(); + } + + private void initUI() { + + master = new Master(); + add(master); + + setTitle("Points"); + setSize(1600, 900); + setLocationRelativeTo(null); + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + addMouseListener(new MouseAdapter() { + @Override + public void mousePressed(MouseEvent e) { + master.mousePressed(); + } + }); + } + + public static void main(String[] args) { + + EventQueue.invokeLater(() -> { + + BasicEx ex = new BasicEx(); + ex.setVisible(true); + }); + } +} \ No newline at end of file diff --git a/src/main/java/core/Master.java b/src/main/java/core/Master.java new file mode 100644 index 0000000..f739bd8 --- /dev/null +++ b/src/main/java/core/Master.java @@ -0,0 +1,123 @@ +package core; + +import objects.DebugPos; +import objects.ships.BattleShip; +import objects.GameObject; +import objects.world.Grid; + +import javax.swing.*; +import java.awt.*; +import java.util.ArrayList; + +/** + * The main object that controls everything + */ +public class Master extends JPanel { + + /** + * All GameObjects that exist + */ + private final ArrayList objects; + + /** + * Stores all GameObjects that were created during a frame + */ + private final ArrayList objectBuffer; + + private boolean mousePressed = false; + + /** + * Create a new master object + */ + public Master() { + objects = new ArrayList<>(); + objectBuffer = new ArrayList<>(); + + objects.add(new Grid()); + + + BattleShip battleShip = new BattleShip(Color.DARK_GRAY); + BattleShip bs = new BattleShip(70, 10, 5, 80, Color.GREEN); + /*for (int i = 0; i < 10; i++) { + bs.addTurret(new Turret(bs, 25, 10 * i + 1, 50, i % 5)); + }*/ + objects.add(bs); + objects.add(battleShip); + } + + /** + * The mein drawing method, handles everything about drawing + * @param g + */ + private void doDrawing(Graphics g) { + + //TODO w/h fields + int w, h; + if (getWidth() * 9 > getHeight() * 16) { + h = getHeight(); + w = h / 9 * 16; + } else { + w = getWidth(); + h = w / 16 * 9; + } + + Graphics2D g2d = (Graphics2D) g.create(); + + objects.forEach(o -> o.draw(g2d, w, this)); + } + + + @Override + public void paintComponent(Graphics g) { + super.paintComponent(g); + doDrawing(g); + } + + /** + * Debug a position, creates a green dot at the position + * @param pos + */ + public void debugPos(Vector2D pos){ + create(new DebugPos(pos, new Vector2D(10, 10))); + } + + /** + * Call this method when the user pressed the left mouse button + */ + public void mousePressed() { + mousePressed = true; + } + + /** + * This method is the entry method for each frame. It handles everything about the frame + */ + public void refresh() { + objects.addAll(objectBuffer); + objectBuffer.clear(); + objects.forEach(t -> t.update(this)); + mousePressed = false; + repaint(); + } + + /** + * Get the current location of the mouse relative to the frame + * @return The location of the mouse, already normalized + */ + public Point getMouseLocation() { + Point p = MouseInfo.getPointerInfo().getLocation(); + SwingUtilities.convertPointFromScreen(p, this); + return p; + } + + public boolean isMousePressed() { + return mousePressed; + } + + /** + * This method has to be called for every newly created GameObject + * @param obj + */ + public void create(GameObject obj) { + objectBuffer.add(obj); + } +} diff --git a/src/main/java/core/Vector2D.java b/src/main/java/core/Vector2D.java new file mode 100644 index 0000000..26167fc --- /dev/null +++ b/src/main/java/core/Vector2D.java @@ -0,0 +1,158 @@ +package core; + +/** + * A 2-dimensional Vector that can be used to store position or velocity + */ +public class Vector2D { + + public static final int CLOCKWISE = -1; + public static final int COUNTERCLOCKWISE = 1; + + /** + * The x and y values of the vector + */ + public double x, y; + + /** + * Create a new Vector2D object + * + * @param x the x value + * @param y the y value + */ + public Vector2D(double x, double y) { + this.x = x; + this.y = y; + } + + /** + * Create a new empty Vector2D object + */ + public Vector2D() { + x = 0; + y = 0; + } + + /** + * Add another Vector to this vector, modifies this object + * + * @param a The other Vector2D + * @return this after the addition + */ + public Vector2D add(Vector2D a) { + x += a.x; + y += a.y; + return this; + } + + /** + * Mulitply this vector with a simple scalar, modifies this object + * + * @param a The scalar + * @return this after the multiplication + */ + public Vector2D multiply(double a) { + x *= a; + y *= a; + return this; + } + + /** + * Get the magnitude of the vector + * + * @return The magnitude of this vector + */ + public double magnitude() { + return Math.sqrt(x * x + y * y); + } + + /** + * Get the normalized value of this vector, with magnitude 1, does not modify this object + * + * @return The normalized value + */ + public Vector2D normalized() { + double mag = magnitude(); + if (mag == 0) { + return new Vector2D(); + } else { + return new Vector2D(x / mag, y / mag); + } + } + + /** + * Get the negative value of this vector, does not modify this object + * + * @return The negative value + */ + public Vector2D negative() { + return new Vector2D(-x, -y); + } + + + /** + * Add two Vectors + * @param a Vector a + * @param b Vector b + * @return The result + */ + public static Vector2D add(Vector2D a, Vector2D b) { + return new Vector2D(a.x + b.x, a.y + b.y); + } + + /** + * Subtract two Vectors + * @param a Vector a + * @param b Vector b + * @return The result + */ + public static Vector2D subtract(Vector2D a, Vector2D b) { + return new Vector2D(a.x - b.x, a.y - b.y); + } + + /** + * Rotate a point around another point + * @param center The center of the rotation + * @param value The point to be rotated, absolut to the center + * @param rotation The rotation angle in radians + * @param rotationDirection The direction, -1 for clockwise, 1 for counterclockwise + * @return The rotated point + */ + public static Vector2D rotateAround(Vector2D center, Vector2D value, double rotation, int rotationDirection){ + + Vector2D dif = Vector2D.subtract(value, center); + + double rotatedX = Math.cos(rotation * rotationDirection) * dif.x; + double rotatedY = Math.sin(rotation * rotationDirection) * dif.x; + + return new Vector2D(rotatedX + center.x, rotatedY + center.y); + } + + public Vector2D copy(){ + return new Vector2D(x, y); + } + + @Override + public String toString() { + return "Vector2D{" + + "x=" + x + + ", y=" + y + + '}'; + } + + /** + * Overrides the equals method. True when the x and y values match + * + * @param o The other Vector + * @return True if both x and values are the same + */ + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Vector2D vector2D = (Vector2D) o; + + if (Double.compare(vector2D.x, x) != 0) return false; + return Double.compare(vector2D.y, y) == 0; + } +} \ No newline at end of file diff --git a/src/main/java/objects/DebugPos.java b/src/main/java/objects/DebugPos.java new file mode 100644 index 0000000..0a8c248 --- /dev/null +++ b/src/main/java/objects/DebugPos.java @@ -0,0 +1,26 @@ +package objects; + +import core.Master; +import core.Vector2D; + +import java.awt.*; + +/** + * A GameObject used for debugging + */ +public class DebugPos extends GameObject { + public DebugPos(Vector2D position, Vector2D size) { + super(position.copy(), size); + this.velocity = new Vector2D(); + } + + @Override + public void draw(Graphics2D g2d, int w, Master master) { + g2d.setPaint(Color.green); + g2d.drawOval((int) (position.x + size.x / 2), (int) (position.y + size.y / 2), (int) size.x, (int) size.y); + } + + @Override + public void update(Master master) { + } +} \ No newline at end of file diff --git a/src/main/java/objects/GameObject.java b/src/main/java/objects/GameObject.java new file mode 100644 index 0000000..fe7bb84 --- /dev/null +++ b/src/main/java/objects/GameObject.java @@ -0,0 +1,67 @@ +package objects; + +import core.Master; +import core.Vector2D; + +import java.awt.*; + +/** + * The GameObject class is the superclass of every GameObject that can be displayed on screen. It has the 2 + * {@link #update(Master)} and {@link #draw(Graphics2D, int, Master)} methods that have to be + */ +public abstract class GameObject { + + protected int w; + protected int h; + + protected Vector2D position; + protected Vector2D size; + + protected Vector2D velocity; + + public GameObject(double x, double y, double xSize, double ySize) { + this(new Vector2D(x, y), new Vector2D(xSize, ySize)); + } + + public GameObject(Vector2D position, Vector2D size) { + this.position = position; + this.size = size; + this.velocity = new Vector2D(); + } + + public abstract void draw(Graphics2D g2d, int w, Master master); + public abstract void update(Master master); + + + public double getMapCoords(double value, boolean isX){ + if (isX){ + return (position.x + value / 100 * size.x); + } else { + return (position.y + value / 100 * size.y); + } + } + + public double getMapCoordsSize(double value, boolean useX){ + if (useX){ + return (value / 100 * size.x); + } else { + return (value / 100 * size.y); + } + } + + public double getWorldCoords(double value, boolean isX){ + if (isX){ + return (value / 100 * w); + } else { + return (value / 100 * h); + } + } + + public int getWorldCoordsFromLocal(double value, boolean isX){ + return (int) getWorldCoords(getMapCoords(value, isX), isX); + } + + public int getWorldCoordsFromLocalSize(double value, boolean useX){ + return (int) getWorldCoords(getMapCoordsSize(value, useX), useX); + } +} diff --git a/src/main/java/objects/ships/BattleShip.java b/src/main/java/objects/ships/BattleShip.java new file mode 100644 index 0000000..16b0eef --- /dev/null +++ b/src/main/java/objects/ships/BattleShip.java @@ -0,0 +1,54 @@ +package objects.ships; + +import core.Master; +import objects.GameObject; + +import java.awt.*; +import java.util.ArrayList; + +/** + * A Battleship that can have several turrets + */ +public class BattleShip extends GameObject { + + private Color mainColor; + private ArrayList turrets; + + public BattleShip(Color mainColor) { + super(20, 20, 5, 40); + turrets = new ArrayList<>(); + turrets.add(new Turret(this, 25, 25, 50, 1)); + //turrets.add(new Turret(this, 25, 10, 50, 2)); + //turrets.add(new Turret(this, 25, 70, 50, 2)); + this.mainColor = mainColor; + } + + public BattleShip(double x, double y, double xSize, double ySize, Color mainColor) { + super(x, y, xSize, ySize); + turrets = new ArrayList<>(); + this.mainColor = mainColor; + } + + @Override + public void draw(Graphics2D g2d, int w, Master master) { + this.w = w; + h = w/16*9; + g2d.setPaint(mainColor); + int xAbs = (int) getWorldCoords(position.x, true); + int yAbs = (int) getWorldCoords(position.y, false); + int sizeXAbs = (int) getWorldCoords(size.x, true); + int sizeYAbs = (int) getWorldCoords(size.y, false); + g2d.fillRoundRect(xAbs, yAbs, sizeXAbs, sizeYAbs, w/10, w/10); + + turrets.forEach((turret -> turret.draw(g2d, w, master))); + } + + @Override + public void update(Master master) { + turrets.forEach((turret -> turret.update(master))); + } + + public void addTurret(Turret turret){ + turrets.add(turret); + } +} \ No newline at end of file diff --git a/src/main/java/objects/ships/Shell.java b/src/main/java/objects/ships/Shell.java new file mode 100644 index 0000000..938c54b --- /dev/null +++ b/src/main/java/objects/ships/Shell.java @@ -0,0 +1,27 @@ +package objects.ships; + +import core.Master; +import core.Vector2D; +import objects.GameObject; + +import java.awt.*; + +public class Shell extends GameObject { + + + public Shell(Vector2D position, Vector2D size, Vector2D velocity) { + super(position, size); + this.velocity = velocity; + } + + @Override + public void draw(Graphics2D g2d, int w, Master master) { + g2d.setPaint(Color.orange); + g2d.fillOval((int) position.x, (int) position.y, (int) size.x, (int) size.y); + } + + @Override + public void update(Master master) { + position.add(velocity); + } +} diff --git a/src/main/java/objects/ships/Turret.java b/src/main/java/objects/ships/Turret.java new file mode 100644 index 0000000..35b68c4 --- /dev/null +++ b/src/main/java/objects/ships/Turret.java @@ -0,0 +1,103 @@ +package objects.ships; + +import core.Master; +import core.Vector2D; +import objects.GameObject; + +import java.awt.*; + +/** + * A Turret that can shoot projectiles + */ +public class Turret extends GameObject { + + BattleShip battleShip; + + private int barrelAmount = 3; + + private Color mainColor; + + private long lastShot = 0; + private static int SHOT_EFFECT_TIME = 300; + private static int SHELL_SPEED = 10; + private double rotation; + + public Turret(BattleShip battleShip, double x, double y, double size, int barrelAmount) { + super(x, y, size, size); + this.battleShip = battleShip; + this.barrelAmount = barrelAmount; + mainColor = Color.GRAY; + } + + public Turret(BattleShip battleShip) { + super(25, 50, 50, 50); + this.battleShip = battleShip; + mainColor = Color.GRAY; + } + + @Override + public void draw(Graphics2D g2d, int w, Master master) { + //TODO draw should be draw only for better everything + h = w / 16 * 9; + g2d.setPaint(mainColor); + int xAbs = battleShip.getWorldCoordsFromLocal(position.x, true); + int yAbs = battleShip.getWorldCoordsFromLocal(position.y, false); + int sizeAbs = battleShip.getWorldCoordsFromLocalSize(size.x, true); + int xCenterAbs = xAbs + sizeAbs / 2; + int yCenterAbs = yAbs + sizeAbs / 2; + + g2d.fillOval(xAbs, yAbs, sizeAbs, sizeAbs); + + g2d.setStroke(new BasicStroke(battleShip.getWorldCoordsFromLocalSize(10, true), BasicStroke.CAP_BUTT, + BasicStroke.JOIN_BEVEL)); + + //BARRELS--------------------------------------- + + g2d.setPaint(Color.BLACK); + int barrelSpacing = sizeAbs / (barrelAmount + 1); + g2d.rotate(rotation, xCenterAbs, yCenterAbs); + for (int i = 0; i < barrelAmount; i++) { + int barrelX = xAbs + (i + 1) * barrelSpacing; + int frontPosY = yAbs - sizeAbs / 2; + g2d.drawLine(barrelX, yCenterAbs, barrelX, frontPosY); + + if (lastShot + SHOT_EFFECT_TIME > System.currentTimeMillis()) { + g2d.setPaint(Color.YELLOW); + g2d.fillOval(barrelX - 5, frontPosY - 5, 10, 10); + g2d.setPaint(Color.BLACK); + } + } + g2d.rotate(-rotation, xCenterAbs, yCenterAbs); + } + + @Override + public void update(Master master) { + + int xAbs = battleShip.getWorldCoordsFromLocal(position.x, true); + int yAbs = battleShip.getWorldCoordsFromLocal(position.y, false); + int sizeAbs = battleShip.getWorldCoordsFromLocalSize(size.x, true); + int xCenterAbs = xAbs + sizeAbs / 2; + int yCenterAbs = yAbs + sizeAbs / 2; + + Point msLoc = master.getMouseLocation(); + rotation = -Math.atan2(xCenterAbs - msLoc.x, yCenterAbs - msLoc.y); + + int barrelSpacing = sizeAbs / (barrelAmount + 1); + + for (int i = 0; i < barrelAmount; i++) { + int barrelX = xAbs + (i + 1) * barrelSpacing; + int frontPosY = yAbs - sizeAbs / 2; + + if (master.isMousePressed()) { + lastShot = System.currentTimeMillis(); + + Vector2D shellVel = new Vector2D(xCenterAbs - msLoc.x, yCenterAbs - msLoc.y).normalized().negative().multiply(SHELL_SPEED); + Vector2D pos = Vector2D.rotateAround(new Vector2D(xCenterAbs, yCenterAbs), new Vector2D(barrelX, frontPosY), rotation, Vector2D.CLOCKWISE); + + master.debugPos(pos); + + master.create(new Shell(pos, new Vector2D(10, 10), shellVel)); + } + } + } +} diff --git a/src/main/java/objects/world/Grid.java b/src/main/java/objects/world/Grid.java new file mode 100644 index 0000000..083ad96 --- /dev/null +++ b/src/main/java/objects/world/Grid.java @@ -0,0 +1,47 @@ +package objects.world; + +import core.Master; +import objects.GameObject; + +import java.awt.*; + +/** + * A basic background grid + */ +public class Grid extends GameObject { + + private int gridSpacing = 50; + + public Grid() { + super(0, 0, 0, 0); + } + + @Override + public void draw(Graphics2D g2d, int w, Master master) { + g2d.setPaint(Color.LIGHT_GRAY); + + this.w = w; + h = w/16*9; + + g2d.drawRect(0, 0, w, h); + + int verticalLines = w / gridSpacing; + int horizontalLines = h / gridSpacing; + + for (int i = 0; i < horizontalLines; i++) { + int y = i * h / horizontalLines; + g2d.drawLine(0, y, w, y); + } + + for (int i = 0; i < verticalLines; i++) { + int x = i * w / verticalLines; + g2d.drawLine(x, 0, x, h); + } + + } + + @Override + public void update(Master master) { + + } +} diff --git a/src/test/java/core/Vector2DTest.java b/src/test/java/core/Vector2DTest.java new file mode 100644 index 0000000..e8a20a8 --- /dev/null +++ b/src/test/java/core/Vector2DTest.java @@ -0,0 +1,60 @@ +package core; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class Vector2DTest { + + + @Test + void addOK() { + Vector2D a = new Vector2D(1, 2); + Vector2D b = new Vector2D(1, 2); + Vector2D c = new Vector2D(-1 ,-1); + Vector2D d = new Vector2D(0, 1); + + assertEquals(new Vector2D(2, 4), Vector2D.add(a, b)); + assertEquals(new Vector2D(0, 1), Vector2D.add(a, c)); + assertEquals(new Vector2D(-1, 0), Vector2D.add(c, d)); + } + + @Test + void normalized() { + Vector2D a = new Vector2D(1, 1); + Vector2D b = new Vector2D(1, 0); + + assertEquals(new Vector2D(1 / Math.sqrt(2), 1 / Math.sqrt(2)), a.normalized()); + assertEquals(new Vector2D(1,0), b.normalized()); + } + + @Test + void subtractOK() { + Vector2D a = new Vector2D(1, 2); + Vector2D b = new Vector2D(1, 2); + Vector2D c = new Vector2D(-1 ,-1); + Vector2D d = new Vector2D(0, 1); + + assertEquals(new Vector2D(0, 0), Vector2D.subtract(a, b)); + assertEquals(new Vector2D(2, 3), Vector2D.subtract(a, c)); + assertEquals(new Vector2D(-1, -2), Vector2D.subtract(c, d)); + } + + @Test + void rotateAroundTest(){ + Vector2D cent = new Vector2D(0, 0); + Vector2D a = new Vector2D(1, 0); + Vector2D exceptedA = new Vector2D(6.123233995736766E-17 ,-1); //floating point precision probably + + Vector2D centB = new Vector2D(1, 1); + Vector2D b = new Vector2D(2, 1); + Vector2D exceptedB = new Vector2D(1 ,2); + + + Vector2D rotated = Vector2D.rotateAround(cent, a, Math.toRadians(90), Vector2D.CLOCKWISE); + Vector2D rotatedb = Vector2D.rotateAround(centB, b, Math.toRadians(90), Vector2D.COUNTERCLOCKWISE); + + assertEquals(exceptedA, rotated); + assertEquals(exceptedB, rotatedb); + } +} \ No newline at end of file diff --git a/target/classes/BasicEx$1.class b/target/classes/BasicEx$1.class new file mode 100644 index 0000000000000000000000000000000000000000..fd3f4b91be4be388cc75c6af3a78569475cf0c10 GIT binary patch literal 660 zcmX^0Z`VEs1_mnz4Ne9o24;2!79Ivx1~x_pPN&4;%w*RJ6+=b_wvvp@Vif~M22LNS zs5KV@2LmTN0~ZeiHv%Gw%o*GuyS6X{YrC_Qj0{i zEiUoMFD_wZ;PK4MOD%HFNh~f-EoM+)U}E54U|?Vr5CFv&0|NsS0|Ns$g9HO3gCqk3 zgB=4CScFSUdn*H@)^-N=jbJrW3=9lx42%p64Dt-p3=9ln5LFB^46+O$zy&sqk%5sx zoIwt1mNNq*SQWR{76!&G47}SIgb{{ufu)ofxEPd?4CICz$ju`hfK6CzhA!r)FMPcpc(`T2xd@}`0+6KGXyX)a22PPgk=_ICV?V_MI#ENM1~=V zhani0h}er#(~44yGZ-0Iobyvs85#I}GV@aXN^_G^i$XwdV`LBl#Y0Y5Vo@fD4;5r7 z$;d2bWZ;D72u22$+{8?<7o)L7JR<{3Vo`cABZDv&X+{R#oW$IultdMf87hX13{0sN zj0`+b!MxOR6$3^Fd5i#uh%#2;W~(CmXGf}$~`vLF>%Iq{MZEAi_^PO(svofC6%f-_4}tpyko_}Li> zKCfH;E$0|Nsq10$%~U|?hjVPIg01@jpgl(n`q zFludMVAtBsz!NDTptXyEkAY!3gV0t6QLQZuqT3iGH-e1|Wnf?sV_;=qVBlq7Vc=un zVBlwvW)NafVi0BsV_;z5VPIrnU{GcVXNUl+=VoAoTGhzF0+zGZ+RY#nxt&37D}%h2 z))of&Z4AocT0-jE7&Ns6*&GC!TedOiYB6qOFw|n(#$c+oo53L{6OC=LFt2mfuWqClA)SG5&-JV_*?)0 literal 0 HcmV?d00001 diff --git a/target/classes/core/Master.class b/target/classes/core/Master.class new file mode 100644 index 0000000000000000000000000000000000000000..a5ff27c1956209275bdffcecc9e303706a15ef95 GIT binary patch literal 3807 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 literal 0 HcmV?d00001 diff --git a/target/classes/objects/DebugPos.class b/target/classes/objects/DebugPos.class new file mode 100644 index 0000000000000000000000000000000000000000..3994bf61168ea2971bf61c17edd0f43ea655d369 GIT binary patch literal 1055 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 GgCqcOj-99g literal 0 HcmV?d00001 diff --git a/target/classes/objects/ships/Shell.class b/target/classes/objects/ships/Shell.class new file mode 100644 index 0000000000000000000000000000000000000000..3f2a3614a182e324aae5ef5c823c9e34cbc1425a GIT binary patch literal 1092 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 literal 0 HcmV?d00001 diff --git a/target/classes/objects/world/Grid.class b/target/classes/objects/world/Grid.class new file mode 100644 index 0000000000000000000000000000000000000000..52de6aa21f5ded208cf5c380970833aade01ffcf GIT binary patch literal 1157 zcmX^0Z`VEs1_mnz8!iSW24;2!79Ivx1~x_pq5Pz*)Z~(4efPxNRDUp=k%7%7GcU8m zj*)>~!^OqLMKg?(frEjQoq>yoft!H`NmF@#QBI1!dr@WzBLjDOQD#bTL1J=dUOFQK zqbDZ=9|J!-g8&bMAcGJi17B8RS)zVod5OMreolT7BLkO@r@Kc;ynB#iBqM`>52~~^ z7lR0cC_94~4}&;^1S5kmT-v=Tu^=Nex!A~sk%6N)wIm=hGp~e^L0AJ}0$9iz;%X@# z25FF!8OuR_kmX^J1M@OK<}2_pC^9H9GH|36C6))JCYOLb?CI(0sTl^6R^ee#g-iQn z=A|++Fl%UrF*2|?=clAHGVp`M{7Q3^Qj0EX3faJ0tYBnd zPB%(nWDrGo97!i516wXw7b62NiXn^)yk)6HC7H>IIUx5JGcxdJ!^aMR49pA+3<3-s47?0{41x@r3=9lB5G@Q^4BB9$br^IZ#xaI5urhEkFfcS}Z(`ux z#vrUEvz0+oOGZE-M}RY9D}#(SGqa4=76zGZ4DukFJ;#g%#MRouz@B5q%526a$|lOX zh(TVI4J4c)%9>-wuFWjUE+fjmjX}AEjdA(^2M|>(U{x|1qAVaKqU_9~>>w?0RUjWQ zgMDDfz|X+IAj-hbAkM(UAi*HcAjP1>Aj6==Aj@FNAkSdWpuphGpvVx)AkPrZpu&*K zpvsWPpvF+mpu*6|pb7SI8Uq)DHv<=g9s>^pJA(y-GJ`$?4+9%R9s@6f0az>!F2=yn z1PvJw%aFkc99m7F3;>RbCI({$69#4mErtjNQwAOe76wxWUj{PVqj0~f$;{6yW@O+=1an*qOA~X785z_ye9%2F7ZAji%i&%>a=pvcI;htTAkSdziWz*1aTRKm!>qT!HRpa!P<*%{P%7&Jg3z)@V9R8o|fT*BtS0SO{x;IF<3i9`8^~xL^SbvPl3rSU?IG8Ca52^GX;QI8!TLqpEEt%; zF~-Wk0LoPij0{!`3=H}Vj0}t*5v}bEj2jsk7?>EW85kJYz=G@yHVh05JYY5}gDry{ z*Z_M5HU=iJ=35MG3?Sojb~CU?@{2HVZfD^3L1O!Y*dh#kA`E=n8MysGJU;&I4BS>M zAf^ZdrwD_2;VhCptX2@m`0lVJ>;zp?Zc^DEH92guK7#SoOLKvJF92uAx)EL|t zoEaP$m>CQitQlMw92r;`T%n=h2KKWG+|LskI2f227#N&EuH^^$2I6CoBf{L>t2OR96s8NGD9UNbpAn)kzU_c1+i7;qyXW#}$5J(i^ zD@X(>GVm}cF-R~dGpI4BFc>nZF*q@(GlVl}Fyu05f_(^ypggD#c^HzQK9pbxgZfa7 z!2=#awpb&`1LkW+Q3f^!P6h^sVvw)Fo8580vWu(=~S1&jlmn7POTU$!GXle;Lf1K;KSg^z{U{DAjja#;K;zvkjlWv;K$&| Pz=4vU85#V+IXwUXJXT>% literal 0 HcmV?d00001