...That is going to update each loop, right? Do you have the animation running all along, or how do you make sure you draw the right animation?
Via state variables in the animatable objects.
Consider this possibility: make a Interface called something like Animatable, and have it include an UpdateAnimation() method. Have every object being animated implement this interface. The animation software calls the UpdateAnimation() method of every object once per frame. The UpdateAnimation() method in the object being animated relies exclusively on "State" variables in that object to determine what to do that frame cycle.
For example if you have a state variable (boolean?) for "ascending" set to true, you refer the counter for the ascending graphic sprite sequence, if you are moving "left" or "right" you refer to those counters instead.
Game events can and probably should be set up to affect the state variables of Animatable objects, nothing more. Let the UpdateAnimation() method handle the specifics of what to do, given the state.
The animation software (that calls all the Animatable objects) will need to be able to reference an array of type Animatable to cycle through. It could be some code that has a Timer or that uses a game loop, and could also hold this array itself. Or an Animatable could also be located on the object(s) that you use for displaying, such as the game board itself. Lots of variations on this theme.
I think using an Interface for animation is better than Extending an animation object. You get a lot more flexibility--anything that you want to animate can use the interface, whereas it might not make sense to extend some wildly different objects all from the same parent object.