mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-06-12 11:34:05 +09:00
title screen panner to track the ground better
This commit is contained in:
@@ -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))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -38,4 +40,54 @@ class UIFakeGradOverlay : UICanvas() {
|
|||||||
override fun endOpening(delta: Float) {}
|
override fun endOpening(delta: Float) {}
|
||||||
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()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user