From adb8e185fbbd156d79766f202e3cfe3f8708479b Mon Sep 17 00:00:00 2001 From: Nilstrieb Date: Sun, 13 Dec 2020 12:07:30 +0100 Subject: [PATCH] moved lots of code around --- src/main/java/core/Coords.java | 50 ++++++++++ src/main/java/core/Drawable.java | 1 + src/main/java/core/Master.java | 54 ++++++++-- src/main/java/core/math/Vector2D.java | 28 +++--- src/main/java/core/physics/Collision.java | 27 +++++ src/main/java/core/physics/RectHitBox.java | 31 +++++- src/main/java/objects/DebugPos.java | 2 +- src/main/java/objects/GameObject.java | 92 +++++++----------- src/main/java/objects/ships/BattleShip.java | 4 +- src/main/java/objects/ships/Shell.java | 2 +- src/main/java/objects/ships/Submarine.java | 7 +- src/main/java/objects/ships/Turret.java | 36 ++++--- src/main/java/objects/world/Grid.java | 2 +- src/main/java/objects/world/Wall.java | 2 +- target/classes/core/Master.class | Bin 5933 -> 6149 bytes target/classes/objects/DebugPos.class | Bin 1080 -> 1051 bytes target/classes/objects/GameObject.class | Bin 3677 -> 3214 bytes target/classes/objects/ships/BattleShip.class | Bin 2526 -> 2342 bytes target/classes/objects/ships/Shell.class | Bin 1137 -> 1114 bytes target/classes/objects/ships/Turret.class | Bin 3653 -> 3653 bytes target/classes/objects/world/Grid.class | Bin 1157 -> 1128 bytes 21 files changed, 230 insertions(+), 108 deletions(-) create mode 100644 src/main/java/core/Coords.java create mode 100644 src/main/java/core/physics/Collision.java diff --git a/src/main/java/core/Coords.java b/src/main/java/core/Coords.java new file mode 100644 index 0000000..6d77a44 --- /dev/null +++ b/src/main/java/core/Coords.java @@ -0,0 +1,50 @@ +package core; + +import core.math.Vector2D; + +/** + * This class provides everything about the local coordinate system the game uses + *

In this system, the screen is always 100 high and 100 * the screen ration wide. + * This class is the used to convert these coordinates into the true Java 2D coordinates for the drawing

+ */ +//TODO make this return a vector2d instead of the isX +public class Coords { + + /** + * This utility class should not be instantiated + */ + private Coords() { + } + + /** + * The master object used to get the screen size + */ + public static Master master = Master.getMaster(); + + + public static Vector2D getWorldCoords(Vector2D value) { + double x = (value.x / (Master.SCREEN_Y_COORDINATES * Master.SCREEN_RATIO) * master.getW()); + double y = (value.y / Master.SCREEN_Y_COORDINATES * master.getH()); + return new Vector2D(x, y); + } + + /** + * Get local map coordinates (h=100) from the absolute Java 2D coordinates + * + * @param value The Vector2D position in Java 2D coordinates + * @return The Vector2D position in map coordinates + */ + public static Vector2D getMapCoordsFromWorld(Vector2D value) { + double x = (value.x / master.getW()) * Master.SCREEN_Y_COORDINATES * Master.SCREEN_RATIO; + double y = (value.y / master.getH()) * Master.SCREEN_Y_COORDINATES; + return new Vector2D(x, y); + } + + public static Vector2D getWorldCoordsSize(Vector2D value) { + //TODO h not w + double x = (value.x / Master.SCREEN_Y_COORDINATES * master.getW()); + double y = (value.y / Master.SCREEN_Y_COORDINATES * master.getH()); + return new Vector2D(x, y); + } + +} diff --git a/src/main/java/core/Drawable.java b/src/main/java/core/Drawable.java index 97e36e3..ddef1bf 100644 --- a/src/main/java/core/Drawable.java +++ b/src/main/java/core/Drawable.java @@ -3,6 +3,7 @@ package core; import java.awt.*; public interface Drawable { + /** *

The draw method is called every frame after the update by the master object on each object. Everything * about drawing should be handled here in this method.

