diff options
| author | Elizabeth Hunt <me@liz.coffee> | 2026-01-31 15:47:29 -0800 |
|---|---|---|
| committer | Elizabeth Hunt <me@liz.coffee> | 2026-01-31 15:47:29 -0800 |
| commit | 518149db6fc7f3726a4f638e0ef90c1cdbbdcb5a (patch) | |
| tree | 78e299754e6f8bfedb8eeb3f7ae6bd63c5446528 /core/src/main/java/coffee/liz/abstractionengine | |
| parent | d8b40e4240fb7f8c62fcd60c567ab386024741d3 (diff) | |
| download | the-abstraction-engine-v2-518149db6fc7f3726a4f638e0ef90c1cdbbdcb5a.tar.gz the-abstraction-engine-v2-518149db6fc7f3726a4f638e0ef90c1cdbbdcb5a.zip | |
Making world closing more intuitive
Diffstat (limited to 'core/src/main/java/coffee/liz/abstractionengine')
3 files changed, 15 insertions, 14 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; } |
