package components import ( "openquell/assets" "openquell/config" "time" "github.com/hajimehoshi/ebiten/v2" ) const ( Destruction = iota Idle Collision Moving ) type Animation struct { Active bool // animation is running Loop bool // remove the entity if false, loop endless otherwise Index int // where we are currently Sprites []assets.AnimationSprite // each element contains the sprite and duration Width, Height int // single sprite measurements Timer Timer Trigger string Data assets.TileAnimation } type Renderable struct { Pos *Position // just for debugging, will not used as positiion! Image *ebiten.Image DamageImage *ebiten.Image // FIXME: put into its own struct Damaged int Shader *ebiten.Shader DestructionAnimate Animation IdleAnimate Animation CollisionAnimate Animation MovingAnimate Animation Hidden bool } func (render *Renderable) StartAnimation(which int) { switch which { case Collision: fallthrough case Destruction: render.Hidden = true render.DestructionAnimate.Active = true render.DestructionAnimate.Timer.Start(config.ANIMATION_STARTWAIT) render.IdleAnimate.Active = false case Idle: render.IdleAnimate.Active = true render.IdleAnimate.Loop = true render.IdleAnimate.Timer.Start(0) case Moving: render.MovingAnimate.Loop = true } } func (render *Renderable) StopAnimation(which int) { switch which { case Collision: render.CollisionAnimate.Active = false case Idle: render.IdleAnimate.Active = false } } func (render *Renderable) Animations() map[int]*Animation { return map[int]*Animation{ Collision: &render.CollisionAnimate, Destruction: &render.DestructionAnimate, Idle: &render.IdleAnimate, } } func (animation *Animation) GetSprite() *ebiten.Image { return animation.Sprites[animation.Index].Sprite } func (animation *Animation) GetDuration() time.Duration { return animation.Sprites[animation.Index].Duration * time.Millisecond }