diff --git a/src/main/java/core/Master.java b/src/main/java/core/Master.java index 596e1fb..22203db 100644 --- a/src/main/java/core/Master.java +++ b/src/main/java/core/Master.java @@ -14,8 +14,6 @@ import java.awt.*; import java.util.ArrayList; import java.util.concurrent.atomic.AtomicBoolean; -//TODO master better accessible or something - /** * The main object that controls everything */ @@ -31,8 +29,10 @@ public class Master extends JPanel { */ public static final double SCREEN_Y_COORDINATES = 100d; - @Deprecated - public static final double SCREEN_X_COORDINATES = 100d * SCREEN_RATIO; + /** + * The master object + */ + private static Master master; /** * All GameObjects that exist @@ -54,12 +54,22 @@ public class Master extends JPanel { */ private final ArrayList objectBuffer; + /** + * Whether the left mouse button has been pressed since the last frame + */ private boolean mousePressed = false; + /** + * The current width and height of the game area + */ + private int w,h; + /** * Create a new master object */ public Master() { + master = this; + objects = new ArrayList<>(); objectBuffer = new ArrayList<>(); collidables = new ArrayList<>(); @@ -80,6 +90,10 @@ public class Master extends JPanel { create(new Wall(20, 80, 50, 2)); } + public static Master getMaster() { + return master; + } + /** * The mein drawing method, handles everything about drawing * @@ -87,7 +101,6 @@ public class Master extends JPanel { */ private void doDrawing(Graphics g) { - int w, h; if (getWidth() * 9 > getHeight() * 16) { h = getHeight(); w = h / 9 * 16; @@ -111,7 +124,7 @@ public class Master extends JPanel { /** * Debug a position, creates a green dot at the position * - * @param pos + * @param pos The position */ public void debugPos(Vector2D pos) { create(new DebugPos(pos, new Vector2D(10, 10))); @@ -130,7 +143,7 @@ public class Master extends JPanel { public void refresh() { objects.addAll(objectBuffer); objectBuffer.clear(); - objects.forEach(t -> t.update(this)); + objects.forEach(GameObject::update); mousePressed = false; repaint(); } @@ -164,10 +177,19 @@ public class Master extends JPanel { } - public void addDrawable(Drawable d){ + public void addDrawable(Drawable d) { drawables.add(d); } + + /** + * Check whether a collidables collide with another one + * + * @param col The collidable to be checked + * @return True if it collides with something, false if it doesn't - Should return a Collision + */ + @Deprecated + //TODO make it return a Collision public boolean doesCollide(Collidable col) { boolean collides = false; @@ -187,4 +209,20 @@ public class Master extends JPanel { } return collides; } + + public int getW() { + return w; + } + + public int getH() { + return h; + } + + public void destroy(GameObject gameObject) { + objects.remove(gameObject); + drawables.remove(gameObject); + if(gameObject instanceof Collidable){ + collidables.remove(gameObject); + } + } } diff --git a/src/main/java/core/math/Vector2D.java b/src/main/java/core/math/Vector2D.java index c5bfe7a..c5e4398 100644 --- a/src/main/java/core/math/Vector2D.java +++ b/src/main/java/core/math/Vector2D.java @@ -92,6 +92,7 @@ public class Vector2D { /** * Add two Vectors + * * @param a Vector a * @param b Vector b * @return The result @@ -102,6 +103,7 @@ public class Vector2D { /** * Subtract two Vectors + * * @param a Vector a * @param b Vector b * @return The result @@ -112,16 +114,16 @@ public class Vector2D { /** * Rotate a point around another point - * + *

