I tried doing it in a single thread, but it resulted in too many errors and making it multi-threaded could easily make the whole thing easier.
What errors? I highly doubt that multithreading makes it easier. In fact it mostly makes things more difficult, because it introduces new problems such as synchronization and non-determinism. You should really not use multithreading if it's not necessary.
Since I want an animation for all the characters onscreen, it'd be easiest to make several threads
Not at all, this works perfectly in a single-threaded environment. Just loop through all the characters and update their animation progress. Then you render them.
If you're not sure how to animate objects without using threads, you could have a look at
my implementation in Thor. What I do, is passing a
float value to the animation. This value is in [0,1] and denotes the progress; the animation itself can be represented by any function taking the progress and the object to animate.