title screen panner to track the ground better

This commit is contained in:
minjaesong
2021-09-09 14:38:47 +09:00
parent 9b53402ce0
commit 94a97193f9
4 changed files with 104 additions and 34 deletions

View File

@@ -63,32 +63,46 @@ class TitleScreen(batch: SpriteBatch) : IngameInstance(batch) {
private val cameraAI = object : ActorAI { private val cameraAI = object : ActorAI {
private var firstTime = true private var firstTime = true
private val lookaheadDist = 320.0 private val lookaheadDist = 100.0
override fun update(actor: Actor, delta: Float) { private fun getPointAt(px: Double): Float {
val actor = actor as CameraPlayer
val ww = TILE_SIZEF * demoWorld.width val ww = TILE_SIZEF * demoWorld.width
val x = px % ww
val px: Double = actor.hitbox.canonicalX val indexThis = ((x / ww * cameraNodes.size).floorInt()) fmod cameraNodes.size
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 xwstart: Float = indexThis.toFloat() / cameraNodes.size * ww val xwstart: Float = indexThis.toFloat() / cameraNodes.size * ww
val xwend: Float = ((indexThis + 1).toFloat() / cameraNodes.size) * ww val xwend: Float = ((indexThis + 1).toFloat() / cameraNodes.size) * ww
val xw: Float = xwend - xwstart 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) { if (firstTime) {
firstTime = false firstTime = false
actor.hitbox.setPositionY(y - 8.0) actor.hitbox.setPositionY(y - 8.0)
} }
else { 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() val uiContainer = UIContainer()
private lateinit var uiMenu: UICanvas private lateinit var uiMenu: UICanvas
internal lateinit var uiFakeBlurOverlay: UICanvas
private lateinit var worldFBO: FrameBuffer private lateinit var worldFBO: FrameBuffer
@@ -129,33 +144,29 @@ class TitleScreen(batch: SpriteBatch) : IngameInstance(batch) {
val tileXPos = (demoWorld.width.toFloat() * it / nodeCount).floorInt() val tileXPos = (demoWorld.width.toFloat() * it / nodeCount).floorInt()
var travelDownCounter = 0 var travelDownCounter = 0
while (travelDownCounter < demoWorld.height && while (travelDownCounter < demoWorld.height &&
!BlockCodex[demoWorld.getTileFromTerrain(tileXPos, travelDownCounter)].isSolid && !BlockCodex[demoWorld.getTileFromTerrain(tileXPos, travelDownCounter)].isSolid
!BlockCodex[demoWorld.getTileFromWall(tileXPos, travelDownCounter)].isSolid // !BlockCodex[demoWorld.getTileFromWall(tileXPos, travelDownCounter)].isSolid
) { ) {
travelDownCounter += 1 travelDownCounter += 2
} }
// println("Camera node #${it+1} = $travelDownCounter")
travelDownCounter * TILE_SIZEF travelDownCounter * TILE_SIZEF
} }
// apply gaussian blur to the camera nodes // apply gaussian blur to the camera nodes
for (i in cameraNodes.indices) { for (i in cameraNodes.indices) {
val offM3 = cameraNodes[(i-3) fmod cameraNodes.size] * 0.025f val offM2 = cameraNodes[(i-2) fmod cameraNodes.size] * 0.05f
val offM2 = cameraNodes[(i-2) fmod cameraNodes.size] * 0.11f val offM1 = cameraNodes[(i-1) fmod cameraNodes.size] * 0.2f
val offM1 = cameraNodes[(i-1) fmod cameraNodes.size] * 0.29f val off0 = cameraNodes[i] * 0.5f
val off0 = cameraNodes[i] * 0.15f val off1 = cameraNodes[(i+1) fmod cameraNodes.size] * 0.2f
val off1 = cameraNodes[(i+1) fmod cameraNodes.size] * 0.29f val off2 = cameraNodes[(i+2) fmod cameraNodes.size] * 0.05f
val off2 = cameraNodes[(i+2) fmod cameraNodes.size] * 0.11f
val off3 = cameraNodes[(i+3) fmod cameraNodes.size] * 0.025f
cameraNodes[i] = offM3 + offM2 + offM1 + off0 + off1 + off2 + off3 cameraNodes[i] = offM2 + offM1 + off0 + off1 + off2
// println(cameraNodes[i])
} }
cameraPlayer = CameraPlayer(demoWorld, cameraAI) cameraPlayer = CameraPlayer(demoWorld, cameraAI)
demoWorld.worldTime.timeDelta = 100 demoWorld.worldTime.timeDelta = 0// 100
IngameRenderer.setRenderedWorld(demoWorld) IngameRenderer.setRenderedWorld(demoWorld)
@@ -172,7 +183,13 @@ class TitleScreen(batch: SpriteBatch) : IngameInstance(batch) {
uiContainer.add(uiFakeGradOverlay) 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.setPosition(0, 0)
uiMenu.setAsOpen() uiMenu.setAsOpen()
@@ -432,7 +449,8 @@ class TitleScreen(batch: SpriteBatch) : IngameInstance(batch) {
if (currentBearing.isNaN()) currentBearing = bearing if (currentBearing.isNaN()) currentBearing = bearing
val v = actorValue.getAsDouble(AVKey.SPEED)!! 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)) hitbox.translate(v * cos(currentBearing), v * sin(currentBearing))
} }

View File

@@ -1,7 +1,9 @@
package net.torvald.terrarum package net.torvald.terrarum
import com.badlogic.gdx.graphics.Camera import com.badlogic.gdx.graphics.Camera
import com.badlogic.gdx.graphics.Color
import com.badlogic.gdx.graphics.g2d.SpriteBatch import com.badlogic.gdx.graphics.g2d.SpriteBatch
import net.torvald.terrarum.modulebasegame.IngameRenderer
import net.torvald.terrarum.ui.UICanvas import net.torvald.terrarum.ui.UICanvas
/** /**
@@ -39,3 +41,53 @@ class UIFakeGradOverlay : UICanvas() {
override fun endClosing(delta: Float) {} override fun endClosing(delta: Float) {}
override fun dispose() {} 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()
}
}

View File

@@ -8,6 +8,7 @@ import com.badlogic.gdx.graphics.g2d.SpriteBatch
import net.torvald.terrarum.App import net.torvald.terrarum.App
import net.torvald.terrarum.App.printdbgerr import net.torvald.terrarum.App.printdbgerr
import net.torvald.terrarum.QNDTreeNode import net.torvald.terrarum.QNDTreeNode
import net.torvald.terrarum.TitleScreen
import net.torvald.terrarum.Yaml import net.torvald.terrarum.Yaml
import net.torvald.terrarum.ui.UICanvas import net.torvald.terrarum.ui.UICanvas
import net.torvald.terrarum.ui.UIItemTextButton 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. * Created by minjaesong on 2018-08-29.
*/ */
open class UIRemoCon(treeRepresentation: QNDTreeNode<String>) : UICanvas() { open class UIRemoCon(val parent: TitleScreen, treeRepresentation: QNDTreeNode<String>) : UICanvas() {
override var openCloseTime = 0f override var openCloseTime = 0f
@@ -135,13 +136,14 @@ open class UIRemoCon(treeRepresentation: QNDTreeNode<String>) : UICanvas() {
//printdbg(this, "> ${it.first}") //printdbg(this, "> ${it.first}")
if (currentlySelectedRemoConItem == it.first) { if (currentlySelectedRemoConItem == it.first) {
parent.uiFakeBlurOverlay.setAsOpen()
it.second.setAsOpen() it.second.setAsOpen()
//printdbg(this, ">> ding - ${it.second.javaClass.canonicalName}") //printdbg(this, ">> ding - ${it.second.javaClass.canonicalName}")
} }
else { else {
it.second.setAsClose() it.second.setAsClose()
parent.uiFakeBlurOverlay.setAsClose()
} }
} }
} }

View File

@@ -3,10 +3,7 @@ package net.torvald.terrarum.modulebasegame.ui
import com.badlogic.gdx.graphics.Camera import com.badlogic.gdx.graphics.Camera
import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.Color
import com.badlogic.gdx.graphics.g2d.SpriteBatch import com.badlogic.gdx.graphics.g2d.SpriteBatch
import net.torvald.terrarum.App import net.torvald.terrarum.*
import net.torvald.terrarum.ModMgr
import net.torvald.terrarum.Second
import net.torvald.terrarum.blendNormal
import net.torvald.terrarum.ui.UICanvas import net.torvald.terrarum.ui.UICanvas
import net.torvald.terrarum.ui.UIItemList import net.torvald.terrarum.ui.UIItemList
import net.torvald.terrarum.ui.UIItemModuleInfoCell import net.torvald.terrarum.ui.UIItemModuleInfoCell
@@ -64,6 +61,7 @@ class UITitleModules : UICanvas() {
} }
override fun doOpening(delta: Float) { override fun doOpening(delta: Float) {
} }
override fun doClosing(delta: Float) { override fun doClosing(delta: Float) {