diff --git a/src/main/java/de/extio/game_engine/keyboard/KeycodeRegistryImpl.java b/src/main/java/de/extio/game_engine/keyboard/KeycodeRegistryImpl.java index 6456288..5a4ef24 100644 --- a/src/main/java/de/extio/game_engine/keyboard/KeycodeRegistryImpl.java +++ b/src/main/java/de/extio/game_engine/keyboard/KeycodeRegistryImpl.java @@ -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 registry; diff --git a/src/main/java/de/extio/game_engine/renderer/RendererConfiguration.java b/src/main/java/de/extio/game_engine/renderer/RendererConfiguration.java index d57ad40..6fb159c 100644 --- a/src/main/java/de/extio/game_engine/renderer/RendererConfiguration.java +++ b/src/main/java/de/extio/game_engine/renderer/RendererConfiguration.java @@ -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 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 eventConsumer, + final KeycodeRegistry keycodeRegistry) { + + final var rendererData = new RendererData(applicationContext, renderer, rendererControl, renderingBoPool, eventConsumer, keycodeRegistry); renderer.setRendererData(rendererData); rendererControl.setRendererData(rendererData); renderingBoPool.setRendererData(rendererData); diff --git a/src/main/java/de/extio/game_engine/renderer/RendererData.java b/src/main/java/de/extio/game_engine/renderer/RendererData.java index 4fc2b0e..63eae01 100644 --- a/src/main/java/de/extio/game_engine/renderer/RendererData.java +++ b/src/main/java/de/extio/game_engine/renderer/RendererData.java @@ -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; @@ -25,15 +26,18 @@ public class RendererData { private final VideoOptions videoOptions = new VideoOptions(); 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 eventConsumer) { + public RendererData(final ApplicationContext applicationContext, final Renderer renderer, final RendererControl rendererControl, final RenderingBoPool renderingBoPool, final Consumer 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() { @@ -79,5 +83,9 @@ public class RendererData { public RendererLoop getRendererLoop() { return this.rendererLoop; } + + public KeycodeRegistry getKeycodeRegistry() { + return this.keycodeRegistry; + } } diff --git a/src/main/java/de/extio/game_engine/renderer/RendererLoop.java b/src/main/java/de/extio/game_engine/renderer/RendererLoop.java index 0900a11..41d4a26 100644 --- a/src/main/java/de/extio/game_engine/renderer/RendererLoop.java +++ b/src/main/java/de/extio/game_engine/renderer/RendererLoop.java @@ -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"); diff --git a/src/main/java/de/extio/game_engine/renderer/g2d/G2DMainFrame.java b/src/main/java/de/extio/game_engine/renderer/g2d/G2DMainFrame.java index b83d789..719f3e9 100644 --- a/src/main/java/de/extio/game_engine/renderer/g2d/G2DMainFrame.java +++ b/src/main/java/de/extio/game_engine/renderer/g2d/G2DMainFrame.java @@ -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,8 +265,25 @@ public class G2DMainFrame extends Frame { } else if (event.getID() == KeyEvent.KEY_RELEASED) { LOGGER.trace("Release {} {} {}", e.getKeyCode(), KeyEvent.getKeyText(e.getKeyCode()), G2DMainFrame.getModifiers(e)); - final var keyPressMessage = new KeyStrokeEvent(true, e.getKeyCode(), KeyEvent.getKeyText(e.getKeyCode()), G2DMainFrame.getModifiers(e)); - G2DMainFrame.this.rendererData.getEventConsumer().accept(keyPressMessage); + 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); + } } } }; @@ -410,7 +430,7 @@ public class G2DMainFrame extends Frame { final var ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); final var bounds = ge.getDefaultScreenDevice().getDefaultConfiguration().getBounds(); this.setLocation(bounds.x, bounds.y); - this.setSize((int)Math.min(bounds.getWidth(), RendererControl.REFERENCE_RESOLUTION.getX()), (int)Math.min(bounds.getHeight(), RendererControl.REFERENCE_RESOLUTION.getY())); + this.setSize((int) Math.min(bounds.getWidth(), RendererControl.REFERENCE_RESOLUTION.getX()), (int) Math.min(bounds.getHeight(), RendererControl.REFERENCE_RESOLUTION.getY())); } private static int getModifiers(final InputEvent event) { diff --git a/src/main/java/de/extio/game_engine/renderer/g2d/G2DRendererControl.java b/src/main/java/de/extio/game_engine/renderer/g2d/G2DRendererControl.java index 2013d38..dd9c008 100644 --- a/src/main/java/de/extio/game_engine/renderer/g2d/G2DRendererControl.java +++ b/src/main/java/de/extio/game_engine/renderer/g2d/G2DRendererControl.java @@ -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();