From c13aebd3ba7999255ac05a81c4f3952e8eaa1827 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Wed, 27 Nov 2019 15:53:09 +0900 Subject: [PATCH] at least message shows on loadscreen does the transition works? --- src/net/torvald/terrarum/AppLoader.java | 30 +++++++++++++++---- src/net/torvald/terrarum/LoadScreenBase.kt | 5 ++-- src/net/torvald/terrarum/SanicLoadScreen.kt | 6 +++- .../terrarum/modulebasegame/TerrarumIngame.kt | 7 ++--- .../modulebasegame/WorldgenLoadScreen.kt | 23 +++++++++----- .../ui/UIProxyNewBuildingMaker.kt | 6 ++-- .../modulebasegame/ui/UIProxyNewRandomGame.kt | 3 +- .../modulebasegame/worldgenerator/Terragen.kt | 7 +++-- .../ThreadProcessNoiseLayers.kt | 4 +-- .../worldgenerator/WorldGenerator.kt | 9 +++--- .../modulebasegame/worldgenerator/Worldgen.kt | 4 +-- src/net/torvald/util/CircularArray.kt | 4 +-- 12 files changed, 70 insertions(+), 38 deletions(-) diff --git a/src/net/torvald/terrarum/AppLoader.java b/src/net/torvald/terrarum/AppLoader.java index 4a67bbe7c..2d7c57bb1 100644 --- a/src/net/torvald/terrarum/AppLoader.java +++ b/src/net/torvald/terrarum/AppLoader.java @@ -232,6 +232,7 @@ public class AppLoader implements ApplicationListener { private static com.badlogic.gdx.graphics.Color gradWhiteBottom = new com.badlogic.gdx.graphics.Color(0xd8d8d8ff); private static Screen currenScreen; + private static LoadScreenBase currentSetLoadScreen; public static int screenW = 0; public static int screenH = 0; public static int halfScreenW = 0; @@ -728,19 +729,38 @@ public class AppLoader implements ApplicationListener { if (currenScreen != null) currenScreen.resume(); } + public static LoadScreenBase getLoadScreen() { + return currentSetLoadScreen; + } + + public static void setLoadScreen(LoadScreenBase screen) { + currentSetLoadScreen = screen; + _setScr(screen); + } + public static void setScreen(Screen screen) { - printdbg("[AppLoader-Static]", "Changing screen to " + screen.getClass().getCanonicalName()); + if (screen instanceof LoadScreenBase) { + throw new RuntimeException( + "Loadscreen '" + screen.getClass().getSimpleName() + "' must be set with 'setLoadScreen()' method"); + } + + _setScr(screen); + } + + private static void _setScr(Screen screen) { + + printdbg("AppLoader-Static", "Changing screen to " + screen.getClass().getCanonicalName()); // this whole thing is directtly copied from com.badlogic.gdx.Game if (currenScreen != null) { - printdbg("[AppLoader-Static]", "Screen before change: " + currenScreen.getClass().getCanonicalName()); + printdbg("AppLoader-Static", "Screen before change: " + currenScreen.getClass().getCanonicalName()); currenScreen.hide(); currenScreen.dispose(); } else { - printdbg("[AppLoader-Static]", "Screen before change: null"); + printdbg("AppLoader-Static", "Screen before change: null"); } @@ -752,9 +772,9 @@ public class AppLoader implements ApplicationListener { System.gc(); - printdbg("[AppLoader-Static]", "Screen transition complete: " + currenScreen.getClass().getCanonicalName()); + printdbg("AppLoader-Static", "Screen transition complete: " + currenScreen.getClass().getCanonicalName()); } - + /** * Init stuffs which needs GL context */ diff --git a/src/net/torvald/terrarum/LoadScreenBase.kt b/src/net/torvald/terrarum/LoadScreenBase.kt index 7c94085dd..6290b94a3 100644 --- a/src/net/torvald/terrarum/LoadScreenBase.kt +++ b/src/net/torvald/terrarum/LoadScreenBase.kt @@ -3,9 +3,10 @@ package net.torvald.terrarum import com.badlogic.gdx.Gdx import com.badlogic.gdx.ScreenAdapter import com.badlogic.gdx.graphics.OrthographicCamera +import com.badlogic.gdx.utils.Disposable import net.torvald.util.CircularArray -open class LoadScreenBase : ScreenAdapter() { +open class LoadScreenBase : ScreenAdapter(), Disposable { open var screenToLoad: IngameInstance? = null open lateinit var screenLoadingThread: Thread @@ -64,7 +65,7 @@ open class LoadScreenBase : ScreenAdapter() { override fun render(delta: Float) { if (doContextChange) { Thread.sleep(80) - AppLoader.setScreen(LoadScreen.screenToLoad!!) + AppLoader.setScreen(screenToLoad!!) } } diff --git a/src/net/torvald/terrarum/SanicLoadScreen.kt b/src/net/torvald/terrarum/SanicLoadScreen.kt index 3fa96f28d..68925b587 100644 --- a/src/net/torvald/terrarum/SanicLoadScreen.kt +++ b/src/net/torvald/terrarum/SanicLoadScreen.kt @@ -14,7 +14,11 @@ import net.torvald.util.CircularArray /** * Created by minjaesong on 2017-07-13. */ -object LoadScreen : LoadScreenBase() { +object SanicLoadScreen : LoadScreenBase() { + + init { + AppLoader.disposableSingletonsPool.add(this) + } private var arrowObjPos = 0f // 0 means at starting position, regardless of screen position private var arrowObjGlideOffsetX = 0f diff --git a/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt b/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt index 4da04a5a1..70f89525d 100644 --- a/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt +++ b/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt @@ -27,7 +27,6 @@ import net.torvald.terrarum.modulebasegame.gameworld.WorldSimulator import net.torvald.terrarum.modulebasegame.ui.* import net.torvald.terrarum.modulebasegame.weather.WeatherMixer import net.torvald.terrarum.modulebasegame.worldgenerator.RoguelikeRandomiser -import net.torvald.terrarum.modulebasegame.worldgenerator.WorldGenerator import net.torvald.terrarum.modulebasegame.worldgenerator.Worldgen import net.torvald.terrarum.modulebasegame.worldgenerator.WorldgenParams import net.torvald.terrarum.ui.UICanvas @@ -226,7 +225,7 @@ open class TerrarumIngame(batch: SpriteBatch) : IngameInstance(batch) { printdbg(this, "loaded successfully.") } else { - LoadScreen.addMessage("Loading world from save") + AppLoader.getLoadScreen().addMessage("Loading world from save") gameworld = gameSaveData.world @@ -252,8 +251,8 @@ open class TerrarumIngame(batch: SpriteBatch) : IngameInstance(batch) { printdbg(this, "loaded successfully.") } else { - LoadScreen.addMessage("${AppLoader.GAME_NAME} version ${AppLoader.getVERSION_STRING()}") - LoadScreen.addMessage("Creating new world") + AppLoader.getLoadScreen().addMessage("${AppLoader.GAME_NAME} version ${AppLoader.getVERSION_STRING()}") + AppLoader.getLoadScreen().addMessage("Creating new world") // init map as chosen size diff --git a/src/net/torvald/terrarum/modulebasegame/WorldgenLoadScreen.kt b/src/net/torvald/terrarum/modulebasegame/WorldgenLoadScreen.kt index 04a1ffa0a..7c57c0077 100644 --- a/src/net/torvald/terrarum/modulebasegame/WorldgenLoadScreen.kt +++ b/src/net/torvald/terrarum/modulebasegame/WorldgenLoadScreen.kt @@ -20,7 +20,7 @@ class WorldgenLoadScreen(screenToBeLoaded: IngameInstance, worldwidth: Int, worl // a Class impl is chosen to make resize-handling easier, there's not much benefit making this a singleton anyway init { - screenToBeLoaded.world + AppLoader.disposableSingletonsPool.add(this) } private val world = screenToBeLoaded.world @@ -28,10 +28,10 @@ class WorldgenLoadScreen(screenToBeLoaded: IngameInstance, worldwidth: Int, worl companion object { private const val WIDTH_RATIO = 0.7 - private const val PREVIEW_UPDATE_RATE = 1/8f + private const val PREVIEW_UPDATE_RATE = 1 / 8f private val COL_WALL = Color.WHITE - private val COL_TERR = Color(.5f,.5f,.5f,1f) + private val COL_TERR = Color(.5f, .5f, .5f, 1f) private val COL_AIR = Color.BLACK } @@ -54,24 +54,34 @@ class WorldgenLoadScreen(screenToBeLoaded: IngameInstance, worldwidth: Int, worl } override fun render(delta: Float) { - previewTexture.dispose() - previewTexture = Texture(previewPixmap) + //println("WorldgenLoadScreenRender") - // + gdxClearAndSetBlend(.094f, .094f, .094f, 0f) previewRenderCounter += delta if (previewRenderCounter >= PREVIEW_UPDATE_RATE) { previewRenderCounter -= PREVIEW_UPDATE_RATE renderToPreview() + previewTexture.dispose() + previewTexture = Texture(previewPixmap) } + AppLoader.batch.inUse { + it.color = Color.WHITE it.draw(previewTexture, (AppLoader.screenW - previewWidth).div(2f).round(), (AppLoader.screenH - previewHeight.times(1.5f)).div(2f).round() ) + val text = messages.getHeadElem() ?: "" + AppLoader.fontGame.draw(it, + text, + (AppLoader.screenW - AppLoader.fontGame.getWidth(text)).div(2f).round(), + (AppLoader.screenH + previewHeight.times(1.5f)).div(2f).round() - AppLoader.fontGame.lineHeight + ) } + super.render(delta) } @@ -92,7 +102,6 @@ class WorldgenLoadScreen(screenToBeLoaded: IngameInstance, worldwidth: Int, worl override fun addMessage(msg: String) { super.addMessage(msg) - println("[WorldgenLoadScreen] $msg") } override fun dispose() { diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UIProxyNewBuildingMaker.kt b/src/net/torvald/terrarum/modulebasegame/ui/UIProxyNewBuildingMaker.kt index 6bd969870..4326563b3 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UIProxyNewBuildingMaker.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UIProxyNewBuildingMaker.kt @@ -3,7 +3,7 @@ package net.torvald.terrarum.modulebasegame.ui import com.badlogic.gdx.graphics.Camera import com.badlogic.gdx.graphics.g2d.SpriteBatch import net.torvald.terrarum.AppLoader -import net.torvald.terrarum.LoadScreen +import net.torvald.terrarum.SanicLoadScreen import net.torvald.terrarum.Second import net.torvald.terrarum.Terrarum import net.torvald.terrarum.modulebasegame.BuildingMaker @@ -35,8 +35,8 @@ class UIProxyNewBuildingMaker : UICanvas() { val ingame = BuildingMaker(AppLoader.batch) Terrarum.setCurrentIngameInstance(ingame) - LoadScreen.screenToLoad = ingame - AppLoader.setScreen(LoadScreen) + SanicLoadScreen.screenToLoad = ingame + AppLoader.setScreen(SanicLoadScreen) } override fun endClosing(delta: Float) { diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UIProxyNewRandomGame.kt b/src/net/torvald/terrarum/modulebasegame/ui/UIProxyNewRandomGame.kt index 755db82e0..5bf24da12 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UIProxyNewRandomGame.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UIProxyNewRandomGame.kt @@ -5,7 +5,6 @@ import com.badlogic.gdx.graphics.g2d.SpriteBatch import net.torvald.random.HQRNG import net.torvald.terrarum.AppLoader import net.torvald.terrarum.AppLoader.printdbg -import net.torvald.terrarum.LoadScreen import net.torvald.terrarum.Second import net.torvald.terrarum.Terrarum import net.torvald.terrarum.modulebasegame.TerrarumIngame @@ -48,7 +47,7 @@ class UIProxyNewRandomGame : UICanvas() { //LoadScreen.screenToLoad = ingame //AppLoader.setScreen(LoadScreen) val loadScreen = WorldgenLoadScreen(ingame, worldParam.width, worldParam.height) - AppLoader.setScreen(loadScreen) + AppLoader.setLoadScreen(loadScreen) } override fun endClosing(delta: Float) { diff --git a/src/net/torvald/terrarum/modulebasegame/worldgenerator/Terragen.kt b/src/net/torvald/terrarum/modulebasegame/worldgenerator/Terragen.kt index 04bf1b26c..bf80f4a17 100644 --- a/src/net/torvald/terrarum/modulebasegame/worldgenerator/Terragen.kt +++ b/src/net/torvald/terrarum/modulebasegame/worldgenerator/Terragen.kt @@ -4,7 +4,6 @@ import com.sudoplay.joise.Joise import com.sudoplay.joise.module.* import net.torvald.terrarum.AppLoader import net.torvald.terrarum.AppLoader.printdbg -import net.torvald.terrarum.LoadScreen import net.torvald.terrarum.blockproperties.Block import net.torvald.terrarum.concurrent.ThreadExecutor import net.torvald.terrarum.gameworld.GameWorld @@ -31,8 +30,10 @@ class Terragen(world: GameWorld, seed: Long, params: Any) : Gen(world, seed, par genFuture = ThreadExecutor.submit { for (x in 0 until world.width) { - if (AppLoader.IS_DEVELOPMENT_BUILD) - LoadScreen.addMessage("Tile draw for x=$x") + if (AppLoader.IS_DEVELOPMENT_BUILD) { + AppLoader.getLoadScreen().addMessage("Tile draw for x=$x") + //println("Tile draw for x=$x") + } for (y in 0 until world.height) { val sampleTheta = (x.toDouble() / world.width) * TWO_PI diff --git a/src/net/torvald/terrarum/modulebasegame/worldgenerator/ThreadProcessNoiseLayers.kt b/src/net/torvald/terrarum/modulebasegame/worldgenerator/ThreadProcessNoiseLayers.kt index 4a344c714..62e84e95a 100644 --- a/src/net/torvald/terrarum/modulebasegame/worldgenerator/ThreadProcessNoiseLayers.kt +++ b/src/net/torvald/terrarum/modulebasegame/worldgenerator/ThreadProcessNoiseLayers.kt @@ -1,6 +1,6 @@ package net.torvald.terrarum.modulebasegame.worldgenerator -import net.torvald.terrarum.LoadScreen +import net.torvald.terrarum.AppLoader /** * Created by minjaesong on 2016-06-13. @@ -12,7 +12,7 @@ class ThreadProcessNoiseLayers(val startIndex: Int, val endIndex: Int, override fun run() { for (record in noiseRecords) { println("[mapgenerator] ${record.message}...") - LoadScreen.addMessage("${record.message}...") + AppLoader.getLoadScreen().addMessage("${record.message}...") for (y in startIndex..endIndex) { for (x in 0..WorldGenerator.WIDTH - 1) { diff --git a/src/net/torvald/terrarum/modulebasegame/worldgenerator/WorldGenerator.kt b/src/net/torvald/terrarum/modulebasegame/worldgenerator/WorldGenerator.kt index d2dd174d9..680c66a77 100644 --- a/src/net/torvald/terrarum/modulebasegame/worldgenerator/WorldGenerator.kt +++ b/src/net/torvald/terrarum/modulebasegame/worldgenerator/WorldGenerator.kt @@ -6,7 +6,6 @@ import com.sudoplay.joise.module.* import net.torvald.random.HQRNG import net.torvald.terrarum.AppLoader import net.torvald.terrarum.AppLoader.printdbg -import net.torvald.terrarum.LoadScreen import net.torvald.terrarum.blockproperties.Block import net.torvald.terrarum.blockproperties.BlockCodex import net.torvald.terrarum.concurrent.ThreadParallel @@ -492,7 +491,7 @@ object WorldGenerator { // fill the area as Joise map printdbg(this, "Raising and eroding terrain...") - LoadScreen.addMessage("Raising and eroding terrain...") + AppLoader.getLoadScreen().addMessage("Raising and eroding terrain...") for (y in 0..(TERRAIN_UNDULATION - 1)) { for (x in 0..WIDTH) { // straight-line sampling @@ -603,7 +602,7 @@ object WorldGenerator { private fun fillMapByNoiseMap() { printdbg(this, "Shaping world...") - LoadScreen.addMessage("Reticulating splines...") // RETICULATING SPLINES + AppLoader.getLoadScreen().addMessage("Reticulating splines...") // RETICULATING SPLINES // generate dirt-stone transition line // use catmull spline val dirtStoneLine = IntArray(WIDTH) @@ -798,7 +797,7 @@ object WorldGenerator { private fun generateFloatingIslands() { printdbg(this, "Placing floating islands...") - LoadScreen.addMessage("Placing floating islands...") + AppLoader.getLoadScreen().addMessage("Placing floating islands...") val nIslandsMax = Math.round(world.width * 6f / 8192f) val nIslandsMin = Math.max(2, Math.round(world.width * 4f / 8192f)) @@ -845,7 +844,7 @@ object WorldGenerator { private fun plantGrass() { printdbg(this, "Planting grass...") - LoadScreen.addMessage("Planting grass...") + AppLoader.getLoadScreen().addMessage("Planting grass...") /* TODO composing dirt and stone * over certain level, use background dirt with stone 'peckles' diff --git a/src/net/torvald/terrarum/modulebasegame/worldgenerator/Worldgen.kt b/src/net/torvald/terrarum/modulebasegame/worldgenerator/Worldgen.kt index 948c44e91..1b45e353d 100644 --- a/src/net/torvald/terrarum/modulebasegame/worldgenerator/Worldgen.kt +++ b/src/net/torvald/terrarum/modulebasegame/worldgenerator/Worldgen.kt @@ -1,7 +1,7 @@ package net.torvald.terrarum.modulebasegame.worldgenerator +import net.torvald.terrarum.AppLoader import net.torvald.terrarum.AppLoader.printdbg -import net.torvald.terrarum.LoadScreen import net.torvald.terrarum.gameworld.GameWorld /** @@ -33,7 +33,7 @@ object Worldgen { val it = jobs[i] - LoadScreen.addMessage(it.loadingScreenName) + AppLoader.getLoadScreen().addMessage(it.loadingScreenName) it.theWork.run() // wait diff --git a/src/net/torvald/util/CircularArray.kt b/src/net/torvald/util/CircularArray.kt index fd54ef0cb..fd1078c71 100644 --- a/src/net/torvald/util/CircularArray.kt +++ b/src/net/torvald/util/CircularArray.kt @@ -118,9 +118,9 @@ class CircularArray(val size: Int, val overwriteOnOverflow: Boolean): Iterabl } /** Returns the youngest (last of the array) element */ - fun getHeadElem(): T = if (isEmpty) throw EmptyStackException() else buffer[(head - 1).wrap()] + fun getHeadElem(): T? = if (isEmpty) null else buffer[(head - 1).wrap()] /** Returns the oldest (first of the array) element */ - fun getTailElem(): T = buffer[tail] + fun getTailElem(): T? = if (isEmpty) null else buffer[tail] /** * Relative-indexed get. Index of zero will return the head element.