From 94a97193f9db635c5cbcc7aa905642294c7224bf Mon Sep 17 00:00:00 2001 From: minjaesong Date: Thu, 9 Sep 2021 14:38:47 +0900 Subject: [PATCH] title screen panner to track the ground better --- src/net/torvald/terrarum/TitleScreen.kt | 74 ++++++++++++------- src/net/torvald/terrarum/UIFakeGradOverlay.kt | 52 +++++++++++++ .../terrarum/modulebasegame/ui/UIRemoCon.kt | 6 +- .../modulebasegame/ui/UITitleModules.kt | 6 +- 4 files changed, 104 insertions(+), 34 deletions(-) diff --git a/src/net/torvald/terrarum/TitleScreen.kt b/src/net/torvald/terrarum/TitleScreen.kt index 1520e6621..deae3b2d1 100644 --- a/src/net/torvald/terrarum/TitleScreen.kt +++ b/src/net/torvald/terrarum/TitleScreen.kt @@ -63,32 +63,46 @@ class TitleScreen(batch: SpriteBatch) : IngameInstance(batch) { private val cameraAI = object : ActorAI { private var firstTime = true - private val lookaheadDist = 320.0 + private val lookaheadDist = 100.0 - override fun update(actor: Actor, delta: Float) { - val actor = actor as CameraPlayer + private fun getPointAt(px: Double): Float { val ww = TILE_SIZEF * demoWorld.width + val x = px % ww - val px: Double = actor.hitbox.canonicalX - val pxN = px + lookaheadDist * cos(actor.targetBearing) - val pxP = px - lookaheadDist * cos(actor.targetBearing) - - val indexThis = ((pxN / ww * cameraNodes.size).floorInt()) fmod cameraNodes.size - val indexNext = ((pxP / ww * cameraNodes.size).floorInt()) fmod cameraNodes.size + val indexThis = ((x / ww * cameraNodes.size).floorInt()) fmod cameraNodes.size val xwstart: Float = indexThis.toFloat() / cameraNodes.size * ww val xwend: Float = ((indexThis + 1).toFloat() / cameraNodes.size) * ww val xw: Float = xwend - xwstart + val xperc: Double = (x - xwstart) / xw - val xperc: Double = (px - xwstart) / xw + return FastMath.interpolateLinear(xperc.toFloat(), cameraNodes[indexThis], cameraNodes[(indexThis + 1) % cameraNodes.size]) + } - val y = FastMath.interpolateLinear(xperc.toFloat(), cameraNodes[indexThis], cameraNodes[indexNext]) + override fun update(actor: Actor, delta: Float) { + val ww = TILE_SIZEF * demoWorld.width + val actor = actor as CameraPlayer + + val px: Double = actor.hitbox.canonicalX + actor.actorValue.getAsDouble(AVKey.SPEED)!! + val pxP = px - lookaheadDist * cos(actor.targetBearing) + val pxN = px + lookaheadDist * cos(actor.targetBearing) + + val yP = getPointAt(pxP) + val yN = getPointAt(pxN) + + val y = (yP + yN) / 2f if (firstTime) { firstTime = false actor.hitbox.setPositionY(y - 8.0) } else { - actor.moveTo(pxN, y - 8.0) + //actor.moveTo(px, y - 8.0) + //actor.hitbox.setPosition(px, y - 8.0) + actor.moveTo(atan2((yN - yP).toDouble(), pxN - pxP)) + } + + if (actor.hitbox.canonicalX > ww) { + actor.hitbox.translatePosX(-ww.toDouble()) } } } @@ -100,6 +114,7 @@ class TitleScreen(batch: SpriteBatch) : IngameInstance(batch) { val uiContainer = UIContainer() private lateinit var uiMenu: UICanvas + internal lateinit var uiFakeBlurOverlay: UICanvas private lateinit var worldFBO: FrameBuffer @@ -129,33 +144,29 @@ class TitleScreen(batch: SpriteBatch) : IngameInstance(batch) { val tileXPos = (demoWorld.width.toFloat() * it / nodeCount).floorInt() var travelDownCounter = 0 while (travelDownCounter < demoWorld.height && - !BlockCodex[demoWorld.getTileFromTerrain(tileXPos, travelDownCounter)].isSolid && - !BlockCodex[demoWorld.getTileFromWall(tileXPos, travelDownCounter)].isSolid + !BlockCodex[demoWorld.getTileFromTerrain(tileXPos, travelDownCounter)].isSolid +// !BlockCodex[demoWorld.getTileFromWall(tileXPos, travelDownCounter)].isSolid ) { - travelDownCounter += 1 + travelDownCounter += 2 } -// println("Camera node #${it+1} = $travelDownCounter") travelDownCounter * TILE_SIZEF } // apply gaussian blur to the camera nodes for (i in cameraNodes.indices) { - val offM3 = cameraNodes[(i-3) fmod cameraNodes.size] * 0.025f - val offM2 = cameraNodes[(i-2) fmod cameraNodes.size] * 0.11f - val offM1 = cameraNodes[(i-1) fmod cameraNodes.size] * 0.29f - val off0 = cameraNodes[i] * 0.15f - val off1 = cameraNodes[(i+1) fmod cameraNodes.size] * 0.29f - val off2 = cameraNodes[(i+2) fmod cameraNodes.size] * 0.11f - val off3 = cameraNodes[(i+3) fmod cameraNodes.size] * 0.025f + val offM2 = cameraNodes[(i-2) fmod cameraNodes.size] * 0.05f + val offM1 = cameraNodes[(i-1) fmod cameraNodes.size] * 0.2f + val off0 = cameraNodes[i] * 0.5f + val off1 = cameraNodes[(i+1) fmod cameraNodes.size] * 0.2f + val off2 = cameraNodes[(i+2) fmod cameraNodes.size] * 0.05f - cameraNodes[i] = offM3 + offM2 + offM1 + off0 + off1 + off2 + off3 -// println(cameraNodes[i]) + cameraNodes[i] = offM2 + offM1 + off0 + off1 + off2 } cameraPlayer = CameraPlayer(demoWorld, cameraAI) - demoWorld.worldTime.timeDelta = 100 + demoWorld.worldTime.timeDelta = 0// 100 IngameRenderer.setRenderedWorld(demoWorld) @@ -172,7 +183,13 @@ class TitleScreen(batch: SpriteBatch) : IngameInstance(batch) { uiContainer.add(uiFakeGradOverlay) - uiMenu = UIRemoCon(UITitleRemoConYaml())//UITitleRemoConRoot() + // fake UI for blur + uiFakeBlurOverlay = UIFakeBlurOverlay() + uiFakeBlurOverlay.setPosition(0,0) + uiContainer.add(uiFakeBlurOverlay) + + + uiMenu = UIRemoCon(this, UITitleRemoConYaml())//UITitleRemoConRoot() uiMenu.setPosition(0, 0) uiMenu.setAsOpen() @@ -432,7 +449,8 @@ class TitleScreen(batch: SpriteBatch) : IngameInstance(batch) { if (currentBearing.isNaN()) currentBearing = bearing val v = actorValue.getAsDouble(AVKey.SPEED)!! - currentBearing = interpolateLinear(1.0 / 32.0, currentBearing, targetBearing) + //currentBearing = interpolateLinear(1.0 / 22.0, currentBearing, targetBearing) + currentBearing = targetBearing hitbox.translate(v * cos(currentBearing), v * sin(currentBearing)) } diff --git a/src/net/torvald/terrarum/UIFakeGradOverlay.kt b/src/net/torvald/terrarum/UIFakeGradOverlay.kt index 55729a494..2bbf246c1 100644 --- a/src/net/torvald/terrarum/UIFakeGradOverlay.kt +++ b/src/net/torvald/terrarum/UIFakeGradOverlay.kt @@ -1,7 +1,9 @@ package net.torvald.terrarum import com.badlogic.gdx.graphics.Camera +import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.g2d.SpriteBatch +import net.torvald.terrarum.modulebasegame.IngameRenderer import net.torvald.terrarum.ui.UICanvas /** @@ -38,4 +40,54 @@ class UIFakeGradOverlay : UICanvas() { override fun endOpening(delta: Float) {} override fun endClosing(delta: Float) {} override fun dispose() {} +} + +class UIFakeBlurOverlay : UICanvas() { + + override var width: Int + get() = App.scr.width + set(value) {} + + override var height: Int + get() = App.scr.height + set(value) {} + + override var openCloseTime: Second = 0f + + private val shaderBlur = App.loadShaderFromFile("assets/blur.vert", "assets/blur.frag") + + init { } + + private val blurRadius = 32f + private val darken = Color(0.5f, 0.5f, 0.5f, 1f) + + override fun updateUI(delta: Float) {} + override fun renderUI(batch: SpriteBatch, camera: Camera) { + /*for (i in 0 until 5) { + batch.shader = shaderBlur + shaderBlur.setUniformMatrix("u_projTrans", camera.combined) + shaderBlur.setUniformi("u_texture", 0) + shaderBlur.setUniformf("iResolution", width.toFloat(), height.toFloat()) + IngameRenderer.shaderBlur.setUniformf("flip", 1f) + if (i % 2 == 0) + IngameRenderer.shaderBlur.setUniformf("direction", blurRadius, 0f) + else + IngameRenderer.shaderBlur.setUniformf("direction", 0f, blurRadius) + + batch.fillRect(0f, 0f, width.toFloat(), height.toFloat()) + }*/ + blendMul(batch) + batch.color = darken + batch.fillRect(0f, 0f, width.toFloat(), height.toFloat()) + + blendNormal(batch) + } + + override fun doOpening(delta: Float) {} + override fun doClosing(delta: Float) {} + override fun endOpening(delta: Float) {} + override fun endClosing(delta: Float) {} + override fun dispose() { + shaderBlur.dispose() + } } \ No newline at end of file diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UIRemoCon.kt b/src/net/torvald/terrarum/modulebasegame/ui/UIRemoCon.kt index 0a6bd60ca..2954282ce 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UIRemoCon.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UIRemoCon.kt @@ -8,6 +8,7 @@ import com.badlogic.gdx.graphics.g2d.SpriteBatch import net.torvald.terrarum.App import net.torvald.terrarum.App.printdbgerr import net.torvald.terrarum.QNDTreeNode +import net.torvald.terrarum.TitleScreen import net.torvald.terrarum.Yaml import net.torvald.terrarum.ui.UICanvas import net.torvald.terrarum.ui.UIItemTextButton @@ -17,7 +18,7 @@ import net.torvald.terrarum.ui.UIItemTextButtonList.Companion.DEFAULT_LINE_HEIGH /** * Created by minjaesong on 2018-08-29. */ -open class UIRemoCon(treeRepresentation: QNDTreeNode) : UICanvas() { +open class UIRemoCon(val parent: TitleScreen, treeRepresentation: QNDTreeNode) : UICanvas() { override var openCloseTime = 0f @@ -135,13 +136,14 @@ open class UIRemoCon(treeRepresentation: QNDTreeNode) : UICanvas() { //printdbg(this, "> ${it.first}") if (currentlySelectedRemoConItem == it.first) { + parent.uiFakeBlurOverlay.setAsOpen() it.second.setAsOpen() - //printdbg(this, ">> ding - ${it.second.javaClass.canonicalName}") } else { it.second.setAsClose() + parent.uiFakeBlurOverlay.setAsClose() } } } diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UITitleModules.kt b/src/net/torvald/terrarum/modulebasegame/ui/UITitleModules.kt index e87b9e1b6..0e57c1d41 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UITitleModules.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UITitleModules.kt @@ -3,10 +3,7 @@ package net.torvald.terrarum.modulebasegame.ui import com.badlogic.gdx.graphics.Camera import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.g2d.SpriteBatch -import net.torvald.terrarum.App -import net.torvald.terrarum.ModMgr -import net.torvald.terrarum.Second -import net.torvald.terrarum.blendNormal +import net.torvald.terrarum.* import net.torvald.terrarum.ui.UICanvas import net.torvald.terrarum.ui.UIItemList import net.torvald.terrarum.ui.UIItemModuleInfoCell @@ -64,6 +61,7 @@ class UITitleModules : UICanvas() { } override fun doOpening(delta: Float) { + } override fun doClosing(delta: Float) {