forked from jzitnik/twodcraft
feat: Better thread handling
This commit is contained in:
parent
ed921ff6cd
commit
4041c8f7d2
@ -3,9 +3,7 @@ package cz.jzitnik;
|
||||
import cz.jzitnik.game.GameSaver;
|
||||
import cz.jzitnik.game.logic.CustomLogicProvider;
|
||||
import cz.jzitnik.game.mobs.EntityLogicProvider;
|
||||
import cz.jzitnik.game.threads.HealthRegenerationThread;
|
||||
import cz.jzitnik.game.threads.HungerDrainThread;
|
||||
import cz.jzitnik.game.threads.InputHandlerThread;
|
||||
import cz.jzitnik.game.threads.ThreadProvider;
|
||||
import cz.jzitnik.game.ui.*;
|
||||
import cz.jzitnik.game.SpriteLoader;
|
||||
import cz.jzitnik.tui.ScreenRenderer;
|
||||
@ -32,16 +30,11 @@ public class Main {
|
||||
|
||||
final boolean[] isRunning = { true };
|
||||
|
||||
Thread inputHandlerThread = new InputHandlerThread(game, terminal, screenRenderer, isRunning);
|
||||
Thread healingThread = new HealthRegenerationThread(game.getPlayer());
|
||||
Thread hungerDrainThread = new HungerDrainThread(game.getPlayer());
|
||||
EntityLogicProvider entityLogicProvider = new EntityLogicProvider();
|
||||
CustomLogicProvider customLogicProvider = new CustomLogicProvider();
|
||||
|
||||
// Start all threads
|
||||
healingThread.start();
|
||||
hungerDrainThread.start();
|
||||
inputHandlerThread.start();
|
||||
ThreadProvider threadProvider = new ThreadProvider(game, screenRenderer, terminal, isRunning);
|
||||
threadProvider.start();
|
||||
|
||||
while (isRunning[0]) {
|
||||
try {
|
||||
|
@ -0,0 +1,11 @@
|
||||
package cz.jzitnik.game.annotations;
|
||||
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
import java.lang.annotation.ElementType;
|
||||
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target(ElementType.TYPE)
|
||||
public @interface ThreadAnnotation {
|
||||
}
|
@ -6,9 +6,6 @@ import java.util.Set;
|
||||
|
||||
import cz.jzitnik.game.Game;
|
||||
import cz.jzitnik.game.annotations.EntitySpawn;
|
||||
import cz.jzitnik.game.entities.Block;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
import org.jline.terminal.Terminal;
|
||||
import org.reflections.Reflections;
|
||||
|
||||
@ -21,7 +18,6 @@ public class EntitySpawnProvider {
|
||||
int playerY = playerLocation[1];
|
||||
|
||||
for (EntitySpawnInterface entitySpawnInterface : spawnList) {
|
||||
|
||||
entitySpawnInterface.spawn(playerX, playerY, game, terminal);
|
||||
}
|
||||
}
|
||||
|
74
src/main/java/cz/jzitnik/game/threads/ThreadProvider.java
Normal file
74
src/main/java/cz/jzitnik/game/threads/ThreadProvider.java
Normal file
@ -0,0 +1,74 @@
|
||||
package cz.jzitnik.game.threads;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import cz.jzitnik.game.Game;
|
||||
import cz.jzitnik.game.annotations.ThreadAnnotation;
|
||||
import cz.jzitnik.game.entities.Player;
|
||||
import cz.jzitnik.tui.ScreenRenderer;
|
||||
|
||||
import org.jline.terminal.Terminal;
|
||||
import org.reflections.Reflections;
|
||||
|
||||
public class ThreadProvider {
|
||||
private final Game game;
|
||||
private final ScreenRenderer screenRenderer;
|
||||
private final Terminal terminal;
|
||||
private final boolean[] isRunning;
|
||||
private final List<Thread> list = new ArrayList<>();
|
||||
|
||||
public void start() {
|
||||
for (Thread thread : list) {
|
||||
thread.start();
|
||||
}
|
||||
}
|
||||
|
||||
public ThreadProvider(Game game, ScreenRenderer screenRenderer, Terminal terminal, boolean[] isRunning) {
|
||||
this.game = game;
|
||||
this.screenRenderer = screenRenderer;
|
||||
this.terminal = terminal;
|
||||
this.isRunning = isRunning;
|
||||
registerHandlers();
|
||||
}
|
||||
|
||||
private void registerHandlers() {
|
||||
Reflections reflections = new Reflections("cz.jzitnik.game.threads");
|
||||
Set<Class<?>> handlerClasses = reflections.getTypesAnnotatedWith(ThreadAnnotation.class);
|
||||
|
||||
for (Class<?> clazz : handlerClasses) {
|
||||
if (Thread.class.isAssignableFrom(clazz)) {
|
||||
try {
|
||||
for (var constructor : clazz.getDeclaredConstructors()) {
|
||||
var paramTypes = constructor.getParameterTypes();
|
||||
var params = new Object[paramTypes.length];
|
||||
boolean suitable = true;
|
||||
|
||||
for (int i = 0; i < paramTypes.length; i++) {
|
||||
Class<?> type = paramTypes[i];
|
||||
if (type == Game.class) params[i] = game;
|
||||
else if (type == ScreenRenderer.class) params[i] = screenRenderer;
|
||||
else if (type == Terminal.class) params[i] = terminal;
|
||||
else if (type == boolean[].class) params[i] = isRunning;
|
||||
else if (type == Player.class) params[i] = game.getPlayer();
|
||||
else {
|
||||
suitable = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (suitable) {
|
||||
constructor.setAccessible(true);
|
||||
Thread instance = (Thread) constructor.newInstance(params);
|
||||
list.add(instance);
|
||||
break; // Found a matching constructor, go to next class
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,9 +1,11 @@
|
||||
package cz.jzitnik.game.threads;
|
||||
package cz.jzitnik.game.threads.list;
|
||||
|
||||
import cz.jzitnik.game.annotations.ThreadAnnotation;
|
||||
import cz.jzitnik.game.entities.Player;
|
||||
import lombok.AllArgsConstructor;
|
||||
|
||||
@AllArgsConstructor
|
||||
@ThreadAnnotation
|
||||
public class HealthRegenerationThread extends Thread {
|
||||
private final Player player;
|
||||
|
@ -1,9 +1,11 @@
|
||||
package cz.jzitnik.game.threads;
|
||||
package cz.jzitnik.game.threads.list;
|
||||
|
||||
import cz.jzitnik.game.annotations.ThreadAnnotation;
|
||||
import cz.jzitnik.game.entities.Player;
|
||||
import lombok.AllArgsConstructor;
|
||||
|
||||
@AllArgsConstructor
|
||||
@ThreadAnnotation
|
||||
public class HungerDrainThread extends Thread {
|
||||
private final Player player;
|
||||
|
@ -1,4 +1,4 @@
|
||||
package cz.jzitnik.game.threads;
|
||||
package cz.jzitnik.game.threads.list;
|
||||
|
||||
import cz.jzitnik.game.Game;
|
||||
import cz.jzitnik.game.blocks.Chest;
|
||||
@ -9,8 +9,11 @@ import cz.jzitnik.tui.ScreenRenderer;
|
||||
import org.jline.terminal.MouseEvent;
|
||||
import org.jline.terminal.Terminal;
|
||||
import java.io.IOException;
|
||||
import java.nio.BufferUnderflowException;
|
||||
import java.util.Optional;
|
||||
import cz.jzitnik.game.annotations.ThreadAnnotation;
|
||||
|
||||
@ThreadAnnotation
|
||||
public class InputHandlerThread extends Thread {
|
||||
private final Game game;
|
||||
private final Terminal terminal;
|
||||
@ -91,7 +94,7 @@ public class InputHandlerThread extends Thread {
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (IOException e) {
|
||||
} catch (IOException | BufferUnderflowException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
package cz.jzitnik.game.threads.list;
|
||||
|
||||
import cz.jzitnik.game.annotations.ThreadAnnotation;
|
||||
import cz.jzitnik.game.entities.Player;
|
||||
import lombok.AllArgsConstructor;
|
||||
|
||||
@AllArgsConstructor
|
||||
@ThreadAnnotation
|
||||
public class NoHungerThread extends Thread {
|
||||
private final Player player;
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
while (true) {
|
||||
try {
|
||||
Thread.sleep(6000);
|
||||
if (player.getHunger() == 0) {
|
||||
player.setHealth(player.getHunger() - 1);
|
||||
}
|
||||
} catch (InterruptedException e) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user