vanishing particle test

This commit is contained in:
minjaesong
2021-08-17 15:31:00 +09:00
parent 74ae35e9a9
commit 42c09640d0
10 changed files with 121 additions and 15 deletions

View File

@@ -103,6 +103,9 @@ class Hitbox (x1: Double, y1: Double, width: Double, height: Double, var suppres
fun setPositionX(x: Double) = setPosition(x, startY) fun setPositionX(x: Double) = setPosition(x, startY)
fun setPositionY(y: Double) = setPosition(startX, y) fun setPositionY(y: Double) = setPosition(startX, y)
/**
* Set position from bottom-centre point
*/
fun setPositionFromPointed(x1: Double, y1: Double): Hitbox { fun setPositionFromPointed(x1: Double, y1: Double): Hitbox {
hitboxStart = Point2d(x1 - width / 2, y1 - height) hitboxStart = Point2d(x1 - width / 2, y1 - height)
return this return this

View File

@@ -1,9 +1,9 @@
package net.torvald.terrarum.modulebasegame.gameactors package net.torvald.terrarum.gameparticles
import com.badlogic.gdx.graphics.Color
import com.badlogic.gdx.graphics.g2d.SpriteBatch import com.badlogic.gdx.graphics.g2d.SpriteBatch
import com.badlogic.gdx.graphics.g2d.TextureRegion import com.badlogic.gdx.graphics.g2d.TextureRegion
import net.torvald.terrarum.* import net.torvald.terrarum.*
import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE
import net.torvald.terrarum.blockproperties.Block import net.torvald.terrarum.blockproperties.Block
import net.torvald.terrarum.blockproperties.BlockCodex import net.torvald.terrarum.blockproperties.BlockCodex
import net.torvald.terrarum.gameactors.Actor import net.torvald.terrarum.gameactors.Actor
@@ -25,8 +25,9 @@ open class ParticleBase(renderOrder: Actor.RenderOrder, val despawnUponCollision
var isNoSubjectToGrav = false var isNoSubjectToGrav = false
var dragCoefficient = 3.0 var dragCoefficient = 3.0
private val lifetimeMax = maxLifeTime ?: 5f val lifetimeMax = maxLifeTime ?: 5f
private var lifetimeCounter = 0f var lifetimeCounter = 0f
protected set
val velocity = Vector2(0.0, 0.0) val velocity = Vector2(0.0, 0.0)
val hitbox = Hitbox(0.0, 0.0, 0.0, 0.0) val hitbox = Hitbox(0.0, 0.0, 0.0, 0.0)
@@ -34,19 +35,21 @@ open class ParticleBase(renderOrder: Actor.RenderOrder, val despawnUponCollision
open lateinit var body: TextureRegion // you might want to use SpriteAnimation open lateinit var body: TextureRegion // you might want to use SpriteAnimation
open var glow: TextureRegion? = null open var glow: TextureRegion? = null
val drawColour = Color(1f, 1f, 1f, 1f)
init { init {
} }
fun update(delta: Float) { open fun update(delta: Float) {
if (!flagDespawn) { if (!flagDespawn) {
lifetimeCounter += delta lifetimeCounter += delta
if (despawnUponCollision) { if (despawnUponCollision) {
if (velocity.isZero || if (velocity.isZero ||
// simple stuck check // simple stuck check
BlockCodex[(Terrarum.ingame!!.world).getTileFromTerrain( BlockCodex[(Terrarum.ingame!!.world).getTileFromTerrain(
hitbox.canonicalX.div(TILE_SIZE).floorInt(), hitbox.canonicalX.div(TerrarumAppConfiguration.TILE_SIZE).floorInt(),
hitbox.canonicalY.div(TILE_SIZE).floorInt() hitbox.canonicalY.div(TerrarumAppConfiguration.TILE_SIZE).floorInt()
) ?: Block.STONE].isSolid) { ) ?: Block.STONE].isSolid) {
flagDespawn = true flagDespawn = true
} }
@@ -67,15 +70,21 @@ open class ParticleBase(renderOrder: Actor.RenderOrder, val despawnUponCollision
} }
} }
fun drawBody(batch: SpriteBatch) { open fun drawBody(batch: SpriteBatch) {
if (!flagDespawn) { if (!flagDespawn) {
batch.color = drawColour
batch.draw(body, hitbox.startX.toFloat(), hitbox.startY.toFloat(), hitbox.width.toFloat(), hitbox.height.toFloat()) batch.draw(body, hitbox.startX.toFloat(), hitbox.startY.toFloat(), hitbox.width.toFloat(), hitbox.height.toFloat())
} }
} }
fun drawGlow(batch: SpriteBatch) { open fun drawGlow(batch: SpriteBatch) {
if (!flagDespawn && glow != null) { if (!flagDespawn && glow != null) {
batch.color = drawColour
batch.draw(glow, hitbox.startX.toFloat(), hitbox.startY.toFloat(), hitbox.width.toFloat(), hitbox.height.toFloat()) batch.draw(glow, hitbox.startX.toFloat(), hitbox.startY.toFloat(), hitbox.width.toFloat(), hitbox.height.toFloat())
} }
} }
open fun dispose() {
}
} }

View File

@@ -0,0 +1,58 @@
package net.torvald.terrarum.gameparticles
import com.badlogic.gdx.graphics.g2d.SpriteBatch
import com.badlogic.gdx.graphics.g2d.TextureRegion
import net.torvald.terrarum.gameactors.Actor
import net.torvald.terrarum.imagefont.TinyAlphNum
/**
* @param tex image
* @param x x-coord of the particle's initial spawn position, bottom-centre
* @param y y-coord of the particle's initial spawn position, bottom-centre
*/
open class ParticleVanishingTexture(val tex: TextureRegion, x: Double, y: Double) : ParticleBase(Actor.RenderOrder.OVERLAY, false, 2f) {
init {
velocity.set(0.0, -1.0)
hitbox.setDimension(2.0, 2.0)
hitbox.setPositionFromPointed(x, y)
body = tex
isNoSubjectToGrav = true
}
override fun update(delta: Float) {
super.update(delta)
drawColour.a = (lifetimeMax - lifetimeCounter) / lifetimeMax
}
}
class ParticleVanishingText(val text: String, x: Double, y: Double) : ParticleBase(Actor.RenderOrder.OVERLAY, false, 2f) {
private val lines = text.split('\n')
init {
velocity.set(0.0, -1.0)
hitbox.setDimension(lines.maxOf { TinyAlphNum.getWidth(it) }.toDouble(), lines.size * TinyAlphNum.H.toDouble())
hitbox.setPositionFromPointed(x, y)
isNoSubjectToGrav = true
}
override fun update(delta: Float) {
super.update(delta)
drawColour.a = (lifetimeMax - lifetimeCounter) / lifetimeMax
}
override fun drawBody(batch: SpriteBatch) {
if (!flagDespawn) {
batch.color = drawColour
lines.forEachIndexed { index, line ->
TinyAlphNum.draw(batch, line, hitbox.startX.toFloat(), hitbox.startY.toFloat() + TinyAlphNum.H * index)
}
}
}
}

View File

@@ -24,7 +24,13 @@ object TinyAlphNum : BitmapFont() {
} }
fun getWidth(str: String): Int { fun getWidth(str: String): Int {
return W * str.length var l = 0
for (char in str) {
if (!isColourCodeHigh(char) && !isColourCodeLow(char)) {
l += 1
}
}
return W * l
} }
lateinit var colMain: Color lateinit var colMain: Color

View File

@@ -19,7 +19,7 @@ import net.torvald.terrarum.gameactors.ActorWithBody
import net.torvald.terrarum.gamecontroller.KeyToggler import net.torvald.terrarum.gamecontroller.KeyToggler
import net.torvald.terrarum.gameworld.GameWorld import net.torvald.terrarum.gameworld.GameWorld
import net.torvald.terrarum.gameworld.fmod import net.torvald.terrarum.gameworld.fmod
import net.torvald.terrarum.modulebasegame.gameactors.ParticleBase import net.torvald.terrarum.gameparticles.ParticleBase
import net.torvald.terrarum.weather.WeatherMixer import net.torvald.terrarum.weather.WeatherMixer
import net.torvald.terrarum.ui.UICanvas import net.torvald.terrarum.ui.UICanvas
import net.torvald.terrarum.worlddrawer.* import net.torvald.terrarum.worlddrawer.*

View File

@@ -24,6 +24,7 @@ import net.torvald.terrarum.gameitem.GameItem
import net.torvald.terrarum.itemproperties.ItemCodex import net.torvald.terrarum.itemproperties.ItemCodex
import net.torvald.terrarum.console.AVTracker import net.torvald.terrarum.console.AVTracker
import net.torvald.terrarum.console.ActorsList import net.torvald.terrarum.console.ActorsList
import net.torvald.terrarum.gameparticles.ParticleBase
import net.torvald.terrarum.gameactors.WireActor import net.torvald.terrarum.gameactors.WireActor
import net.torvald.terrarum.gameworld.GameWorld import net.torvald.terrarum.gameworld.GameWorld
import net.torvald.terrarum.modulebasegame.gameactors.* import net.torvald.terrarum.modulebasegame.gameactors.*
@@ -38,7 +39,6 @@ import net.torvald.terrarum.modulebasegame.worldgenerator.WorldgenParams
import net.torvald.terrarum.ui.UICanvas import net.torvald.terrarum.ui.UICanvas
import net.torvald.terrarum.worlddrawer.BlocksDrawer import net.torvald.terrarum.worlddrawer.BlocksDrawer
import net.torvald.terrarum.worlddrawer.FeaturesDrawer import net.torvald.terrarum.worlddrawer.FeaturesDrawer
import net.torvald.terrarum.worlddrawer.LightmapRenderer
import net.torvald.terrarum.worlddrawer.WorldCamera import net.torvald.terrarum.worlddrawer.WorldCamera
import net.torvald.util.CircularArray import net.torvald.util.CircularArray
import net.torvald.util.SortedArrayList import net.torvald.util.SortedArrayList

View File

@@ -1,21 +1,29 @@
package net.torvald.terrarum.modulebasegame.gameactors package net.torvald.terrarum.modulebasegame.gameactors
import com.badlogic.gdx.graphics.g2d.SpriteBatch
import net.torvald.gdx.graphics.Cvec import net.torvald.gdx.graphics.Cvec
import net.torvald.random.HQRNG import net.torvald.random.HQRNG
import net.torvald.terrarum.AppLoader
import net.torvald.terrarum.IngameInstance
import net.torvald.terrarum.ModMgr import net.torvald.terrarum.ModMgr
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.blockproperties.Block import net.torvald.terrarum.blockproperties.Block
import net.torvald.terrarum.blockproperties.BlockCodex import net.torvald.terrarum.blockproperties.BlockCodex
import net.torvald.terrarum.gameactors.AVKey import net.torvald.terrarum.gameactors.AVKey
import net.torvald.terrarum.gameactors.Hitbox import net.torvald.terrarum.gameactors.Hitbox
import net.torvald.terrarum.gameactors.Luminous import net.torvald.terrarum.gameactors.Luminous
import net.torvald.terrarum.gameparticles.ParticleVanishingText
import net.torvald.terrarum.modulebasegame.TerrarumIngame
import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack
import java.util.* import java.util.*
import kotlin.math.roundToInt
/** /**
* Created by minjaesong on 2016-06-17. * Created by minjaesong on 2016-06-17.
*/ */
internal class FixtureTikiTorch(nameFun: () -> String) : FixtureBase(BlockBox(BlockBox.NO_COLLISION, 1, 2), nameFun = nameFun), Luminous { internal class FixtureTikiTorch(nameFun: () -> String) : FixtureBase(BlockBox(BlockBox.NO_COLLISION, 1, 2), nameFun = nameFun), Luminous {
private val rng = HQRNG()
private val rndHash1: Int private val rndHash1: Int
private val rndHash2: Int private val rndHash2: Int
@@ -40,11 +48,31 @@ internal class FixtureTikiTorch(nameFun: () -> String) : FixtureBase(BlockBox(Bl
actorValue[AVKey.BASEMASS] = MASS actorValue[AVKey.BASEMASS] = MASS
val rng = HQRNG()
rndHash1 = rng.nextInt() rndHash1 = rng.nextInt()
rndHash2 = rng.nextInt() rndHash2 = rng.nextInt()
} }
private var nextDelay = 0.4f
private var spawnTimer = 0f
override fun update(delta: Float) {
super.update(delta)
if (spawnTimer >= nextDelay) {
val s = rng.nextInt(1, 1000).toString()
(Terrarum.ingame as TerrarumIngame).addParticle(ParticleVanishingText(s, hitbox.centeredX, hitbox.startY + 10))
spawnTimer -= nextDelay
nextDelay = rng.nextFloat() * 0.4f + 0.4f
}
spawnTimer += delta
}
override fun drawBody(batch: SpriteBatch) {
super.drawBody(batch)
}
companion object { companion object {
const val MASS = 1.0 const val MASS = 1.0
} }

View File

@@ -7,6 +7,7 @@ import net.torvald.random.HQRNG
import net.torvald.terrarum.ModMgr import net.torvald.terrarum.ModMgr
import net.torvald.terrarum.Second import net.torvald.terrarum.Second
import net.torvald.terrarum.gameactors.Actor import net.torvald.terrarum.gameactors.Actor
import net.torvald.terrarum.gameparticles.ParticleBase
/** /**
* Created by minjaesong on 2017-12-18. * Created by minjaesong on 2017-12-18.

View File

@@ -1,9 +1,10 @@
package net.torvald.terrarum.modulebasegame.gameactors package net.torvald.terrarum.modulebasegame.gameparticles
import com.badlogic.gdx.graphics.Texture import com.badlogic.gdx.graphics.Texture
import com.badlogic.gdx.graphics.g2d.TextureRegion import com.badlogic.gdx.graphics.g2d.TextureRegion
import net.torvald.terrarum.ModMgr import net.torvald.terrarum.ModMgr
import net.torvald.terrarum.gameactors.Actor import net.torvald.terrarum.gameactors.Actor
import net.torvald.terrarum.gameparticles.ParticleBase
/** /**
* Created by minjaesong on 2017-01-20. * Created by minjaesong on 2017-01-20.

View File

@@ -25,7 +25,7 @@ class UITooltip : UICanvas() {
msgBuffer.clear() msgBuffer.clear()
msgBuffer.addAll(value.split('\n')) msgBuffer.addAll(value.split('\n'))
msgWidth = msgBuffer.fold(0) { acc, s -> font.getWidth(s).let { if (it > acc) it else acc } } msgWidth = msgBuffer.maxOf { font.getWidth(it) }
} }
private val font = AppLoader.fontGame private val font = AppLoader.fontGame