Skip to content
Snippets Groups Projects
Commit 90ab5527 authored by jez04's avatar jez04
Browse files

feat: :tada: solution

parent 23ae03bf
Branches
No related merge requests found
package lab.game; package lab.game;
import java.io.Serial;
import javafx.geometry.Rectangle2D; import javafx.geometry.Rectangle2D;
import javafx.scene.canvas.GraphicsContext; import javafx.scene.canvas.GraphicsContext;
import javafx.scene.paint.Color; import javafx.scene.paint.Color;
public class Bullet extends WorldEntity implements Collisionable{ public class Bullet extends WorldEntity implements Collisionable{
@Serial
private static final long serialVersionUID = -3773585484081897646L;
private static final double SIZE = 20; private static final double SIZE = 20;
protected final MyPoint acceleration; protected final MyPoint acceleration;
......
package lab.game; package lab.game;
import java.io.Serial;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
...@@ -8,11 +9,14 @@ import javafx.scene.image.Image; ...@@ -8,11 +9,14 @@ import javafx.scene.image.Image;
public class BulletAnimated extends Bullet { public class BulletAnimated extends Bullet {
@Serial
private static final long serialVersionUID = 4366455699671618979L;
private static final double SIZE = 40; private static final double SIZE = 40;
private Cannon cannon; private Cannon cannon;
private static Image image = new Image(BulletAnimated.class.getResourceAsStream("fireball-transparent.gif")); private static Image image = new Image(BulletAnimated.class.getResourceAsStream("fireball-transparent.gif"));
private List<HitListener> hitListeners = new ArrayList<>(); private transient List<HitListener> hitListeners = new ArrayList<>();
public BulletAnimated(World world, Cannon cannon, MyPoint position, MyPoint velocity, MyPoint acceleration) { public BulletAnimated(World world, Cannon cannon, MyPoint position, MyPoint velocity, MyPoint acceleration) {
super(world, position, velocity, acceleration); super(world, position, velocity, acceleration);
......
package lab.game; package lab.game;
import java.io.Serial;
import javafx.scene.canvas.GraphicsContext; import javafx.scene.canvas.GraphicsContext;
import javafx.scene.paint.Color; import javafx.scene.paint.Color;
import javafx.scene.transform.Affine; import javafx.scene.transform.Affine;
...@@ -7,6 +9,9 @@ import javafx.scene.transform.Transform; ...@@ -7,6 +9,9 @@ import javafx.scene.transform.Transform;
public class Cannon extends WorldEntity { public class Cannon extends WorldEntity {
@Serial
private static final long serialVersionUID = 2092588800016758726L;
private static final double LENGTH = 60; private static final double LENGTH = 60;
private static final double WIDTH = 15; private static final double WIDTH = 15;
private double angle; private double angle;
...@@ -25,7 +30,7 @@ public class Cannon extends WorldEntity { ...@@ -25,7 +30,7 @@ public class Cannon extends WorldEntity {
@Override @Override
public void simulate(double deltaT) { public void simulate(double deltaT) {
/* nothing to do */ /*nothing to do*/
} }
public double getAngle() { public double getAngle() {
......
package lab.game; package lab.game;
import java.io.Serial;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.Random; import java.util.Random;
...@@ -13,6 +14,9 @@ import lab.Setting; ...@@ -13,6 +14,9 @@ import lab.Setting;
public class Ufo extends WorldEntity implements Collisionable { public class Ufo extends WorldEntity implements Collisionable {
@Serial
private static final long serialVersionUID = -2830189192945805617L;
private static Logger log = LogManager.getLogger(Ufo.class); private static Logger log = LogManager.getLogger(Ufo.class);
private static final Random RANDOM = new Random(); private static final Random RANDOM = new Random();
......
package lab.game; package lab.game;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.LinkedList; import java.util.LinkedList;
...@@ -18,6 +25,8 @@ public class World { ...@@ -18,6 +25,8 @@ public class World {
private final double height; private final double height;
private Object entitiesLock = new Object();
private List<DrawableSimulable> entities; private List<DrawableSimulable> entities;
private Collection<DrawableSimulable> entitiesToRemove = new LinkedList<>(); private Collection<DrawableSimulable> entitiesToRemove = new LinkedList<>();
private Collection<DrawableSimulable> entitiesToAdd = new LinkedList<>(); private Collection<DrawableSimulable> entitiesToAdd = new LinkedList<>();
...@@ -50,11 +59,65 @@ public class World { ...@@ -50,11 +59,65 @@ public class World {
} }
public void startServer() { public void startServer() {
// TODO new Thread(() -> {
try (ServerSocket listenSocket = new ServerSocket(4600)) {
while (!Thread.currentThread().isInterrupted()) {
try {
Socket client = listenSocket.accept();
new Thread(() -> handleViewer(client), "Viewer handler").start();
} catch (IOException e) {
e.printStackTrace();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}).start();
}
public void handleViewer(Socket client) {
try (OutputStream outputStream = client.getOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream)) {
while (!Thread.currentThread().isInterrupted()) {
synchronized (entitiesLock) {
objectOutputStream.reset();
objectOutputStream.writeObject(entities);
objectOutputStream.flush();
}
sleepForWhile();
}
} catch (IOException e) {
e.printStackTrace();
}
}
private void sleepForWhile() {
try {
Thread.sleep(20);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
} }
public void connectToServer() { public void connectToServer() {
// TODO new Thread(() -> {
try (Socket socketToServer = new Socket("localhost", 4600);
InputStream inputStream = socketToServer.getInputStream();
ObjectInputStream objectInputStream = new ObjectInputStream(inputStream)) {
while (!Thread.currentThread().isInterrupted()) {
Object o = objectInputStream.readObject();
if (o instanceof List l) {
synchronized (entitiesLock) {
entities = l;
}
}
}
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}).start();
} }
public void add(UfoDestroyLog ufoDestroyLog) { public void add(UfoDestroyLog ufoDestroyLog) {
...@@ -71,8 +134,10 @@ public class World { ...@@ -71,8 +134,10 @@ public class World {
gc.clearRect(0, 0, width, height); gc.clearRect(0, 0, width, height);
gc.save(); gc.save();
for (DrawableSimulable entity : entities) { synchronized (entitiesLock) {
entity.draw(gc); for (DrawableSimulable entity : entities) {
entity.draw(gc);
}
} }
gc.restore(); gc.restore();
} }
...@@ -81,14 +146,16 @@ public class World { ...@@ -81,14 +146,16 @@ public class World {
if (viewMode) { if (viewMode) {
return; return;
} }
for (DrawableSimulable entity : entities) { synchronized (entitiesLock) {
entity.simulate(deltaT); for (DrawableSimulable entity : entities) {
entity.simulate(deltaT);
}
detectCollision();
entities.removeAll(entitiesToRemove);
entities.addAll(entitiesToAdd);
entitiesToAdd.clear();
entitiesToRemove.clear();
} }
detectCollision();
entities.removeAll(entitiesToRemove);
entities.addAll(entitiesToAdd);
entitiesToAdd.clear();
entitiesToRemove.clear();
} }
private void detectCollision() { private void detectCollision() {
......
package lab.game; package lab.game;
import java.io.Serial;
import java.io.Serializable;
import javafx.scene.canvas.GraphicsContext; import javafx.scene.canvas.GraphicsContext;
public abstract class WorldEntity implements DrawableSimulable { public abstract class WorldEntity implements DrawableSimulable, Serializable {
protected final World world; @Serial
private static final long serialVersionUID = -8041266267302181620L;
protected final transient World world;
protected MyPoint position; protected MyPoint position;
protected WorldEntity(World world, MyPoint position) { protected WorldEntity(World world, MyPoint position) {
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment