Integrate KeycodeRegistry into renderer components and update fullscreen toggle logic

This commit is contained in:
extio-de
2025-12-21 19:52:15 +01:00
parent 98a125c801
commit 6c903476c2
6 changed files with 55 additions and 6 deletions

View File

@@ -6,6 +6,9 @@ import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.springframework.stereotype.Service;
@Service
public class KeycodeRegistryImpl implements KeycodeRegistry {
private volatile Map<String, KeycodeRegistration> registry;

View File

@@ -11,6 +11,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import de.extio.game_engine.keyboard.KeycodeRegistry;
import de.extio.game_engine.renderer.model.RenderingBo;
@AutoConfiguration
@@ -33,8 +34,14 @@ public class RendererConfiguration {
}
@Bean
public RendererData rendererData(final ApplicationContext applicationContext, final Renderer renderer, final RendererControl rendererControl, final RenderingBoPool renderingBoPool, @Qualifier("gameEngineEventConsumer") final Consumer<Object> eventConsumer) {
final var rendererData = new RendererData(applicationContext, renderer, rendererControl, renderingBoPool, eventConsumer);
public RendererData rendererData(final ApplicationContext applicationContext,
final Renderer renderer,
final RendererControl rendererControl,
final RenderingBoPool renderingBoPool,
@Qualifier("gameEngineEventConsumer") final Consumer<Object> eventConsumer,
final KeycodeRegistry keycodeRegistry) {
final var rendererData = new RendererData(applicationContext, renderer, rendererControl, renderingBoPool, eventConsumer, keycodeRegistry);
renderer.setRendererData(rendererData);
rendererControl.setRendererData(rendererData);
renderingBoPool.setRendererData(rendererData);

View File

@@ -5,6 +5,7 @@ import java.util.function.Consumer;
import org.springframework.context.ApplicationContext;
import de.extio.game_engine.keyboard.KeycodeRegistry;
import de.extio.game_engine.renderer.model.options.UiOptions;
import de.extio.game_engine.renderer.model.options.VideoOptions;
@@ -26,14 +27,17 @@ public class RendererData {
private final AtomicLong frame = new AtomicLong();
private final KeycodeRegistry keycodeRegistry;
private RendererLoop rendererLoop;
public RendererData(final ApplicationContext applicationContext, final Renderer renderer, final RendererControl rendererControl, final RenderingBoPool renderingBoPool, final Consumer<Object> eventConsumer) {
public RendererData(final ApplicationContext applicationContext, final Renderer renderer, final RendererControl rendererControl, final RenderingBoPool renderingBoPool, final Consumer<Object> eventConsumer, final KeycodeRegistry keycodeRegistry) {
this.applicationContext = applicationContext;
this.renderer = renderer;
this.rendererControl = rendererControl;
this.renderingBoPool = renderingBoPool;
this.eventConsumer = eventConsumer;
this.keycodeRegistry = keycodeRegistry;
}
public ApplicationContext getApplicationContext() {
@@ -80,4 +84,8 @@ public class RendererData {
return this.rendererLoop;
}
public KeycodeRegistry getKeycodeRegistry() {
return this.keycodeRegistry;
}
}

View File

@@ -1,10 +1,14 @@
package de.extio.game_engine.renderer;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import de.extio.game_engine.keyboard.KeyModifiers;
import de.extio.game_engine.keyboard.KeycodeRegistration;
public class RendererLoop implements Runnable {
private static final Logger LOGGER = LoggerFactory.getLogger(RendererLoop.class);
@@ -22,6 +26,10 @@ public class RendererLoop implements Runnable {
this.shutdown = false;
try {
this.rendererData.getKeycodeRegistry().registerDefault(new KeycodeRegistration("toggleFullScreen", "675", KeyEvent.VK_ENTER, KeyModifiers.MODIFIER_ALT, "ALT ENTER"));
// TODO: Load video options from user preferences
this.rendererData.getRenderer().show();
LOGGER.info("Renderer loop started");

View File

@@ -22,6 +22,7 @@ import java.awt.event.MouseWheelListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.IOException;
import java.util.Objects;
import javax.imageio.ImageIO;
@@ -37,6 +38,8 @@ import de.extio.game_engine.renderer.model.event.KeyStrokeEvent;
import de.extio.game_engine.renderer.model.event.MouseClickEvent;
import de.extio.game_engine.renderer.model.event.MouseEnterEvent;
import de.extio.game_engine.renderer.model.event.MouseMoveEvent;
import de.extio.game_engine.renderer.model.options.VideoOptions;
import de.extio.game_engine.renderer.model.options.VideoOptions.VideoOptionsVideoMode;
import de.extio.game_engine.spatial2.model.ImmutableCoordI2;
public class G2DMainFrame extends Frame {
@@ -262,10 +265,27 @@ public class G2DMainFrame extends Frame {
}
else if (event.getID() == KeyEvent.KEY_RELEASED) {
LOGGER.trace("Release {} {} {}", e.getKeyCode(), KeyEvent.getKeyText(e.getKeyCode()), G2DMainFrame.getModifiers(e));
if (G2DMainFrame.this.rendererData.getKeycodeRegistry().check("toggleFullScreen", e.getKeyCode(), G2DMainFrame.getModifiers(e))) {
final VideoOptions clientVideoOptions = G2DMainFrame.this.rendererData.getVideoOptions();
if (clientVideoOptions.getVideoMode() == VideoOptionsVideoMode.FULLSCREEN || clientVideoOptions.getVideoMode() == VideoOptionsVideoMode.BORDERLESS) {
clientVideoOptions.setVideoMode(VideoOptionsVideoMode.WINDOW);
}
else {
if (Objects.requireNonNullElse(System.getProperty("os.name"), "").toLowerCase().contains("windows")) {
clientVideoOptions.setVideoMode(VideoOptionsVideoMode.BORDERLESS);
}
else {
clientVideoOptions.setVideoMode(VideoOptionsVideoMode.FULLSCREEN);
}
}
G2DMainFrame.this.rendererData.getRendererControl().applyVideoOptions();
}
else {
final var keyPressMessage = new KeyStrokeEvent(true, e.getKeyCode(), KeyEvent.getKeyText(e.getKeyCode()), G2DMainFrame.getModifiers(e));
G2DMainFrame.this.rendererData.getEventConsumer().accept(keyPressMessage);
}
}
}
};
Toolkit.getDefaultToolkit().addAWTEventListener(this.aWTEventListener, AWTEvent.KEY_EVENT_MASK);
}

View File

@@ -88,6 +88,9 @@ public class G2DRendererControl implements RendererControl {
Toolkit.getDefaultToolkit().sync();
this.updateViewPort(false, false);
// TODO: Save video options to user preferences
}
finally {
this.renderer.getWriteLock().unlock();