From f17ce558825df56e1f8249daff6040ba791610f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Fri, 12 Mar 2021 18:36:16 +0100 Subject: [PATCH] Create API for pausing and stopping game engine --- .../base/api/game/context/Context.java | 12 ++++++ .../engine/core/engine/DefaultGameEngine.java | 42 +++++++++++++++++-- .../base/engine/core/engine/GameEngine.java | 12 ++++++ .../engine/project/model/DefaultContext.java | 30 +++++++++++++ .../base/engine/ui/GLFWScreen.java | 7 ---- 5 files changed, 93 insertions(+), 10 deletions(-) diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/game/context/Context.java b/api/src/main/java/com/bartlomiejpluta/base/api/game/context/Context.java index 66a78022..caaf704e 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/api/game/context/Context.java +++ b/api/src/main/java/com/bartlomiejpluta/base/api/game/context/Context.java @@ -27,6 +27,18 @@ public interface Context extends Updatable, Renderable, Disposable { GUI newGUI(); + boolean isRunning(); + + void close(); + + boolean isPaused(); + + void pause(); + + void resume(); + + boolean togglePause(); + void init(Screen screen, Camera camera); void input(Screen screen); diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/core/engine/DefaultGameEngine.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/core/engine/DefaultGameEngine.java index 89b95b4a..f59f30c3 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/core/engine/DefaultGameEngine.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/core/engine/DefaultGameEngine.java @@ -7,6 +7,7 @@ import com.bartlomiejpluta.base.engine.logic.GameLogic; import com.bartlomiejpluta.base.engine.thread.ThreadManager; import com.bartlomiejpluta.base.engine.time.ChronoMeter; import com.bartlomiejpluta.base.engine.ui.ScreenManager; +import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -31,8 +32,12 @@ public class DefaultGameEngine implements GameEngine { private Context context; + @Getter private boolean running = false; + @Getter + private boolean paused = true; + private void run() { try { init(); @@ -62,9 +67,13 @@ public class DefaultGameEngine implements GameEngine { input(); - while (accumulator >= step) { - update(dt); - accumulator -= step; + if (!paused) { + while (accumulator >= step) { + update(dt); + accumulator -= step; + } + } else { + accumulator = 0; } render(); @@ -105,6 +114,33 @@ public class DefaultGameEngine implements GameEngine { thread.start(); } + @Override + public void stop() { + log.info("Stopping the engine"); + running = false; + } + + @Override + public void pause() { + log.info("Pausing the engine"); + paused = true; + } + + @Override + public void resume() { + log.info("Resuming the engine"); + paused = false; + } + + @Override + public boolean togglePaused() { + paused = !paused; + + log.info("{} the engine", paused ? "Pausing" : "Resuming"); + + return paused; + } + // TODO // It is supposed to be moved to the Context so that // user will be able to choose default window size, diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/core/engine/GameEngine.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/core/engine/GameEngine.java index 634a0163..acdd61ff 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/core/engine/GameEngine.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/core/engine/GameEngine.java @@ -4,4 +4,16 @@ import com.bartlomiejpluta.base.api.game.context.Context; public interface GameEngine { void start(Context context); + + void stop(); + + void pause(); + + void resume(); + + boolean isRunning(); + + boolean isPaused(); + + boolean togglePaused(); } diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/project/model/DefaultContext.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/project/model/DefaultContext.java index 792288a0..8c460358 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/project/model/DefaultContext.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/project/model/DefaultContext.java @@ -101,6 +101,36 @@ public class DefaultContext implements Context { return gui; } + @Override + public boolean isRunning() { + return engine.isRunning(); + } + + @Override + public void close() { + engine.stop(); + } + + @Override + public boolean isPaused() { + return engine.isPaused(); + } + + @Override + public void pause() { + engine.pause(); + } + + @Override + public void resume() { + engine.resume(); + } + + @Override + public boolean togglePause() { + return engine.togglePaused(); + } + @Override public void input(Screen screen) { gameRunner.input(screen); diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/ui/GLFWScreen.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/ui/GLFWScreen.java index c3b604de..55d5400d 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/ui/GLFWScreen.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/ui/GLFWScreen.java @@ -81,13 +81,6 @@ public class GLFWScreen implements Screen { GLFWScreen.this.size.y = height; }); - // Setup a key callback. It will be called every time a key is pressed, repeated or released. - glfwSetKeyCallback(windowHandle, (window, key, scancode, action, mods) -> { - if (key == GLFW_KEY_ESCAPE && action == GLFW_RELEASE) { - glfwSetWindowShouldClose(window, true); // We will detect this in the rendering loop - } - }); - // Get the resolution of the primary monitor GLFWVidMode videoMode = glfwGetVideoMode(glfwGetPrimaryMonitor());