actors now always calls despawn() when being despawned

This commit is contained in:
minjaesong
2024-02-05 14:39:21 +09:00
parent 1685d0f045
commit 2d42525092
6 changed files with 39 additions and 16 deletions

View File

@@ -51,10 +51,19 @@ abstract class Actor : Comparable<Actor>, Runnable {
OVERLAY // screen overlay, not affected by lightmap
}
abstract fun update(delta: Float)
open fun update(delta: Float) {
if (!canBeDespawned) flagDespawn = false // actively deny despawning request if cannot be despawned
if (canBeDespawned && flagDespawn) {
despawn()
despawned = true
}
}
var actorValue = ActorValue(this)
@Volatile var flagDespawn = false
@Transient var despawnHook: (Actor) -> Unit = {}
@Transient open val canBeDespawned = true
@Volatile internal var despawned = false
override fun equals(other: Any?): Boolean {
if (other == null) return false
@@ -84,6 +93,12 @@ abstract class Actor : Comparable<Actor>, Runnable {
}
}
open fun despawn() {
if (canBeDespawned) {
despawnHook(this)
}
}
/**
* ActorValue change event handler
*

View File

@@ -518,6 +518,7 @@ open class ActorWithBody : Actor {
}
override fun update(delta: Float) {
super.update(delta)
// re-scale hitbox
// it's just much better to poll them than use perfectly-timed setter because latter simply cannot exist