DEADSOFTWARE

Support window resizing
authorfredboy <fredboy@protonmail.com>
Tue, 1 Jul 2025 12:12:14 +0000 (19:12 +0700)
committerfredboy <fredboy@protonmail.com>
Tue, 1 Jul 2025 12:12:14 +0000 (19:12 +0700)
core/data/configuration/src/main/kotlin/ru/fredboy/cavedroid/data/configuration/repository/ApplicationContextRepositoryImpl.kt
core/domain/configuration/src/main/kotlin/ru/fredboy/cavedroid/domain/configuration/model/CameraContext.kt
core/ux/rendering/src/main/java/ru/fredboy/cavedroid/ux/rendering/GameRenderer.java
core/zygote/src/main/java/ru/fredboy/cavedroid/zygote/game/GameProc.java
core/zygote/src/main/kotlin/ru/fredboy/cavedroid/zygote/base/BaseScreen.kt [new file with mode: 0644]
core/zygote/src/main/kotlin/ru/fredboy/cavedroid/zygote/game/GameScreen.kt
core/zygote/src/main/kotlin/ru/fredboy/cavedroid/zygote/game/di/GameComponent.kt
core/zygote/src/main/kotlin/ru/fredboy/cavedroid/zygote/menu/MenuScreen.kt
core/zygote/src/main/kotlin/ru/fredboy/cavedroid/zygote/menu/renderer/MenuRenderer.kt

