actors now use 'updateImpl'; static sound for smelter and furnace

This commit is contained in:
minjaesong
2024-02-12 04:48:25 +09:00
parent 7ac6bd6a9c
commit 7d871c5d49
24 changed files with 164 additions and 64 deletions

View File

@@ -7,6 +7,7 @@ import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.audio.MusicContainer
import net.torvald.terrarum.audio.TerrarumAudioMixerTrack
import net.torvald.terrarum.audio.TrackVolume
import net.torvald.terrarum.audio.dsp.NullFilter
import net.torvald.terrarum.modulebasegame.gameactors.ActorHumanoid
import net.torvald.terrarum.modulebasegame.gameactors.Pocketed
import net.torvald.terrarum.savegame.toBigEndian
@@ -51,14 +52,19 @@ abstract class Actor : Comparable<Actor>, Runnable {
OVERLAY // screen overlay, not affected by lightmap
}
open fun update(delta: Float) {
fun update(delta: Float) {
if (!canBeDespawned) flagDespawn = false // actively deny despawning request if cannot be despawned
if (canBeDespawned && flagDespawn) {
despawn()
despawned = true
}
if (!despawned) {
updateImpl(delta)
}
}
open fun updateImpl(delta: Float) {}
var actorValue = ActorValue(this)
@Volatile var flagDespawn = false
@Transient var despawnHook: (Actor) -> Unit = {}
@@ -95,6 +101,15 @@ abstract class Actor : Comparable<Actor>, Runnable {
open fun despawn() {
if (canBeDespawned) {
musicTracks1.forEach { name ->
val it = App.audioMixer.dynamicTracks[name.substring(2).toInt() - 1]
println("stop track $name")
it.stop()
it.filters[0] = NullFilter
it.filters[1] = NullFilter
}
despawnHook(this)
}
}
@@ -108,6 +123,7 @@ abstract class Actor : Comparable<Actor>, Runnable {
// @Transient val soundTracks = HashMap<Sound, TerrarumAudioMixerTrack>()
@Transient val musicTracks = HashMap<MusicContainer, TerrarumAudioMixerTrack>()
@Transient private val musicTracks1 = ArrayList<String>()
/*open fun startAudio(sound: Sound) {
getTrackByAudio(sound)?.let {
@@ -117,7 +133,7 @@ abstract class Actor : Comparable<Actor>, Runnable {
}
}*/
private fun getTrackByAudio(music: MusicContainer): TerrarumAudioMixerTrack? {
fun getTrackByAudio(music: MusicContainer): TerrarumAudioMixerTrack? {
// get existing track
var track = musicTracks[music]
@@ -130,6 +146,7 @@ abstract class Actor : Comparable<Actor>, Runnable {
// if the request was successful, put it into the hashmap
if (track != null) {
musicTracks[music] = track
musicTracks1.add(track.name)
}
}
@@ -138,6 +155,9 @@ abstract class Actor : Comparable<Actor>, Runnable {
return track
}
/**
* To loop the audio, set `music.gdxMusic.isLooping` to `true`
*/
open fun startAudio(music: MusicContainer, volume: TrackVolume = 1.0, doSomethingWithTrack: (TerrarumAudioMixerTrack) -> Unit = {}) {
getTrackByAudio(music)?.let {
it.stop()

View File

@@ -19,6 +19,9 @@ open class ActorMovingPlatform() : ActorWithBody() {
setHitboxDimension(TILE_SIZE * tilewiseWidth, TILE_SIZE, 0, 0)
}
override fun updateImpl(delta: Float) {
TODO("Not yet implemented")
}
/**
* Make the actor its externalV controlled by this platform

View File

@@ -517,9 +517,7 @@ open class ActorWithBody : Actor {
feetPosTile.set(hIntTilewiseHitbox.centeredX.floorToInt(), hIntTilewiseHitbox.endY.floorToInt())
}
override fun update(delta: Float) {
super.update(delta)
override fun updateImpl(delta: Float) {
// re-scale hitbox
// it's just much better to poll them than use perfectly-timed setter because latter simply cannot exist
hitbox.canonicalResize(baseHitboxW * scale, baseHitboxH * scale)

View File

@@ -93,7 +93,7 @@ class BlockMarkerActor : ActorWithBody(Actor.RenderOrder.OVERLAY, physProp = Phy
override fun dispose() {
}
override fun update(delta: Float) {
override fun updateImpl(delta: Float) {
if (isVisible) {
val hbx = (Terrarum.mouseTileX - floor((hitbox.width - 0.5).div(2) / TILE_SIZED)) * TILE_SIZED
val hby = (Terrarum.mouseTileY - floor((hitbox.height - 0.5) / TILE_SIZED)) * TILE_SIZED

View File

@@ -69,7 +69,7 @@ class WireActor : ActorWithBody, NoSerialise {
)
}
override fun update(delta: Float) {
override fun updateImpl(delta: Float) {
}
override fun drawBody(frameDelta: Float, batch: SpriteBatch) {