Refactor event system | make Context events-aware | introduce GamePauseEvent

This commit is contained in:
2021-04-08 23:00:42 +02:00
parent 808155533d
commit d3293e3004
9 changed files with 81 additions and 19 deletions

View File

@@ -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);

View File

@@ -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
}
}

View File

@@ -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<>();

View File

@@ -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);