* This method can now be trusted * - * @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 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){ + public static Vector2D rotateAround(Vector2D center, Vector2D value, double rotation, int rotationDirection) { Vector2D dif = Vector2D.subtract(value, center); @@ -135,29 +137,30 @@ public class Vector2D { /** * Rotate a point around another point - * + *

* This method can now be trusted * - * @param center The center of the rotation - * @param value The point to be rotated, absolut to the center + * @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 * @return The rotated point */ - public static Vector2D rotateAround(Vector2D center, Vector2D value, double rotation){ + public static Vector2D rotateAround(Vector2D center, Vector2D value, double rotation) { return rotateAround(center, value, rotation, COUNTERCLOCKWISE); } /** * Get a unit vector with magnitude 1 and the direction + * * @param direction The direction of the vector * @return The unit vector */ - public static Vector2D getUnitVector(double direction){ + public static Vector2D getUnitVector(double direction) { return rotateAround(new Vector2D(), new Vector2D(0, 1), direction); } - public static double distance(Vector2D a, Vector2D b){ + public static double distance(Vector2D a, Vector2D b) { Vector2D dif = subtract(a, b); return Math.sqrt(dif.x * dif.x + dif.y + dif.y); } @@ -165,9 +168,10 @@ public class Vector2D { /** * Copy this object + * * @return A copy of this object */ - public Vector2D copy(){ + public Vector2D copy() { return new Vector2D(x, y); } diff --git a/src/main/java/core/physics/Collision.java b/src/main/java/core/physics/Collision.java new file mode 100644 index 0000000..ecf23a9 --- /dev/null +++ b/src/main/java/core/physics/Collision.java @@ -0,0 +1,27 @@ +package core.physics; + +public class Collision { + + Collidable a; + Collidable b; + + boolean haveCollided; + + public Collision(Collidable a, Collidable b, boolean haveCollided) { + this.a = a; + this.b = b; + this.haveCollided = haveCollided; + } + + public Collidable getA() { + return a; + } + + public Collidable getB() { + return b; + } + + public boolean isHaveCollided() { + return haveCollided; + } +} diff --git a/src/main/java/core/physics/RectHitBox.java b/src/main/java/core/physics/RectHitBox.java index b295090..0b4cc14 100644 --- a/src/main/java/core/physics/RectHitBox.java +++ b/src/main/java/core/physics/RectHitBox.java @@ -10,6 +10,8 @@ import java.awt.*; */ public class RectHitBox extends Hitbox { + int w,h; + /** * The corners of the rectangle like this: *

x1 x2

@@ -148,7 +150,32 @@ public class RectHitBox extends Hitbox { @Override public void draw(Graphics2D g2d, int w, Master master) { - g2d.setPaint(Color.BLUE); - g2d.fillRect((int) x1.y, (int) x1.y, (int) (x2.x - x1.x), (int) (y1.y - x1.y)); + + this.w = w; + int h = (int) (w / Master.SCREEN_RATIO); + int xAbs = (int) getWorldCoords(x1.x, true); + int yAbs = (int) getWorldCoords(x1.y, false); + int sizeXAbs = (int) getWorldCoordsSize(x2.x - x1.x, true); + int sizeYAbs = (int) getWorldCoordsSize(y1.y - x1.y, false); + + g2d.fillRect(xAbs, yAbs, sizeXAbs, sizeYAbs); + g2d.setPaint(Color.MAGENTA); + } + + + public double getWorldCoords(double value, boolean isX) { + if (isX) { + return (value / (Master.SCREEN_Y_COORDINATES * Master.SCREEN_RATIO) * w); + } else { + return (value / Master.SCREEN_Y_COORDINATES * h); + } + } + + public double getWorldCoordsSize(double value, boolean isX) { + if (isX) { + return (value / Master.SCREEN_Y_COORDINATES * w); + } else { + return (value / Master.SCREEN_Y_COORDINATES * h); + } } } diff --git a/src/main/java/objects/DebugPos.java b/src/main/java/objects/DebugPos.java index 4591fb2..e731685 100644 --- a/src/main/java/objects/DebugPos.java +++ b/src/main/java/objects/DebugPos.java @@ -21,6 +21,6 @@ public class DebugPos extends GameObject { } @Override - public void update(Master master) { + public void update() { } } \ No newline at end of file diff --git a/src/main/java/objects/GameObject.java b/src/main/java/objects/GameObject.java index 1d5a402..b6420f6 100644 --- a/src/main/java/objects/GameObject.java +++ b/src/main/java/objects/GameObject.java @@ -1,5 +1,6 @@ package objects; +import core.Coords; import core.Drawable; import core.Master; import core.math.Vector2D; @@ -9,7 +10,7 @@ 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 + * {@link #update()} and {@link #draw(Graphics2D, int, Master)} methods that have to be */ public abstract class GameObject implements Drawable { @@ -23,6 +24,8 @@ public abstract class GameObject implements Drawable { protected Color mainColor; + protected Master master; + public GameObject(double x, double y, double xSize, double ySize) { this(new Vector2D(x, y), new Vector2D(xSize, ySize)); } @@ -32,6 +35,7 @@ public abstract class GameObject implements Drawable { this.size = size; this.velocity = new Vector2D(); mainColor = Color.BLACK; + this.master = Master.getMaster(); } @@ -40,17 +44,15 @@ public abstract class GameObject implements Drawable { * that is needed for the game to work should be here in this method.

*

No drawing should be made in this method. The {@code debug} method can be called on the master.

*

This function is NOT intended to be called manually.

- * - * @param master The master object itself */ - public abstract void update(Master master); + public abstract void update(); /** * A simple method to move the object to a Vector2D. This method should be called instead of doing it manually. * * @param target The target position */ - public void moveTo(Vector2D target, Master master) { + public void moveTo(Vector2D target) { Vector2D oldPos = position; this.position = target; @@ -70,13 +72,11 @@ public abstract class GameObject implements Drawable { public void drawRect(Graphics2D g2d, int w) { this.w = w; h = (int) (this.w / Master.SCREEN_RATIO); - int xAbs = (int) getWorldCoords(position.x, true); - int yAbs = (int) getWorldCoords(position.y, false); - int sizeXAbs = (int) getWorldCoordsSize(size.x, true); - int sizeYAbs = (int) getWorldCoordsSize(size.y, false); + Vector2D abs = Coords.getWorldCoords(position); + Vector2D sizeAbs = Coords.getWorldCoordsSize(size); g2d.setPaint(mainColor); - g2d.fillRect(xAbs, yAbs, sizeXAbs, sizeYAbs); + g2d.fillRect((int) abs.x, (int) abs.y, (int) sizeAbs.x, (int) sizeAbs.y); } /** @@ -88,13 +88,11 @@ public abstract class GameObject implements Drawable { public void drawOval(Graphics2D g2d, int w) { this.w = w; h = (int) (this.w / Master.SCREEN_RATIO); - int xAbs = (int) getWorldCoords(position.x, true); - int yAbs = (int) getWorldCoords(position.y, false); - int sizeXAbs = (int) getWorldCoordsSize(size.x, true); - int sizeYAbs = (int) getWorldCoordsSize(size.y, false); + Vector2D abs = Coords.getWorldCoords(position); + Vector2D sizeAbs = Coords.getWorldCoordsSize(size); g2d.setPaint(mainColor); - g2d.fillOval(xAbs, yAbs, sizeXAbs, sizeYAbs); + g2d.fillOval((int) abs.x, (int) abs.y, (int) sizeAbs.x, (int) sizeAbs.y); } /** @@ -108,63 +106,41 @@ public abstract class GameObject implements Drawable { public void drawRoundRect(Graphics2D g2d, int w, int arcW, int arcH) { this.w = w; h = (int) (w / Master.SCREEN_RATIO); - int xAbs = (int) getWorldCoords(position.x, true); - int yAbs = (int) getWorldCoords(position.y, false); - int sizeXAbs = (int) getWorldCoordsSize(size.x, true); - int sizeYAbs = (int) getWorldCoordsSize(size.y, false); + Vector2D abs = Coords.getWorldCoords(position); + Vector2D sizeAbs = Coords.getWorldCoordsSize(size); g2d.setPaint(mainColor); - g2d.fillRoundRect(xAbs, yAbs, sizeXAbs, sizeYAbs, arcW, arcH); + g2d.fillRoundRect((int) abs.x, (int) abs.y, (int) sizeAbs.x, (int) sizeAbs.y, arcW, arcH); } - public double getWorldCoords(double value, boolean isX) { - if (isX) { - return (value / (Master.SCREEN_Y_COORDINATES * Master.SCREEN_RATIO) * w); - } else { - return (value / Master.SCREEN_Y_COORDINATES * h); - } + public void destroy() { + master.destroy(this); } - public Vector2D getMapCoordsFromWorld(Vector2D value){ - double x = (value.x / w) * Master.SCREEN_Y_COORDINATES * Master.SCREEN_RATIO; - double y = (value.y / h) * Master.SCREEN_Y_COORDINATES; + + public Vector2D getMapCoords(Vector2D value) { + double x = (position.x + value.x / 100d * size.x); + double y = (position.y + value.y / 100d * size.y); return new Vector2D(x, y); + } - public double getWorldCoordsSize(double value, boolean isX) { - if (isX) { - return (value / Master.SCREEN_Y_COORDINATES * w); - } else { - return (value / Master.SCREEN_Y_COORDINATES * h); - } + public Vector2D getMapCoordsSize(Vector2D value) { + double x = (value.x / 100d * size.x); + double y = (value.y / 100d * size.y); + return new Vector2D(x, y); + } - - public double getMapCoords(double value, boolean isX) { - if (isX) { - return (position.x + value / 100d * size.x); - } else { - return (position.y + value / 100d * size.y); - } + public Vector2D getWorldCoordsFromLocal(Vector2D value) { + return Coords.getWorldCoords(getMapCoords(value)); } - public double getMapCoordsSize(double value, boolean useX) { - if (useX) { - return (value / 100d * size.x); - } else { - return (value / 100d * size.y); - } + public Vector2D getWorldCoordsFromLocalSize(Vector2D value) { + return Coords.getWorldCoordsSize(getMapCoordsSize(value)); } - public int getWorldCoordsFromLocal(double value, boolean isX) { - return (int) getWorldCoords(getMapCoords(value, isX), isX); - } - - public int getWorldCoordsFromLocalSize(double value, boolean useX) { - return (int) getWorldCoordsSize(getMapCoordsSize(value, useX), useX); - } - - public Vector2D getCenterPosition(){ - return new Vector2D(position.x - size.x/2, position.y - size.y/2); + public Vector2D getCenterPosition() { + return new Vector2D(position.x - size.x / 2, position.y - size.y / 2); } } diff --git a/src/main/java/objects/ships/BattleShip.java b/src/main/java/objects/ships/BattleShip.java index cbcb6b2..55328d4 100644 --- a/src/main/java/objects/ships/BattleShip.java +++ b/src/main/java/objects/ships/BattleShip.java @@ -35,8 +35,8 @@ public class BattleShip extends GameObject { } @Override - public void update(Master master) { - turrets.forEach((turret -> turret.update(master))); + public void update() { + turrets.forEach(Turret::update); } public void addTurret(Turret turret){ diff --git a/src/main/java/objects/ships/Shell.java b/src/main/java/objects/ships/Shell.java index d6344c8..830f7a9 100644 --- a/src/main/java/objects/ships/Shell.java +++ b/src/main/java/objects/ships/Shell.java @@ -21,7 +21,7 @@ public class Shell extends GameObject { } @Override - public void update(Master master) { + public void update() { position.add(velocity); } } diff --git a/src/main/java/objects/ships/Submarine.java b/src/main/java/objects/ships/Submarine.java index 9db5194..80215a0 100644 --- a/src/main/java/objects/ships/Submarine.java +++ b/src/main/java/objects/ships/Submarine.java @@ -1,5 +1,6 @@ package objects.ships; +import core.Coords; import core.Master; import core.math.Vector2D; import core.physics.Collidable; @@ -26,11 +27,11 @@ public class Submarine extends GameObject implements Collidable { } @Override - public void update(Master master) { + public void update() { Point mouse = master.getMouseLocation(); - Vector2D relPos = getMapCoordsFromWorld(new Vector2D(mouse.x, mouse.y)); + Vector2D relPos = Coords.getMapCoordsFromWorld(new Vector2D(mouse.x, mouse.y)); Vector2D centerRelPos = new Vector2D(relPos.x - size.x/2, relPos.y - size.y/2); - moveTo(centerRelPos, master); + moveTo(centerRelPos); } @Override diff --git a/src/main/java/objects/ships/Turret.java b/src/main/java/objects/ships/Turret.java index 6db9e39..acd4d1c 100644 --- a/src/main/java/objects/ships/Turret.java +++ b/src/main/java/objects/ships/Turret.java @@ -45,26 +45,25 @@ public class Turret extends GameObject { public void draw(Graphics2D g2d, int w, Master master) { 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; + Vector2D abs = battleShip.getWorldCoordsFromLocal(position); + int sizeAbs = (int) battleShip.getWorldCoordsFromLocalSize(size).x; + int xCenterAbs = (int) (abs.x + sizeAbs / 2); + int yCenterAbs = (int) (abs.y + sizeAbs / 2); - g2d.fillOval(xAbs, yAbs, sizeAbs, sizeAbs); + g2d.fillOval((int) abs.x, (int) abs.y, (int) sizeAbs, (int) sizeAbs); - g2d.setStroke(new BasicStroke(battleShip.getWorldCoordsFromLocalSize(10, true), BasicStroke.CAP_BUTT, + g2d.setStroke(new BasicStroke((int) battleShip.getWorldCoordsFromLocalSize(new Vector2D(10, 0)).x, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL)); //BARRELS--------------------------------------- g2d.setPaint(Color.BLACK); - int barrelSpacing = sizeAbs / (barrelAmount + 1); + int barrelSpacing = (int) (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; + int barrelX = (int) (abs.x + (i + 1) * barrelSpacing); + int frontPosY = (int) (abs.y - sizeAbs / 2); g2d.drawLine(barrelX, yCenterAbs, barrelX, frontPosY); if (lastShot + SHOT_EFFECT_TIME > System.currentTimeMillis()) { @@ -79,13 +78,12 @@ public class Turret extends GameObject { } @Override - public void update(Master master) { + public void update() { - 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; + Vector2D abs = battleShip.getWorldCoordsFromLocal(position); + int sizeAbs = (int) battleShip.getWorldCoordsFromLocalSize(size).x; + int xCenterAbs = (int) (abs.x + sizeAbs / 2); + int yCenterAbs = (int) (abs.y + sizeAbs / 2); Point msLoc = master.getMouseLocation(); double targetRotation = -Math.atan2(xCenterAbs - msLoc.x, yCenterAbs - msLoc.y); @@ -93,11 +91,11 @@ public class Turret extends GameObject { rotation = ExMath.angleLerp(rotation, targetRotation, ROTATION_SPEED); - int barrelSpacing = sizeAbs / (barrelAmount + 1); + int barrelSpacing = (int) (sizeAbs / (barrelAmount + 1)); for (int i = 0; i < barrelAmount; i++) { - int barrelX = xAbs + (i + 1) * barrelSpacing; - int frontPosY = yAbs - sizeAbs / 2; + int barrelX = (int) (abs.x + (i + 1) * barrelSpacing); + int frontPosY = (int) (abs.y - sizeAbs / 2); if (master.isMousePressed()) { lastShot = System.currentTimeMillis(); diff --git a/src/main/java/objects/world/Grid.java b/src/main/java/objects/world/Grid.java index 083ad96..744a8bc 100644 --- a/src/main/java/objects/world/Grid.java +++ b/src/main/java/objects/world/Grid.java @@ -41,7 +41,7 @@ public class Grid extends GameObject { } @Override - public void update(Master master) { + public void update() { } } diff --git a/src/main/java/objects/world/Wall.java b/src/main/java/objects/world/Wall.java index 58c5ca5..fb0818f 100644 --- a/src/main/java/objects/world/Wall.java +++ b/src/main/java/objects/world/Wall.java @@ -24,7 +24,7 @@ public class Wall extends GameObject implements Collidable { } @Override - public void update(Master master) { + public void update() { } @Override diff --git a/target/classes/core/Master.class b/target/classes/core/Master.class index 8cfb839d823563e17b3c35a135511feee286b3d8..efeaa03c74dc6d001a557cf20aab246daa08a427 100644 GIT binary patch delta 3243 zcmZ3h*J{9Z>ff$?3=9lbjE)nz;?+1AI2ibN82A|k7#Y}d6N^hyix?SreUkHwQuTeo zTx)g)p@}&Xyn+nOAjP6Q3}Ou86DO*)p}}Ct!@$a5Ge0*QD}&Sx@U^qstb$*A6kArvGO#>l{~;o<^O#=#K5!w|_3 z#mK;so>~%~nNpI$$iS?j=?U^m3=cyrNQyH(wZtPeGd-gO6aeu&3<(U0j0}t!j0}vP zAdzGqh7_h{>t=Nqf z4lpwCb8$KQ`}imX_y-4jI{CPAF&ttz%+7Fxhv6v0vB|ycRvZf%PVg|CWH>eXJi8X# z86JkS4Cf~QXOHDr$Z&y&;UdGO$tfHL7P}a(@Gx9u*vH7goLW@G!El|CfdynP$lW)2 z7;Z5vU}Rt`O3lqLOXX&`!*G|K;T{jeeTD~JQ4MlN)#>7}X~Wa*9pfz!S))z{RM@sKm~w%)_X{ zsJfY-mxa+^}+f|tTn^<*%>vt7&sWUco-!ZB?TBc`B@otxft~r z_1PH>co+>C*e37fkP{JLQ0Hf3G~r@2Wi(@FH0NPB%V;q{w)npZZRTf)D2Gz+8 zyyBDl`PnCD^K-J;Gcw3Q1tjaa7&t)z!@$5G$?%-v83QB33kC)TCWe;`T%baVfq_8? zRQ@n9GQ0+hzhMvp6)JH4TLvLe;RENtV-NzBQgHqo1||k>1|G296oy1FodBi<85kK@ z>lxS>7#ZF(Ffht8a5FG7Ffc6F+RnhJ#k`e)U28J~uhwn`!N~0l!dn?c5KIXKQyRgP z)7s6T7`dH6c^iYuZU&9WO$=Jw84P?tOc4fS5e8Ec26GVx%S{Z{+ZpV9wRE;IsAy@| zgUHS53=9kk5YIDwVh~_pVDM*%VED}Ng@KVFjlq%OE5jECCI(K1 zZw%idfyE%hzz9yRESng3H!v_TFfxD~0t!k7hByW$Pyqy0xtoC*Y;w5PHimEk&J3+> z4ABAt8A}*sv_Q=ItqgHmT3Z<61UPd91TwZVBrRu<1j&SNWk>=^Bnb%Q2ykX>Wr)+> z#*lh|Akf$aEMRq85kJC8GbPQWME|QVBlx?#qgVfiQx|e0|N^Kla?q0BdAn` zdc~cAiGhiMfq`2~dpkpkmi9J=3XttgVB7h?zN}ziWvFD}VyFV!BnD9qu?eIRY7ryD zUxt4WL*p2N7`VX7q_lQ3R7Yw<5`d`)gDE%x)S|>RL}e3$BttWj1yXPeq!|7)f+B;F zfg6&pC%+XEuLng9L}w=hD?=ApCl5FR*`PWZ85tq!85kJS8JNIwnp#^JM6|XrNNi)M z3y086Afa6ht>A!%WRYzQ9f&ZHVqjxnV3@$b!!VISm|+rwJi}xL6^8mL3>pkmk!;n3 z+sec+4H66tUeK`R+riMijbWmXw$=`Y>Dr*Ag&e$d8Q2--F@UNLP?CiNFCWx2b_RAv zW=0kUMg~SkR)#fDbM+Y*>%rb()!M?qz6PFWAW3yGlB-yu<}iZVBv9SOP*z3! z88(5fgE(6aWZmRBB69Wb85kIxpcZkV7zXh=Bz#UjbFlc9bi zBZKx%hK-C2I~cZFvP!aOFJ-XU#IRFn|2Bq$n;3S2)EoyZInKzii{UgV@()U~Xzye= z&%`j3fp-(bWua@^7!I=7F8@DY1{A`OFwkS*W?*1A#K6RGgh7tsD1!mRaRxJnlMHqY zrx?N*&M+i0oMp&lILDx!&2W(+kKq#7Zzc?^3o^ojG|aI$DwJiXSjt`w-|#u)an9gWGaKQi}p5#8=&kX2WCK$4-Y6#z9!vh9MhKCGF43EK9K~jt|CgQIc3ws)Ms5Zs1`bAP zQ1F5il{~nd3S(ek7h!m~nc*?WOyq)Jl7X2~29(1XWf|od7#L(2m>K06m>Ja=H5j#_ eEFDH8Mq>s>MoUI(1_lN$21Z63Mmt6a21x*Pxp^S~ delta 3042 zcmZoQSgXf%>ff$?3=9lbjFuC*;+feQ_$KyC@bWS+b24x+2=XupF$hoGqUI*b!yv{W z%*eo#pOlrFT;f!kmX=xsQX;{_APJJ-PR`HC$xKO1%1JE-iA(b^$biH-Q;HJH!J_O8 za+4Jp#d&2Jn7J4@7!-LJlo*sJyD+LUs!q;gl;u`u&|qiKR{$`CeLkXckd zf`=iJA&ilMGd;D$BQ-NUqlAkgnjwarAr|D(xXG!^db$aW48m|{x)&uDWMn268@UKE zFfb(XFeEdiFfyzjgf&hIVUx-NQi-vp&I0f8b$^k4IglT`6d>Zq!w9Ee#4?9 zTgSst4^quulvaaqu!s=3$t^Fm)1c3=1bOU{mLq%dnV-VF|<1$>-S=IHoZy=V4gEuyXQuHZ2Z&hSfX_YZ%r})?~Nl zUeB+7#Vniok2-BKFBe|)1Q%n(S^++k^u}r8RroX!()&t5vZz&cxQkA zAQw+R#}L=x$?2TxlZAO)CeP$N&Bu!xNl9FWT#V(642+(P42&6@*K?&Y>I&o}<|d^i zsuZQB6{Qwus2DObFqSYf2tkG6$wtM1kwIg!G^gz3bv)jD(p-!(jI!*Eay*Rkj0&6C zd07}4l_ndoiJOG+voor2F>o-d@-PZBiU=@r^0PB)fCMyo7zG)W1sIh1*%)=W7p2)WLE*x{z#z%+ zgy9|oBg0b$1_maE`wWtxkYHe9cm@uf=L`%CYz&MHFBljYgh1sI10%yru*z2qLZHG1 z&VS7y1S*u^{5K3jpwbJ@f5pJWz|FwJz`(%Az*x_~3O4pF0|TQd12+RR0|Ucit?dkq zTFhG+*tK>u@J4QD;NQw1fMALsnBoYgl-6zr*~sk-^4k~`b~C6%Zemc|&Y6 zi!d09Fc^z4m~LV)-_Bs=tEIDzK|xD<8$-Q<)@}yd$lVO~k=q#@K@?b>@pcBM?F_CU zMY|b1B1IUyL>Np(7<@z+{I)X$Y-3Q^2=@9rP|?l6$H2f~$H2m1$-v2A&mh9!z#z}y z$e_jG#9+$c!r;K*&fv}9!H~q@!;sG4%aFt1&(O^fz_5rRkl{T;Jp+RR#M2BP7(OyE zFnBXWFnnV8%)rQy#Nf#Ah2b*;69W^doMB*Oc+0@RaD#z`ft7)Q!9!~sL$Cm6hSoNQ zZ~=jgB@DtKmYu8sXO4hChV60&0gwV)83BPD0nQ9N?QINE2N>e5ShTh41x?X3}Oti42lf#3~CGs40;U74CV}}4DJkR4DUf! zGq5wrF)%ZHW%$Ox#307N&G4P!8`u*bP){&0crg56_{qS?pvIsCRj0=w1yyIxAjt5G z;Wq;d!yl0UIT)A}|1$6}GBPlNidLvU-NF85VBpr$-p-H-imF_YOPRnfaV*#H<dIobU9dP7ef^&=29U!WE(>*!Wt_&7$R{wcGfZUQVVDFq4ie;iP~+Gc*cq7_SwJDe$jYz~YOX$r&%nUIsMn-5N(~eM+S?c=g=-&Vm^PDvUuz44xb^{tX&@m` zk_O9x0s@kh#lU%FJ_9Gi0tNwwg$yzbiy2fImLj=Y4Px8mlOi(ppnT;7wTTPGG)QuT z#NG-9PKK38CU8MaU|?Y2V&r1v2Kkebhv7KX<^LI&8Q2*Z7z&teL2li~FvCxGC&L^@ zhM5d;x;q&bF)|!rm}bQy$+DB7ei!WgzOBrB)j3$g`j1~-%0H^+0{Qv*} diff --git a/target/classes/objects/DebugPos.class b/target/classes/objects/DebugPos.class index faaca3e47b9db8bee0e370d4f38d1bb504e74e3c..608784c893f5e9e4e5b3ee9def56f0c0e68d21f9 100644 GIT binary patch delta 66 zcmdnNF`I+y)W2Q(7#J9=7+g1U&0*TSlgXTsm!E-=!IXi4L7RbrfpPL*W+`zV21XE@ R!GggOOgl3$FfcK=000xJ3wHnj delta 94 zcmbQuv4ex_)W2Q(7#J9=7~D2;&0!K0(C|slFG|(-O)M@+Ewa`O+q{Iyl9AV$fsw(K sfdPz}Cck2qQWRrgVqjokWUyecWB>t11_uU521W)(1{Vef1||kq0CV>dz5oCK diff --git a/target/classes/objects/GameObject.class b/target/classes/objects/GameObject.class index 35550196e6943a3405ea6a383a33aadd48583800..b0b47742c7288d4eb6f641ee16eaf9f2b5221e18 100644 GIT binary patch literal 3214 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 Kk)aP9r~Lqd;c?Ue literal 3677 zcmX^0Z`VEs1_mpJUUmj1Mh2ne{GwF-+{BU${jk*JlKdhg7cK@y1{NL$Rt7dk1~!|_ zyv!0iMg~?57Z=SiE(Q(;PId+^kSsSNgHV1_R%&udvA%m^ZmK_+&B&mw;e%H`6d>Zq!uwUaHr&_7CYzXpkZJPgJRCX5U`!OlUhu72@Bjv=1@ zj0}t}AmwH}4CY|v8JrA^43<0$Rv@K}6`;7Z;bE|4uw!K4OHVBc&o9bJan8>#N+||M zca)|JNP`0pgCkf&B}jua4}%LxgAl5QU~oXYF}SlccT8NdMKi%1@ZD3C9B z(o;)(6AK`o21&&5FvNl+1dt^_o?~+WYi3|zXGmmZ-~~sYOHpDuC~iUSb8!J>4@L$S z=X_8c^7~}wrTUfTCZ!gIK$HmiTQge4Ybg7{EDmXeIjVo*ZH%tzLY46GF(n;98c zD!~&?JIZ}!e%OSxli4=v1Shn^AxrjO4D20(h z6cNWr3K$t!DjbuF85vkA!4wB5qedW@kq{=xB2Wx7GVp?!L5O&j#$hoirWqMn5{r_< zA(RIr18Z4gPH8G519N6^1S11u6eEKua_qVl<>!KvJ|lw`*09rr1Pp3`GBU7~7NZFfg!y@;;arW)K0>;!s)|N~NW=TnG76Sx?33pK`vni2M5F@W(=$h<_ug6 zmJEUnRtz!>)(naac3_uiK}>|ZM2R7fK?Lj)C5C*40tO}qRt8yyLIx2AW`-gL1_llW z#y<>-pa5cIC}t>uy6go5D+4BvL9$MLW^CG8TNsqKF}P~Win55Zin48E@CNw|647c5 zoD2*M?hLF99t^?^o(zf%UJM2d-VF8(J`8>gehgs@{tSr>0bpNxKwJm+WfDUvLmAkY zN#JzJ#GuIF$WYE;z`)F4z+l8s!C=6^!eGy!%uvZ-z`)Aj#~{K`#bCg|#=yu>O@Cke zqx(9Nft4YOL6{+$L6ISb!GIx_!JZ+G!H*$b|aFsD;M$KL&Pi$frQ! zS_XSWL*i0!3j-)Ft^3T_piv7-22Oou>`*R9)~U~o10K_$XclD`<&YI+*~Sor?(bX% zR)#zV0fu}Ad4>W8J%&OCTZSSAABGZ!5Qb8QWQH=ZzhfZogU5CXJhoGyvCY7c!cYf} zZ4j#-9NY2?uHY2F%Am(!22KHN47LpF;1s~l;KLvRP5~SYjGz_@G%WJLB^v{Sg6vEN zVRaFPuuTkx+4Q$2eD1tv)3~)FhKGnA2{b%GO#dIF^DkKfZYoz4HV$+RbXgf zFaf7d1%^h3CTPxMW?%$m%w~obsO5DGY~W%>PkRf41=!Af5r(jAkP|$$w=mdiZDBBN z2MbxUfJ#dZ36|{)%p2e(CB!L>48jae49X16V5dNe13kD?^cWhz#epz`G`QSkVo+w_ z2DQH!SQr>VEib5BvKd&w1&NI8Oa^|K$93EB20}Xn3quEk07DnpW=J5&z-^X+2Z9W0 zAP6upf*MOui|e5=U?4k_K@wChZeg&1*$*mMvXj?CMD3A8?X#27V`KsY3&TVPDTc{N zjxm5c#sKaZ160RIF))G}Xi&%GLqh?S90ZZ=z@P_8osd`prDIUEi7>?Fr$dB5 f=@=AhU?G$Q4Dr$mu+2Q+`~pk3j11jikM{rom1MFO diff --git a/target/classes/objects/ships/BattleShip.class b/target/classes/objects/ships/BattleShip.class index 9ddd1a5efab7b72702c6ea82fc7be9b617444aae..16f94747d5d6c1a79568cb5f0d30e83c0456a85b 100644 GIT binary patch delta 690 zcmca7yiADe)W2Q(7#J9=7)myBFMVi07o<6*F8aM*m6$&itqt+XH| zu_Sde3yaU>Zk8s#crJznhD3ITBp!xjhLp|HtSpR-X_FP$r1dhm7&sU*c^D!Yq68Si z_*ofpKxXCgFoZB@GBWUZ=H;apIp-u67pE4pGZakDWYc0PVq}n;oWmwJc`KWYupo52fgrwoG+gBJrUSj?Bfi-8@?0@=jLzz7N^uuX5+_3J@4LENdx zz{jA(Aj_Z(wnYnUyBypWIR-xlf3Pib3;_&*U|+~F1Th3NFf%ZM0t;j!0|SFK0~1&k zuhtd@-dzk<3=G>C%r=4p31k%)Sfe@v4}%8S8gY=H85nq>_AoMpGK7Iln!JZY8tgWR z25kmT1|6^lNceF<)iW?~F@!TjFfa;mfnpG(lYxODfPn?z3K@zSBmpL@Plf;h delta 810 zcmZ1`bWfP;)W2Q(7#J9=7%De%+w1B$bgtK*J|FzbIAT zH?g=Rwa8jCjEg~#!HI{#nZafAA|^w|$#g{JG$#A8s83d7 zY2r)aVn}63V`oU`VaQ;}+`Ns2g^@9P@@`gX!(1)~4u(7)hB$_J0ftC^HiklwKoJi^ z3_~m<1CM83UTTqZPGWI!YB4)QDIQ;0 z7{Oxx41QocWEcV%{1{llVu1{P4D4W*4udWOCj%oWw7~9aXV*#vQyA_E_T5`!#* zGT0U^uFM|z(EdwJ1BZC720|OI-BLJ<24K)A& diff --git a/target/classes/objects/ships/Turret.class b/target/classes/objects/ships/Turret.class index d9d3099337744afd568a84c5bbc1a8a59157dca6..54be3db3c1a4504b5c3b7e59bc98f0b4075bd5a5 100644 GIT binary patch delta 1929 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 PXhFmnEEyOWm>8@8|3?a) delta 115 zcmaFC(aOnn>ff$?3=9lb3^p6NY?%ZFG<=fti&FJ{6N^hyi>x)nHoG!CW%RIQU}R8d zU|=w1U|?WkU|?X}2xe$7Ffgz&FfuSO=rL$AFffQgBpI|Av>8Bvk-?b3gn^NPk--YA G-WmX(ArTb-