aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/src/main/java/coffee/liz/abstractionengine/app/life/EntropyAudioSystem.java18
-rw-r--r--core/src/main/java/coffee/liz/abstractionengine/app/screen/MainMenu.java5
-rw-r--r--core/src/main/java/coffee/liz/abstractionengine/app/utils/FunctionUtils.java6
-rw-r--r--core/src/main/java/coffee/liz/ecs/DAGWorld.java9
-rw-r--r--core/src/main/java/coffee/liz/ecs/model/System.java5
-rw-r--r--core/src/main/java/coffee/liz/ecs/model/World.java2
6 files changed, 29 insertions, 16 deletions
diff --git a/core/src/main/java/coffee/liz/abstractionengine/app/life/EntropyAudioSystem.java b/core/src/main/java/coffee/liz/abstractionengine/app/life/EntropyAudioSystem.java
index 2900a96..09ba762 100644
--- a/core/src/main/java/coffee/liz/abstractionengine/app/life/EntropyAudioSystem.java
+++ b/core/src/main/java/coffee/liz/abstractionengine/app/life/EntropyAudioSystem.java
@@ -9,7 +9,6 @@ import coffee.liz.ecs.model.World;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.audio.AudioDevice;
import com.badlogic.gdx.math.MathUtils;
-import com.badlogic.gdx.utils.Disposable;
import java.time.Duration;
import java.util.Collection;
@@ -17,7 +16,7 @@ import java.util.List;
import java.util.Set;
import java.util.stream.IntStream;
-public class EntropyAudioSystem implements System<LifeInput>, Disposable {
+public class EntropyAudioSystem implements System<LifeInput> {
private static final int SAMPLE_RATE = 44100;
private static final int CHUNKS_X = 4;
private static final int CHUNKS_Y = 4;
@@ -47,13 +46,12 @@ public class EntropyAudioSystem implements System<LifeInput>, Disposable {
private final float[] phases = new float[NUM_CHUNKS];
private final float[] pulsePhases = new float[NUM_CHUNKS];
- private Thread audioThread;
+ private final Thread audioThread;
private volatile boolean running = true;
- public void start() {
+ public EntropyAudioSystem() {
audioThread = new Thread(this::audioLoop, "EntropyAudio");
audioThread.setDaemon(true);
- audioThread.start();
}
@Override
@@ -67,7 +65,11 @@ public class EntropyAudioSystem implements System<LifeInput>, Disposable {
running = false;
return;
}
- running = true;
+
+ if (!audioThread.isAlive()) {
+ audioThread.start();
+ running = true;
+ }
final LifeSystem lifeSystem = world.getSystem(LifeSystem.class);
final Vec2<Integer> gridDimensions = lifeSystem.getDimensions();
@@ -148,9 +150,9 @@ public class EntropyAudioSystem implements System<LifeInput>, Disposable {
}
@Override
- public void dispose() {
+ public void close() {
running = false;
- FunctionUtils.runUninterrupted(() -> audioThread.join(AUDIO_THREAD_TIMEOUT));
+ FunctionUtils.wrapCheckedException(() -> audioThread.join(AUDIO_THREAD_TIMEOUT));
device.dispose();
}
}
diff --git a/core/src/main/java/coffee/liz/abstractionengine/app/screen/MainMenu.java b/core/src/main/java/coffee/liz/abstractionengine/app/screen/MainMenu.java
index 076e93f..2ffafdd 100644
--- a/core/src/main/java/coffee/liz/abstractionengine/app/screen/MainMenu.java
+++ b/core/src/main/java/coffee/liz/abstractionengine/app/screen/MainMenu.java
@@ -8,6 +8,7 @@ import coffee.liz.abstractionengine.app.life.EntropyAudioSystem;
import coffee.liz.abstractionengine.app.life.CellState;
import coffee.liz.abstractionengine.app.life.LifeInput;
import coffee.liz.abstractionengine.app.life.LifeSystem;
+import coffee.liz.abstractionengine.app.utils.FunctionUtils;
import coffee.liz.abstractionengine.grid.component.GridPosition;
import coffee.liz.ecs.DAGWorld;
import coffee.liz.ecs.math.Mat2;
@@ -52,7 +53,6 @@ public class MainMenu implements Screen {
.add(initialAlive.contains(pos) ? CellState.LIVE : CellState.DEAD));
stage = new Stage(game.viewport, game.batch);
- world.getSystem(EntropyAudioSystem.class).start();
lifeGridActor = new LifeGridActor(game.shapeRenderer, world, GRID_DIMENSIONS, game.settings);
lifeGridActor.setViewport(game.viewport);
stage.addActor(lifeGridActor);
@@ -155,8 +155,7 @@ public class MainMenu implements Screen {
*/
@Override
public void dispose() {
- world.getSystem(EntropyAudioSystem.class).dispose();
- world.query(Set.of()).forEach(world::removeEntity);
+ FunctionUtils.wrapCheckedException(world::close);
stage.dispose();
}
}
diff --git a/core/src/main/java/coffee/liz/abstractionengine/app/utils/FunctionUtils.java b/core/src/main/java/coffee/liz/abstractionengine/app/utils/FunctionUtils.java
index 8304977..c219df0 100644
--- a/core/src/main/java/coffee/liz/abstractionengine/app/utils/FunctionUtils.java
+++ b/core/src/main/java/coffee/liz/abstractionengine/app/utils/FunctionUtils.java
@@ -5,12 +5,12 @@ public final class FunctionUtils {
}
/**
- * Runs the provided action and wraps failures.
+ * Runs the provided action and wraps failures into a {@link RuntimeException}.
*
* @param run
* action to execute
*/
- public static <E extends Throwable> void runUninterrupted(final ThrowableRunnable<E> run) {
+ public static <E extends Throwable> void wrapCheckedException(final ThrowableRunnable<E> run) {
try {
run.run();
} catch (final Throwable e) {
@@ -21,7 +21,7 @@ public final class FunctionUtils {
@FunctionalInterface
public interface ThrowableRunnable<E extends Throwable> {
/**
- * Performs the action.
+ * Run.
*/
void run() throws E;
}
diff --git a/core/src/main/java/coffee/liz/ecs/DAGWorld.java b/core/src/main/java/coffee/liz/ecs/DAGWorld.java
index f3ad30b..dea83ef 100644
--- a/core/src/main/java/coffee/liz/ecs/DAGWorld.java
+++ b/core/src/main/java/coffee/liz/ecs/DAGWorld.java
@@ -153,4 +153,13 @@ public class DAGWorld<T> implements World<T> {
return Collections.unmodifiableList(result);
}
+
+ @Override
+ public void close() throws Exception {
+ for (final System<T> system : systemExecutionOrder) {
+ system.close();
+ }
+ componentCache.clear();
+ entities.clear();
+ }
}
diff --git a/core/src/main/java/coffee/liz/ecs/model/System.java b/core/src/main/java/coffee/liz/ecs/model/System.java
index 220b917..cc46f39 100644
--- a/core/src/main/java/coffee/liz/ecs/model/System.java
+++ b/core/src/main/java/coffee/liz/ecs/model/System.java
@@ -9,7 +9,7 @@ import java.util.Collection;
* @param <T>
* is the state of the stuff outside the {@link World}.
*/
-public interface System<T> {
+public interface System<T> extends AutoCloseable {
/**
* {@link System} clazzes that must run before this system.
*
@@ -26,4 +26,7 @@ public interface System<T> {
* Is the timestep.
*/
void update(final World<T> world, final T state, final Duration dt);
+
+ @Override
+ default void close() {}
}
diff --git a/core/src/main/java/coffee/liz/ecs/model/World.java b/core/src/main/java/coffee/liz/ecs/model/World.java
index 96c7a74..05363e8 100644
--- a/core/src/main/java/coffee/liz/ecs/model/World.java
+++ b/core/src/main/java/coffee/liz/ecs/model/World.java
@@ -10,7 +10,7 @@ import java.util.Set;
* @param <T>
* is the state of the stuff outside the world.
*/
-public interface World<T> {
+public interface World<T> extends AutoCloseable {
/**
* Create unique {@link Entity} in the {@link World}.
*