index dd89f2e7c1675d83ccfc2588091fb45d47702f68..1d98372e9a49f134d0d5bcad15e3828126744f40 100644 (file)
@@ -31,14 +31,16 @@ class ApplicationContextRepositoryImpl @Inject constructor(
     }
 
     override fun setFullscreen(fullscreen: Boolean) {
-        if (Gdx.app.type != Application.ApplicationType.Desktop) {
+        if (!Gdx.graphics.supportsDisplayModeChange()) {
             return
         }
 
         if (fullscreen) {
             Gdx.graphics.setFullscreenMode(Gdx.graphics.displayMode);
         } else {
-            Gdx.graphics.setWindowedMode(2 * getWidth().toInt(), 2 * getHeight().toInt())
+            Gdx.graphics.setWindowedMode(960, 540)
+            setWidth(Gdx.graphics.width.toFloat() / 2)
+            setHeight(Gdx.graphics.height.toFloat() / 2)
         }
         applicationContextStore.isFullscreen = fullscreen
     }
index f97bac184f89937a32561f7faee32b474fc3998e..7a8603e752cab7a0de59a94b6967fa8f4144accd 100644 (file)
@@ -1,12 +1,12 @@
 package ru.fredboy.cavedroid.domain.configuration.model
 
 import com.badlogic.gdx.Gdx
-import com.badlogic.gdx.graphics.Camera
+import com.badlogic.gdx.graphics.OrthographicCamera
 import com.badlogic.gdx.math.Rectangle
 
 data class CameraContext(
     val viewport: Rectangle,
-    val camera: Camera,
+    val camera: OrthographicCamera,
 ) {
 
     fun xOnViewport(x: Int) = viewport.width / Gdx.graphics.width * x.toFloat()
index 190dda9c54df6411645216f4d469fac146847019..f8495244884ae33f688846f71e6d3a8c7634b2f8 100644 (file)
@@ -238,6 +238,11 @@ public class GameRenderer {
         }
     }
 
+    public void onResize() {
+        spriter.setProjectionMatrix(mGameContextRepository.getCameraContext().getCamera().combined);
+        shaper.setProjectionMatrix(mGameContextRepository.getCameraContext().getCamera().combined);
+    }
+
     public void render(float delta) {
         updateCameraPosition(delta);
 
index 10a729351f6860aa9f5c2e08d9c8caefe1c02c2f..44099cb86138a62c1f7958c0e31192c19c81e6cb 100644 (file)
@@ -73,6 +73,10 @@ public class GameProc implements Disposable {
         mContainerController.update(delta);
     }
 
+    public void onResize() {
+        mGameRenderer.onResize();
+    }
+
     public void show() {
         Gdx.input.setInputProcessor(mGameInputProcessor);
     }
diff --git a/core/zygote/src/main/kotlin/ru/fredboy/cavedroid/zygote/base/BaseScreen.kt b/core/zygote/src/main/kotlin/ru/fredboy/cavedroid/zygote/base/BaseScreen.kt
new file mode 100644 (file)
index 0000000..4f12848
--- /dev/null
@@ -0,0 +1,15 @@
+package ru.fredboy.cavedroid.zygote.base
+
+import com.badlogic.gdx.Screen
+import ru.fredboy.cavedroid.domain.configuration.repository.ApplicationContextRepository
+
+abstract class BaseScreen(
+    private val applicationContextRepository: ApplicationContextRepository,
+) : Screen {
+
+    override fun resize(width: Int, height: Int) {
+        applicationContextRepository.setWidth(width.toFloat() / 2)
+        applicationContextRepository.setHeight(height.toFloat() / 2)
+    }
+
+}
\ No newline at end of file
index f7e229918dc483f0c45399c92f87efb468274af0..4e3d85cd3e232481601a1a2225fc67196ad2ef2d 100644 (file)
@@ -1,7 +1,6 @@
 package ru.fredboy.cavedroid.zygote.game
 
 import com.badlogic.gdx.Gdx
-import com.badlogic.gdx.Screen
 import com.badlogic.gdx.graphics.OrthographicCamera
 import com.badlogic.gdx.math.Rectangle
 import ru.fredboy.cavedroid.common.model.Joystick
@@ -10,6 +9,7 @@ import ru.fredboy.cavedroid.domain.configuration.model.CameraContext
 import ru.fredboy.cavedroid.domain.configuration.repository.ApplicationContextRepository
 import ru.fredboy.cavedroid.entity.mob.model.Player
 import ru.fredboy.cavedroid.zygote.CaveDroidApplication
+import ru.fredboy.cavedroid.zygote.base.BaseScreen
 import ru.fredboy.cavedroid.zygote.game.di.DaggerGameComponent
 import ru.fredboy.cavedroid.zygote.game.di.GameComponent
 import javax.inject.Inject
@@ -18,9 +18,9 @@ import javax.inject.Singleton
 @Singleton
 class GameScreen @Inject constructor(
     private val applicationContextRepository: ApplicationContextRepository,
-) : Screen {
+) : BaseScreen(applicationContextRepository) {
 
-    private var gameProc: GameProc? = null
+    private var gameComponent: GameComponent? = null
 
     private fun getGameContext(isLoadGame: Boolean): GameContext {
         return GameContext(
@@ -55,39 +55,53 @@ class GameScreen @Inject constructor(
             .build()
     }
 
-    private fun resetGameProc() {
-        gameProc?.dispose()
-        gameProc = null
+    private fun resetGameComponent() {
+        gameComponent?.gameProc?.dispose()
+        gameComponent = null
     }
 
     fun newGame(gameMode: Int) {
-        resetGameProc()
-        gameProc = getGameComponent(false).gameProc.apply {
-            setPlayerGameMode(gameMode)
+        resetGameComponent()
+        gameComponent = getGameComponent(false).apply {
+            gameProc.setPlayerGameMode(gameMode)
         }
     }
 
     fun loadGame() {
-        resetGameProc()
-        gameProc = getGameComponent(true).gameProc
+        resetGameComponent()
+        gameComponent = getGameComponent(true)
     }
 
     override fun show() {
-        val proc = requireNotNull(gameProc) {
-            "GameScreen#show: gameProc was not set before show"
+        val proc = requireNotNull(gameComponent?.gameProc) {
+            "GameScreen#show: gameComponent was not set before show"
         }
         proc.show()
     }
 
     override fun render(delta: Float) {
-        val proc = requireNotNull(gameProc) {
-            "GameScreen#render: gameProc was not set before render"
+        val proc = requireNotNull(gameComponent?.gameProc) {
+            "GameScreen#render: gameComponent was not set before render"
         }
         proc.update(delta)
     }
 
     override fun resize(width: Int, height: Int) {
+        super.resize(width, height)
+
+        gameComponent?.gameContextRepository?.getCameraContext()?.let { cameraContext ->
+            cameraContext.viewport.apply {
+                setWidth(applicationContextRepository.getWidth())
+                setHeight(applicationContextRepository.getHeight())
+            }
+            cameraContext.camera.setToOrtho(
+                /* yDown = */ true,
+                /* viewportWidth = */ applicationContextRepository.getWidth(),
+                /* viewportHeight = */ applicationContextRepository.getHeight(),
+            )
+        }
 
+        gameComponent?.gameProc?.onResize()
     }
 
     override fun pause() {
@@ -103,6 +117,6 @@ class GameScreen @Inject constructor(
     }
 
     override fun dispose() {
-        resetGameProc()
+        resetGameComponent()
     }
 }
\ No newline at end of file
index 8d9e9f7960154d3777f92ea8d03c8249bff89406..b1f48de6b4310c2e23dc109fd67391106db0bc2d 100644 (file)
@@ -6,6 +6,7 @@ import ru.deadsoftware.cavedroid.generated.module.*
 import ru.fredboy.cavedroid.common.di.GameScope
 import ru.fredboy.cavedroid.data.configuration.di.GameContextModule
 import ru.fredboy.cavedroid.data.configuration.model.GameContext
+import ru.fredboy.cavedroid.domain.configuration.repository.GameContextRepository
 import ru.fredboy.cavedroid.game.controller.container.di.ControllerContainerModule
 import ru.fredboy.cavedroid.game.controller.drop.di.ControllerDropModule
 import ru.fredboy.cavedroid.game.controller.mob.di.MobControllerModule
@@ -36,6 +37,8 @@ interface GameComponent {
 
     val gameProc: GameProc
 
+    val gameContextRepository: GameContextRepository
+
     @Component.Builder
     interface Builder {
 
index 52133485ccd4fad3c834e7e9739a73d1bd656ead..85481adeaea0128e29deecb33de483d902ba98ae 100644 (file)
@@ -1,9 +1,10 @@
 package ru.fredboy.cavedroid.zygote.menu
 
 import com.badlogic.gdx.Gdx
-import com.badlogic.gdx.Screen
+import ru.fredboy.cavedroid.domain.configuration.repository.ApplicationContextRepository
 import ru.fredboy.cavedroid.domain.menu.repository.MenuButtonRepository
 import ru.fredboy.cavedroid.zygote.CaveDroidApplication
+import ru.fredboy.cavedroid.zygote.base.BaseScreen
 import ru.fredboy.cavedroid.zygote.menu.di.DaggerMenuComponent
 import ru.fredboy.cavedroid.zygote.menu.di.MenuComponent
 import ru.fredboy.cavedroid.zygote.menu.input.MenuInputProcessor
@@ -12,7 +13,9 @@ import javax.inject.Inject
 import javax.inject.Singleton
 
 @Singleton
-class MenuScreen @Inject constructor() : Screen {
+class MenuScreen @Inject constructor(
+    applicationContextRepository: ApplicationContextRepository,
+) : BaseScreen(applicationContextRepository) {
 
     private val menuRenderer: MenuRenderer
 
@@ -44,6 +47,8 @@ class MenuScreen @Inject constructor() : Screen {
     }
 
     override fun resize(width: Int, height: Int) {
+        super.resize(width, height)
+        menuRenderer.onResize()
     }
 
     override fun pause() {
index 959f786082da584a09fd878677d85689435ae357..8401e30da0ab013626a949203959c9f67f141ec3 100644 (file)
@@ -121,6 +121,15 @@ class MenuRenderer @Inject constructor(
         )
     }
 
+    fun onResize() {
+        camera.setToOrtho(
+            /* yDown = */ true,
+            /* viewportWidth = */ applicationContextRepository.getWidth(),
+            /* viewportHeight = */ applicationContextRepository.getHeight(),
+        )
+        spriter.projectionMatrix = camera.combined
+    }
+
     fun render(delta: Float) {
         spriter.begin()
         drawBackground()