diff options
Diffstat (limited to 'core')
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}. * |
