diff options
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.kt | 67 |
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 + } +} |
