Merge KeyEventHandler to Reactive and replace old key event system with Reactive API
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user