Refactor event system | make Context events-aware | introduce GamePauseEvent
This commit is contained in:
@@ -4,12 +4,13 @@ import com.bartlomiejpluta.base.api.animation.Animation;
|
||||
import com.bartlomiejpluta.base.api.audio.Sound;
|
||||
import com.bartlomiejpluta.base.api.camera.Camera;
|
||||
import com.bartlomiejpluta.base.api.context.Context;
|
||||
import com.bartlomiejpluta.base.api.context.GamePauseEvent;
|
||||
import com.bartlomiejpluta.base.api.entity.Entity;
|
||||
import com.bartlomiejpluta.base.api.event.Reactive;
|
||||
import com.bartlomiejpluta.base.api.event.Event;
|
||||
import com.bartlomiejpluta.base.api.event.EventType;
|
||||
import com.bartlomiejpluta.base.api.gui.GUI;
|
||||
import com.bartlomiejpluta.base.api.image.Image;
|
||||
import com.bartlomiejpluta.base.api.input.Input;
|
||||
import com.bartlomiejpluta.base.api.input.KeyEvent;
|
||||
import com.bartlomiejpluta.base.api.map.handler.MapHandler;
|
||||
import com.bartlomiejpluta.base.api.runner.GameRunner;
|
||||
import com.bartlomiejpluta.base.api.screen.Screen;
|
||||
@@ -26,6 +27,7 @@ import com.bartlomiejpluta.base.engine.world.image.manager.ImageManager;
|
||||
import com.bartlomiejpluta.base.engine.world.map.manager.MapManager;
|
||||
import com.bartlomiejpluta.base.engine.world.map.model.DefaultGameMap;
|
||||
import com.bartlomiejpluta.base.internal.render.ShaderManager;
|
||||
import com.bartlomiejpluta.base.lib.event.EventHandler;
|
||||
import com.bartlomiejpluta.base.util.lambda.UncheckedConsumer;
|
||||
import com.bartlomiejpluta.base.util.lambda.UncheckedFunction;
|
||||
import lombok.Builder;
|
||||
@@ -38,6 +40,7 @@ import java.sql.Connection;
|
||||
import java.sql.SQLException;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
@Slf4j
|
||||
@Builder
|
||||
@@ -94,13 +97,14 @@ public class DefaultContext implements Context {
|
||||
private DefaultGameMap map;
|
||||
private MapHandler mapHandler;
|
||||
|
||||
private final List<GUI> guis = new LinkedList<>();
|
||||
|
||||
private final List<Sound> sounds = new LinkedList<>();
|
||||
|
||||
@Getter
|
||||
private boolean paused;
|
||||
|
||||
private final List<GUI> guis = new LinkedList<>();
|
||||
private final List<Sound> sounds = new LinkedList<>();
|
||||
|
||||
private final EventHandler eventHandler = new EventHandler();
|
||||
|
||||
@SneakyThrows
|
||||
@Override
|
||||
public void init(@NonNull Screen screen, @NonNull Input input, @NonNull Camera camera) {
|
||||
@@ -108,21 +112,19 @@ public class DefaultContext implements Context {
|
||||
this.input = input;
|
||||
this.camera = camera;
|
||||
|
||||
input.addKeyEventHandler(this::populateKeyEventToObjectLayers);
|
||||
input.addKeyEventHandler(this::populateEvent);
|
||||
|
||||
gameRunner.init(this);
|
||||
}
|
||||
|
||||
private void populateKeyEventToObjectLayers(KeyEvent event) {
|
||||
private void populateEvent(Event event) {
|
||||
eventHandler.handleEvent(event);
|
||||
|
||||
if (map == null || event.isConsumed()) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (var layer : map.getLayers()) {
|
||||
if (layer instanceof Reactive) {
|
||||
((Reactive) layer).handleEvent(event);
|
||||
}
|
||||
}
|
||||
map.handleEvent(event);
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
@@ -225,31 +227,44 @@ public class DefaultContext implements Context {
|
||||
@Override
|
||||
public void setPaused(boolean paused) {
|
||||
this.paused = paused;
|
||||
|
||||
sounds.forEach(this.paused ? Sound::pause : Sound::play);
|
||||
populateEvent(new GamePauseEvent(this.paused));
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void pause() {
|
||||
this.paused = true;
|
||||
sounds.forEach(Sound::pause);
|
||||
populateEvent(new GamePauseEvent(true));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void resume() {
|
||||
this.paused = false;
|
||||
sounds.forEach(Sound::play);
|
||||
populateEvent(new GamePauseEvent(false));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean togglePause() {
|
||||
this.paused = !this.paused;
|
||||
|
||||
sounds.forEach(this.paused ? Sound::pause : Sound::play);
|
||||
populateEvent(new GamePauseEvent(this.paused));
|
||||
|
||||
return this.paused;
|
||||
}
|
||||
|
||||
@Override
|
||||
public <E extends Event> void addEventListener(EventType<E> type, Consumer<E> listener) {
|
||||
eventHandler.addListener(type, listener);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <E extends Event> void removeEventListener(EventType<E> type, Consumer<E> listener) {
|
||||
eventHandler.removeListener(type, listener);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void input(Input input) {
|
||||
gameRunner.input(input);
|
||||
|
||||
@@ -2,6 +2,7 @@ package com.bartlomiejpluta.base.engine.world.map.layer.base;
|
||||
|
||||
import com.bartlomiejpluta.base.api.animation.Animation;
|
||||
import com.bartlomiejpluta.base.api.camera.Camera;
|
||||
import com.bartlomiejpluta.base.api.event.Event;
|
||||
import com.bartlomiejpluta.base.api.map.layer.base.Layer;
|
||||
import com.bartlomiejpluta.base.api.map.model.GameMap;
|
||||
import com.bartlomiejpluta.base.api.screen.Screen;
|
||||
@@ -64,4 +65,9 @@ public abstract class BaseLayer implements Layer, Updatable {
|
||||
animation.render(screen, camera, shaderManager);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public <E extends Event> void handleEvent(E event) {
|
||||
// do nothing
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,7 +4,6 @@ import com.bartlomiejpluta.base.api.ai.NPC;
|
||||
import com.bartlomiejpluta.base.api.camera.Camera;
|
||||
import com.bartlomiejpluta.base.api.entity.Entity;
|
||||
import com.bartlomiejpluta.base.api.event.Event;
|
||||
import com.bartlomiejpluta.base.api.event.Reactive;
|
||||
import com.bartlomiejpluta.base.api.map.layer.object.ObjectLayer;
|
||||
import com.bartlomiejpluta.base.api.map.layer.object.PassageAbility;
|
||||
import com.bartlomiejpluta.base.api.map.model.GameMap;
|
||||
@@ -23,7 +22,7 @@ import java.util.Queue;
|
||||
import static java.lang.Float.compare;
|
||||
import static java.lang.Integer.compare;
|
||||
|
||||
public class DefaultObjectLayer extends BaseLayer implements ObjectLayer, Reactive {
|
||||
public class DefaultObjectLayer extends BaseLayer implements ObjectLayer {
|
||||
|
||||
@Getter
|
||||
private final ArrayList<Entity> entities = new ArrayList<>();
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.bartlomiejpluta.base.engine.world.map.model;
|
||||
|
||||
import com.bartlomiejpluta.base.api.camera.Camera;
|
||||
import com.bartlomiejpluta.base.api.event.Event;
|
||||
import com.bartlomiejpluta.base.api.image.Image;
|
||||
import com.bartlomiejpluta.base.api.map.layer.base.Layer;
|
||||
import com.bartlomiejpluta.base.api.map.layer.color.ColorLayer;
|
||||
@@ -103,6 +104,17 @@ public class DefaultGameMap implements Renderable, Updatable, GameMap {
|
||||
return (ObjectLayer) layers.get(layerIndex);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <E extends Event> void handleEvent(E event) {
|
||||
for (var layer : layers) {
|
||||
if (event.isConsumed()) {
|
||||
return;
|
||||
}
|
||||
|
||||
layer.handleEvent(event);
|
||||
}
|
||||
}
|
||||
|
||||
public TileLayer createTileLayer() {
|
||||
var layer = new DefaultTileLayer(this, tileSet, rows, columns);
|
||||
layers.add(layer);
|
||||
|
||||
Reference in New Issue
Block a user