Skip to content
Snippets Groups Projects
Commit 09245b67 authored by jez04's avatar jez04
Browse files

feat: :tada: solution

parent 2936deba
Branches
No related merge requests found
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.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Comparator; import java.util.Comparator;
...@@ -14,6 +21,8 @@ import lombok.extern.log4j.Log4j2; ...@@ -14,6 +21,8 @@ import lombok.extern.log4j.Log4j2;
@Log4j2 @Log4j2
public class Level { public class Level {
private Object entitiesLock = new Object();
private boolean viewMode; private boolean viewMode;
private double width; private double width;
...@@ -51,11 +60,67 @@ public class Level { ...@@ -51,11 +60,67 @@ public class Level {
} }
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();
synchronized (entitiesLock) {
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();
} }
record MonsterDeadLog(LocalDateTime time, MyPoint position) { record MonsterDeadLog(LocalDateTime time, MyPoint position) {
...@@ -70,8 +135,10 @@ public class Level { ...@@ -70,8 +135,10 @@ public class Level {
public void draw(GraphicsContext gc) { public void draw(GraphicsContext gc) {
gc.setFill(Color.WHITE); gc.setFill(Color.WHITE);
gc.clearRect(0, 0, width, height); gc.clearRect(0, 0, width, height);
for (DrawableSimulable entity : entities) { synchronized (entitiesLock) {
entity.draw(gc); for (DrawableSimulable entity : entities) {
entity.draw(gc);
}
} }
} }
...@@ -79,15 +146,17 @@ public class Level { ...@@ -79,15 +146,17 @@ public class Level {
if (viewMode) { if (viewMode) {
return; return;
} }
for (DrawableSimulable entity : entities) { synchronized (entitiesLock) {
entity.simulate(delay); for (DrawableSimulable entity : entities) {
entity.simulate(delay);
}
detectCollisions();
entities.removeAll(entitiesToRemove);
entities.addAll(entitiesToAdd);
entitiesToAdd.clear();
entitiesToRemove.clear();
entities.sort(Comparator.comparing(DrawableSimulable::getZIndex));
} }
detectCollisions();
entities.removeAll(entitiesToRemove);
entities.addAll(entitiesToAdd);
entitiesToAdd.clear();
entitiesToRemove.clear();
entities.sort(Comparator.comparing(DrawableSimulable::getZIndex));
} }
private void detectCollisions() { private void detectCollisions() {
......
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;
import java.util.Random; import java.util.Random;
...@@ -14,13 +15,16 @@ import lab.Config; ...@@ -14,13 +15,16 @@ import lab.Config;
public class Monster extends WorldEntity implements Collisionable { public class Monster extends WorldEntity implements Collisionable {
@Serial
private static final long serialVersionUID = 4227585479714088964L;
private static Logger log = LogManager.getLogger(Monster.class); private static Logger log = LogManager.getLogger(Monster.class);
private static final Random RANDOM = new Random(); private static final Random RANDOM = new Random();
private static Image image; private static Image image;
private MyPoint speed; private MyPoint speed;
private List<DeadListener> deadListeners = new ArrayList<>(); private transient List<DeadListener> deadListeners = new ArrayList<>();
public Monster(Level level) { public Monster(Level level) {
super(level, new MyPoint(0, 0), 100); super(level, new MyPoint(0, 0), 100);
......
package lab.game; package lab.game;
import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
...@@ -7,7 +8,10 @@ import lombok.Getter; ...@@ -7,7 +8,10 @@ import lombok.Getter;
@AllArgsConstructor @AllArgsConstructor
@Getter @Getter
public class MyDimension { public class MyDimension implements Serializable {
@Serial
private static final long serialVersionUID = -4053578370437363200L;
private double width; private double width;
......
package lab.game; package lab.game;
public class MyPoint { import java.io.Serial;
import java.io.Serializable;
public class MyPoint implements Serializable {
@Serial
private static final long serialVersionUID = 5131948780897974323L;
public double x; public double x;
public double y; public double y;
......
package lab.game; package lab.game;
import java.io.Serial;
import javafx.scene.canvas.GraphicsContext; import javafx.scene.canvas.GraphicsContext;
import javafx.scene.image.Image; import javafx.scene.image.Image;
public class NicerObstacle extends WorldEntity { public class NicerObstacle extends WorldEntity {
@Serial
private static final long serialVersionUID = -6623353377339746275L;
private static Image image; private static Image image;
public NicerObstacle(Level level, MyPoint position) { public NicerObstacle(Level level, MyPoint position) {
...@@ -12,18 +17,18 @@ public class NicerObstacle extends WorldEntity { ...@@ -12,18 +17,18 @@ public class NicerObstacle extends WorldEntity {
} }
private static Image getImage() { private static Image getImage() {
if (image == null) { if(image == null){
image = new Image(NicerObstacle.class.getResourceAsStream("spike.gif")); image = new Image(NicerObstacle.class.getResourceAsStream("spike.gif"));
} }
return image; return image;
} }
public void drawInternal(GraphicsContext gc) { public void drawInternal(GraphicsContext gc) {
gc.drawImage(getImage(), position.getX(), position.getY()); gc.drawImage(getImage(), position.getX(), position.getY());
} }
public void simulate(double delay) { public void simulate(double delay) {
/* nothing to do */ /*nothing to do*/
} }
} }
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 lab.Config; import lab.Config;
public class Obstacle extends WorldEntity { public class Obstacle extends WorldEntity {
@Serial
private static final long serialVersionUID = 3430702588557969248L;
private MyDimension size; private MyDimension size;
public Obstacle(Level level) { public Obstacle(Level level) {
...@@ -27,7 +31,7 @@ public class Obstacle extends WorldEntity { ...@@ -27,7 +31,7 @@ public class Obstacle extends WorldEntity {
} }
public void simulate(double delay) { public void simulate(double delay) {
/* nothing to do */ /*nothing to do*/
} }
} }
package lab.game; package lab.game;
import java.io.Serial;
import java.util.Random; import java.util.Random;
import javafx.geometry.Rectangle2D; import javafx.geometry.Rectangle2D;
...@@ -12,6 +13,9 @@ import lab.Config; ...@@ -12,6 +13,9 @@ import lab.Config;
public class Player extends WorldEntity implements Collisionable { public class Player extends WorldEntity implements Collisionable {
@Serial
private static final long serialVersionUID = -4487836387706082936L;
private static final Random RANDOM = new Random(); private static final Random RANDOM = new Random();
private MyPoint speed; private MyPoint speed;
......
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 Level level; @Serial
private static final long serialVersionUID = 2626363250832813659L;
protected transient final Level level;
protected MyPoint position; protected MyPoint position;
private int zIndex; private int zIndex;
...@@ -36,5 +42,5 @@ public abstract class WorldEntity implements DrawableSimulable { ...@@ -36,5 +42,5 @@ public abstract class WorldEntity implements DrawableSimulable {
public int getZIndex() { public int getZIndex() {
return zIndex; return zIndex;
} }
} }
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