summaryrefslogtreecommitdiff
path: root/composeApp/src/commonMain/kotlin/coffee/liz/ecs/animation/AnimationComponents.kt
diff options
context:
space:
mode:
authorElizabeth Hunt <me@liz.coffee>2025-10-26 17:25:13 -0700
committerElizabeth Hunt <me@liz.coffee>2025-10-26 17:25:13 -0700
commit395aa7d1c312e495517701be11c21425d9a5838e (patch)
tree4ad184b082838c56149cc1d1efe191cfd3d0679b /composeApp/src/commonMain/kotlin/coffee/liz/ecs/animation/AnimationComponents.kt
parent64f825465de9fa30c4dfe2707067efdb96110db8 (diff)
downloadabstraction-engine-kt-395aa7d1c312e495517701be11c21425d9a5838e.tar.gz
abstraction-engine-kt-395aa7d1c312e495517701be11c21425d9a5838e.zip
Checkpoint
Diffstat (limited to 'composeApp/src/commonMain/kotlin/coffee/liz/ecs/animation/AnimationComponents.kt')
-rw-r--r--composeApp/src/commonMain/kotlin/coffee/liz/ecs/animation/AnimationComponents.kt67
1 files changed, 29 insertions, 38 deletions
diff --git a/composeApp/src/commonMain/kotlin/coffee/liz/ecs/animation/AnimationComponents.kt b/composeApp/src/commonMain/kotlin/coffee/liz/ecs/animation/AnimationComponents.kt
index 4289eec..cb3708f 100644
--- a/composeApp/src/commonMain/kotlin/coffee/liz/ecs/animation/AnimationComponents.kt
+++ b/composeApp/src/commonMain/kotlin/coffee/liz/ecs/animation/AnimationComponents.kt
@@ -1,85 +1,77 @@
package coffee.liz.ecs.animation
import coffee.liz.ecs.Component
+import coffee.liz.ecs.Rect
import kotlin.jvm.JvmInline
/**
* Loop modes for animation playback.
*/
enum class LoopMode {
- /** Play once and stop on last frame */
+ /** Play once **/
ONCE,
- /** Repeat from beginning */
+ /** Repeat **/
LOOP,
- /** Play forward, then backward, repeat */
+ /** Play forward, then backward, repeat **/
PING_PONG
}
/**
- * Type-safe wrapper for animation names.
+ * Name of an animation clip.
*/
@JvmInline
value class AnimationName(val value: String)
/**
- * Type-safe wrapper for frame names.
+ * Name of a frame.
*/
@JvmInline
value class FrameName(val value: String)
-/**
- * Represents a rectangle region in a sprite sheet.
- */
-data class Rect(
- val x: Int,
- val y: Int,
- val width: Int,
- val height: Int
-)
/**
- * Defines a single animation clip with frames and playback settings.
+ * Animation Clip details.
*/
data class AnimationClip(
val frameNames: List<FrameName>,
- val frameDuration: Float, // seconds per frame
+ val frameTicks: Int,
val loopMode: LoopMode = LoopMode.LOOP
)
/**
* Component containing sprite sheet data - the image and frame definitions.
- * This is immutable data that can be shared across entities.
*/
data class SpriteSheet(
val imagePath: String,
val frames: Map<FrameName, Rect>
) : Component
+enum class AnimationDirection(val step: Int) {
+ /** Play in forward direction **/
+ FORWARD(step = 1),
+ /** Play in reverse direction **/
+ BACKWARD(step = -1);
+}
/**
- * Component for animation playback state.
- * Contains animation clips and current playback state.
+ * Current state of an animation.
*/
data class Animator(
val clips: Map<AnimationName, AnimationClip>,
var currentClip: AnimationName,
var frameIndex: Int = 0,
- var elapsed: Float = 0f,
+ var elapsedTicks: Int = 0,
var playing: Boolean = true,
- var direction: Int = 1 // 1 for forward, -1 for backward (used in PING_PONG)
+ var direction: AnimationDirection = AnimationDirection.FORWARD
) : Component {
-
/**
* Play a specific animation clip by name.
- * Resets playback state when switching clips.
*/
fun play(clipName: AnimationName, restart: Boolean = true) {
- if (currentClip != clipName || restart) {
- currentClip = clipName
- frameIndex = 0
- elapsed = 0f
- direction = 1
- playing = true
- }
+ clipName.takeIf { currentClip != it || restart }
+ .run {
+ currentClip = clipName
+ reset()
+ }
}
/**
@@ -103,12 +95,11 @@ data class Animator(
val clip = clips[currentClip] ?: return null
return clip.frameNames.getOrNull(frameIndex)
}
-}
-/**
- * Component for entity position in 2D space.
- */
-data class Position(
- var x: Float,
- var y: Float
-) : Component
+ private fun reset() {
+ frameIndex = 0
+ elapsedTicks = 0
+ direction = AnimationDirection.FORWARD
+ playing = true
+ }
+}