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-