Merge KeyEventHandler to Reactive and replace old key event system with Reactive API

This commit is contained in:
2021-04-06 17:25:39 +02:00
parent 898bcc809c
commit 125d063af3
27 changed files with 200 additions and 146 deletions

View File

@@ -5,18 +5,17 @@ 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.entity.Entity;
import com.bartlomiejpluta.base.api.event.Reactive;
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.input.KeyEventHandler;
import com.bartlomiejpluta.base.api.map.handler.MapHandler;
import com.bartlomiejpluta.base.api.runner.GameRunner;
import com.bartlomiejpluta.base.api.screen.Screen;
import com.bartlomiejpluta.base.engine.audio.manager.SoundManager;
import com.bartlomiejpluta.base.engine.core.engine.GameEngine;
import com.bartlomiejpluta.base.engine.database.service.DatabaseService;
import com.bartlomiejpluta.base.engine.error.AppException;
import com.bartlomiejpluta.base.engine.gui.manager.FontManager;
import com.bartlomiejpluta.base.engine.gui.manager.WidgetDefinitionManager;
import com.bartlomiejpluta.base.engine.gui.render.NanoVGGUI;
@@ -42,7 +41,7 @@ import java.util.List;
@Slf4j
@Builder
public class DefaultContext implements Context, KeyEventHandler {
public class DefaultContext implements Context {
@NonNull
private final GameEngine engine;
@@ -106,11 +105,23 @@ public class DefaultContext implements Context, KeyEventHandler {
this.input = input;
this.camera = camera;
input.addKeyEventHandler(this);
input.addKeyEventHandler(this::populateKeyEventToObjectLayers);
gameRunner.init(this);
}
private void populateKeyEventToObjectLayers(KeyEvent event) {
if (map == null || event.isConsumed()) {
return;
}
for (var layer : map.getLayers()) {
if (layer instanceof Reactive) {
((Reactive) layer).handleEvent(event);
}
}
}
@SneakyThrows
@Override
public void openMap(@NonNull String mapUid) {
@@ -237,24 +248,6 @@ public class DefaultContext implements Context, KeyEventHandler {
}
}
@Override
public void handleKeyEvent(KeyEvent event) {
if (map == null || event.isConsumed()) {
return;
}
for (var layer : map.getLayers()) {
if (layer instanceof KeyEventHandler) {
((KeyEventHandler) layer).handleKeyEvent(event);
}
}
}
@Override
public void onKeyEventHandlerUnregister() {
throw new AppException("Context cannot be unregistered");
}
@Override
public void update(float dt) {
gameRunner.update(dt);

View File

@@ -1,9 +1,9 @@
package com.bartlomiejpluta.base.engine.gui.widget;
import com.bartlomiejpluta.base.api.event.Event;
import com.bartlomiejpluta.base.api.gui.GUI;
import com.bartlomiejpluta.base.api.gui.SizeMode;
import com.bartlomiejpluta.base.api.gui.Widget;
import com.bartlomiejpluta.base.api.input.KeyEvent;
import com.bartlomiejpluta.base.api.screen.Screen;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@@ -233,7 +233,7 @@ public class ScreenWidget implements Widget {
}
@Override
public void handleKeyEvent(KeyEvent event) {
public <E extends Event> void handleEvent(E event) {
throw new UnsupportedOperationException();
}

View File

@@ -1,5 +1,7 @@
package com.bartlomiejpluta.base.engine.ui.event;
import com.bartlomiejpluta.base.api.event.Event;
import com.bartlomiejpluta.base.api.event.EventType;
import com.bartlomiejpluta.base.api.input.Key;
import com.bartlomiejpluta.base.api.input.KeyAction;
import com.bartlomiejpluta.base.api.input.KeyEvent;
@@ -19,6 +21,11 @@ public class GLFWKeyEvent implements KeyEvent {
private final KeyAction action;
private boolean consumed;
@Override
public EventType<? extends Event> getType() {
return KeyEvent.TYPE;
}
@Override
public void consume() {
consumed = true;

View File

@@ -2,7 +2,7 @@ package com.bartlomiejpluta.base.engine.ui.model;
import com.bartlomiejpluta.base.api.input.Input;
import com.bartlomiejpluta.base.api.input.Key;
import com.bartlomiejpluta.base.api.input.KeyEventHandler;
import com.bartlomiejpluta.base.api.input.KeyEvent;
import com.bartlomiejpluta.base.api.screen.Screen;
import com.bartlomiejpluta.base.engine.ui.event.GLFWKeyEvent;
import lombok.NonNull;
@@ -10,6 +10,7 @@ import lombok.extern.slf4j.Slf4j;
import java.util.Deque;
import java.util.LinkedList;
import java.util.function.Consumer;
import static com.bartlomiejpluta.base.engine.ui.event.GLFWKeyEvent.glfwCode;
import static org.lwjgl.glfw.GLFW.*;
@@ -17,7 +18,7 @@ import static org.lwjgl.glfw.GLFW.*;
@Slf4j
public class GLFWInput implements Input {
private final long windowHandle;
private final Deque<KeyEventHandler> keyEventHandlers = new LinkedList<>();
private final Deque<Consumer<KeyEvent>> keyEventHandlers = new LinkedList<>();
public GLFWInput(@NonNull Screen screen) {
this.windowHandle = screen.getID();
@@ -39,7 +40,7 @@ public class GLFWInput implements Input {
return;
}
iterator.next().handleKeyEvent(event);
iterator.next().accept(event);
}
});
@@ -52,14 +53,12 @@ public class GLFWInput implements Input {
}
@Override
public void addKeyEventHandler(@NonNull KeyEventHandler handler) {
public void addKeyEventHandler(@NonNull Consumer<KeyEvent> handler) {
keyEventHandlers.addLast(handler);
handler.onKeyEventHandlerRegister();
}
@Override
public void removeKeyEventHandler(@NonNull KeyEventHandler handler) {
public void removeKeyEventHandler(@NonNull Consumer<KeyEvent> handler) {
keyEventHandlers.remove(handler);
handler.onKeyEventHandlerUnregister();
}
}

View File

@@ -12,6 +12,7 @@ import com.bartlomiejpluta.base.engine.core.gl.object.mesh.Mesh;
import com.bartlomiejpluta.base.engine.error.AppException;
import com.bartlomiejpluta.base.engine.world.entity.manager.EntitySetManager;
import com.bartlomiejpluta.base.engine.world.movement.MovableSprite;
import com.bartlomiejpluta.base.lib.event.EventHandler;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
@@ -19,7 +20,9 @@ import org.joml.Vector2f;
import org.joml.Vector2fc;
import org.joml.Vector2i;
import java.util.*;
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;
import java.util.concurrent.CompletableFuture;
import java.util.function.Consumer;
@@ -34,7 +37,7 @@ public class DefaultEntity extends MovableSprite implements Entity {
private final Vector2f entityScale = new Vector2f(1, 1);
private Vector2fc entitySetSize;
private final Map<EventType<?>, List<Consumer<? extends Event>>> listeners = new HashMap<>();
private final EventHandler eventHandler = new EventHandler();
@Getter
@Setter
@@ -236,40 +239,19 @@ public class DefaultEntity extends MovableSprite implements Entity {
return entityScale.y;
}
@SuppressWarnings("unchecked")
@Override
public <E extends Event> void handleEvent(E event) {
var list = listeners.get(event.getType());
if (list != null) {
for (var listener : list) {
((Consumer<E>) listener).accept(event);
}
}
eventHandler.handleEvent(event);
}
@Override
public <E extends Event> void addEventListener(EventType<E> type, Consumer<E> listener) {
var list = this.listeners.get(type);
if (list != null) {
list.add(listener);
} else {
list = new ArrayList<>();
list.add(listener);
listeners.put(type, list);
}
eventHandler.addListener(type, listener);
}
@Override
public <E extends Event> void removeEventListener(EventType<E> type, Consumer<E> listener) {
var list = this.listeners.get(type);
if (list != null) {
list.remove(listener);
if (list.isEmpty()) {
this.listeners.remove(type);
}
}
eventHandler.removeListener(type, listener);
}
@Override

View File

@@ -4,8 +4,7 @@ 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.input.KeyEvent;
import com.bartlomiejpluta.base.api.input.KeyEventHandler;
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;
@@ -24,7 +23,7 @@ import java.util.Queue;
import static java.lang.Float.compare;
import static java.lang.Integer.compare;
public class DefaultObjectLayer extends BaseLayer implements ObjectLayer, KeyEventHandler {
public class DefaultObjectLayer extends BaseLayer implements ObjectLayer, Reactive {
@Getter
private final ArrayList<Entity> entities = new ArrayList<>();
@@ -156,14 +155,9 @@ public class DefaultObjectLayer extends BaseLayer implements ObjectLayer, KeyEve
return z == 0 ? compare(a.getPosition().y(), b.getPosition().y()) : z;
}
@Override
public void handleKeyEvent(KeyEvent event) {
}
@SuppressWarnings("ForLoopReplaceableByForEach")
@Override
public void fireEvent(Event event) {
public <E extends Event> void handleEvent(E event) {
// Disclaimer
// For the sake of an easy adding and removing
// entities from the entity.update() method inside