Refactor event system | make Context events-aware | introduce GamePauseEvent
This commit is contained in:
@@ -4,6 +4,8 @@ import com.bartlomiejpluta.base.api.animation.Animation;
|
|||||||
import com.bartlomiejpluta.base.api.audio.Sound;
|
import com.bartlomiejpluta.base.api.audio.Sound;
|
||||||
import com.bartlomiejpluta.base.api.camera.Camera;
|
import com.bartlomiejpluta.base.api.camera.Camera;
|
||||||
import com.bartlomiejpluta.base.api.entity.Entity;
|
import com.bartlomiejpluta.base.api.entity.Entity;
|
||||||
|
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.gui.GUI;
|
||||||
import com.bartlomiejpluta.base.api.image.Image;
|
import com.bartlomiejpluta.base.api.image.Image;
|
||||||
import com.bartlomiejpluta.base.api.input.Input;
|
import com.bartlomiejpluta.base.api.input.Input;
|
||||||
@@ -18,6 +20,7 @@ import com.bartlomiejpluta.base.util.lambda.UncheckedFunction;
|
|||||||
|
|
||||||
import java.sql.Connection;
|
import java.sql.Connection;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
public interface Context extends Updatable, Renderable, Disposable {
|
public interface Context extends Updatable, Renderable, Disposable {
|
||||||
GameRunner getGameRunner();
|
GameRunner getGameRunner();
|
||||||
@@ -70,6 +73,10 @@ public interface Context extends Updatable, Renderable, Disposable {
|
|||||||
|
|
||||||
boolean togglePause();
|
boolean togglePause();
|
||||||
|
|
||||||
|
<E extends Event> void addEventListener(EventType<E> type, Consumer<E> listener);
|
||||||
|
|
||||||
|
<E extends Event> void removeEventListener(EventType<E> type, Consumer<E> listener);
|
||||||
|
|
||||||
void init(Screen screen, Input input, Camera camera);
|
void init(Screen screen, Input input, Camera camera);
|
||||||
|
|
||||||
void input(Input input);
|
void input(Input input);
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
package com.bartlomiejpluta.base.api.context;
|
||||||
|
|
||||||
|
import com.bartlomiejpluta.base.api.event.Event;
|
||||||
|
import com.bartlomiejpluta.base.api.event.EventType;
|
||||||
|
import com.bartlomiejpluta.base.lib.event.BaseEvent;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.Value;
|
||||||
|
|
||||||
|
@Value
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
public class GamePauseEvent extends BaseEvent {
|
||||||
|
public static final EventType<GamePauseEvent> TYPE = new EventType<>("GAME_PAUSE_EVENT");
|
||||||
|
boolean paused;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public EventType<? extends Event> getType() {
|
||||||
|
return TYPE;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,11 +1,12 @@
|
|||||||
package com.bartlomiejpluta.base.api.map.layer.base;
|
package com.bartlomiejpluta.base.api.map.layer.base;
|
||||||
|
|
||||||
import com.bartlomiejpluta.base.api.animation.Animation;
|
import com.bartlomiejpluta.base.api.animation.Animation;
|
||||||
|
import com.bartlomiejpluta.base.api.event.Reactive;
|
||||||
import com.bartlomiejpluta.base.api.map.model.GameMap;
|
import com.bartlomiejpluta.base.api.map.model.GameMap;
|
||||||
import com.bartlomiejpluta.base.internal.logic.Updatable;
|
import com.bartlomiejpluta.base.internal.logic.Updatable;
|
||||||
import com.bartlomiejpluta.base.internal.render.Renderable;
|
import com.bartlomiejpluta.base.internal.render.Renderable;
|
||||||
|
|
||||||
public interface Layer extends Renderable, Updatable {
|
public interface Layer extends Renderable, Updatable, Reactive {
|
||||||
GameMap getMap();
|
GameMap getMap();
|
||||||
|
|
||||||
void pushAnimation(Animation animation);
|
void pushAnimation(Animation animation);
|
||||||
|
|||||||
@@ -1,12 +1,13 @@
|
|||||||
package com.bartlomiejpluta.base.api.map.model;
|
package com.bartlomiejpluta.base.api.map.model;
|
||||||
|
|
||||||
|
import com.bartlomiejpluta.base.api.event.Reactive;
|
||||||
import com.bartlomiejpluta.base.api.map.layer.color.ColorLayer;
|
import com.bartlomiejpluta.base.api.map.layer.color.ColorLayer;
|
||||||
import com.bartlomiejpluta.base.api.map.layer.image.ImageLayer;
|
import com.bartlomiejpluta.base.api.map.layer.image.ImageLayer;
|
||||||
import com.bartlomiejpluta.base.api.map.layer.object.ObjectLayer;
|
import com.bartlomiejpluta.base.api.map.layer.object.ObjectLayer;
|
||||||
import com.bartlomiejpluta.base.api.map.layer.tile.TileLayer;
|
import com.bartlomiejpluta.base.api.map.layer.tile.TileLayer;
|
||||||
import org.joml.Vector2fc;
|
import org.joml.Vector2fc;
|
||||||
|
|
||||||
public interface GameMap {
|
public interface GameMap extends Reactive {
|
||||||
float getWidth();
|
float getWidth();
|
||||||
|
|
||||||
float getHeight();
|
float getHeight();
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
package com.bartlomiejpluta.base.lib.event;
|
package com.bartlomiejpluta.base.lib.event;
|
||||||
|
|
||||||
import com.bartlomiejpluta.base.api.event.Event;
|
import com.bartlomiejpluta.base.api.event.Event;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
|
||||||
|
@EqualsAndHashCode
|
||||||
public abstract class BaseEvent implements Event {
|
public abstract class BaseEvent implements Event {
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
|
|||||||
@@ -4,12 +4,13 @@ import com.bartlomiejpluta.base.api.animation.Animation;
|
|||||||
import com.bartlomiejpluta.base.api.audio.Sound;
|
import com.bartlomiejpluta.base.api.audio.Sound;
|
||||||
import com.bartlomiejpluta.base.api.camera.Camera;
|
import com.bartlomiejpluta.base.api.camera.Camera;
|
||||||
import com.bartlomiejpluta.base.api.context.Context;
|
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.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.gui.GUI;
|
||||||
import com.bartlomiejpluta.base.api.image.Image;
|
import com.bartlomiejpluta.base.api.image.Image;
|
||||||
import com.bartlomiejpluta.base.api.input.Input;
|
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.map.handler.MapHandler;
|
||||||
import com.bartlomiejpluta.base.api.runner.GameRunner;
|
import com.bartlomiejpluta.base.api.runner.GameRunner;
|
||||||
import com.bartlomiejpluta.base.api.screen.Screen;
|
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.manager.MapManager;
|
||||||
import com.bartlomiejpluta.base.engine.world.map.model.DefaultGameMap;
|
import com.bartlomiejpluta.base.engine.world.map.model.DefaultGameMap;
|
||||||
import com.bartlomiejpluta.base.internal.render.ShaderManager;
|
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.UncheckedConsumer;
|
||||||
import com.bartlomiejpluta.base.util.lambda.UncheckedFunction;
|
import com.bartlomiejpluta.base.util.lambda.UncheckedFunction;
|
||||||
import lombok.Builder;
|
import lombok.Builder;
|
||||||
@@ -38,6 +40,7 @@ import java.sql.Connection;
|
|||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@Builder
|
@Builder
|
||||||
@@ -94,13 +97,14 @@ public class DefaultContext implements Context {
|
|||||||
private DefaultGameMap map;
|
private DefaultGameMap map;
|
||||||
private MapHandler mapHandler;
|
private MapHandler mapHandler;
|
||||||
|
|
||||||
private final List<GUI> guis = new LinkedList<>();
|
|
||||||
|
|
||||||
private final List<Sound> sounds = new LinkedList<>();
|
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
private boolean paused;
|
private boolean paused;
|
||||||
|
|
||||||
|
private final List<GUI> guis = new LinkedList<>();
|
||||||
|
private final List<Sound> sounds = new LinkedList<>();
|
||||||
|
|
||||||
|
private final EventHandler eventHandler = new EventHandler();
|
||||||
|
|
||||||
@SneakyThrows
|
@SneakyThrows
|
||||||
@Override
|
@Override
|
||||||
public void init(@NonNull Screen screen, @NonNull Input input, @NonNull Camera camera) {
|
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.input = input;
|
||||||
this.camera = camera;
|
this.camera = camera;
|
||||||
|
|
||||||
input.addKeyEventHandler(this::populateKeyEventToObjectLayers);
|
input.addKeyEventHandler(this::populateEvent);
|
||||||
|
|
||||||
gameRunner.init(this);
|
gameRunner.init(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void populateKeyEventToObjectLayers(KeyEvent event) {
|
private void populateEvent(Event event) {
|
||||||
|
eventHandler.handleEvent(event);
|
||||||
|
|
||||||
if (map == null || event.isConsumed()) {
|
if (map == null || event.isConsumed()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (var layer : map.getLayers()) {
|
map.handleEvent(event);
|
||||||
if (layer instanceof Reactive) {
|
|
||||||
((Reactive) layer).handleEvent(event);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@SneakyThrows
|
@SneakyThrows
|
||||||
@@ -225,31 +227,44 @@ public class DefaultContext implements Context {
|
|||||||
@Override
|
@Override
|
||||||
public void setPaused(boolean paused) {
|
public void setPaused(boolean paused) {
|
||||||
this.paused = paused;
|
this.paused = paused;
|
||||||
|
|
||||||
sounds.forEach(this.paused ? Sound::pause : Sound::play);
|
sounds.forEach(this.paused ? Sound::pause : Sound::play);
|
||||||
|
populateEvent(new GamePauseEvent(this.paused));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void pause() {
|
public void pause() {
|
||||||
this.paused = true;
|
this.paused = true;
|
||||||
sounds.forEach(Sound::pause);
|
sounds.forEach(Sound::pause);
|
||||||
|
populateEvent(new GamePauseEvent(true));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void resume() {
|
public void resume() {
|
||||||
this.paused = false;
|
this.paused = false;
|
||||||
sounds.forEach(Sound::play);
|
sounds.forEach(Sound::play);
|
||||||
|
populateEvent(new GamePauseEvent(false));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean togglePause() {
|
public boolean togglePause() {
|
||||||
this.paused = !this.paused;
|
this.paused = !this.paused;
|
||||||
|
|
||||||
sounds.forEach(this.paused ? Sound::pause : Sound::play);
|
sounds.forEach(this.paused ? Sound::pause : Sound::play);
|
||||||
|
populateEvent(new GamePauseEvent(this.paused));
|
||||||
|
|
||||||
return 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
|
@Override
|
||||||
public void input(Input input) {
|
public void input(Input input) {
|
||||||
gameRunner.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.animation.Animation;
|
||||||
import com.bartlomiejpluta.base.api.camera.Camera;
|
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.layer.base.Layer;
|
||||||
import com.bartlomiejpluta.base.api.map.model.GameMap;
|
import com.bartlomiejpluta.base.api.map.model.GameMap;
|
||||||
import com.bartlomiejpluta.base.api.screen.Screen;
|
import com.bartlomiejpluta.base.api.screen.Screen;
|
||||||
@@ -64,4 +65,9 @@ public abstract class BaseLayer implements Layer, Updatable {
|
|||||||
animation.render(screen, camera, shaderManager);
|
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.camera.Camera;
|
||||||
import com.bartlomiejpluta.base.api.entity.Entity;
|
import com.bartlomiejpluta.base.api.entity.Entity;
|
||||||
import com.bartlomiejpluta.base.api.event.Event;
|
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.ObjectLayer;
|
||||||
import com.bartlomiejpluta.base.api.map.layer.object.PassageAbility;
|
import com.bartlomiejpluta.base.api.map.layer.object.PassageAbility;
|
||||||
import com.bartlomiejpluta.base.api.map.model.GameMap;
|
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.Float.compare;
|
||||||
import static java.lang.Integer.compare;
|
import static java.lang.Integer.compare;
|
||||||
|
|
||||||
public class DefaultObjectLayer extends BaseLayer implements ObjectLayer, Reactive {
|
public class DefaultObjectLayer extends BaseLayer implements ObjectLayer {
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
private final ArrayList<Entity> entities = new ArrayList<>();
|
private final ArrayList<Entity> entities = new ArrayList<>();
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package com.bartlomiejpluta.base.engine.world.map.model;
|
package com.bartlomiejpluta.base.engine.world.map.model;
|
||||||
|
|
||||||
import com.bartlomiejpluta.base.api.camera.Camera;
|
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.image.Image;
|
||||||
import com.bartlomiejpluta.base.api.map.layer.base.Layer;
|
import com.bartlomiejpluta.base.api.map.layer.base.Layer;
|
||||||
import com.bartlomiejpluta.base.api.map.layer.color.ColorLayer;
|
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);
|
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() {
|
public TileLayer createTileLayer() {
|
||||||
var layer = new DefaultTileLayer(this, tileSet, rows, columns);
|
var layer = new DefaultTileLayer(this, tileSet, rows, columns);
|
||||||
layers.add(layer);
|
layers.add(layer);
|
||||||
|
|||||||
Reference in New Issue
Block a user