The way I've always done it was to have a list of entities *seperate* from their images, i.e.:
struct Monster {
pointer to direct draw surface
int curframe;
int hitpoints;
int attackstrength;
int movementspeed;
// whatever
}
By using a pointer to a surface instead of an actual surface, you gain 2 things:
1) Multiple instances of Monster can share the same direct draw surface, saving gfx card memory;
2) it's easy to have monsters with the same stats, but different appearances. This is the classic "red blob/green blob/blue blob" technique used by lots of old NES games (FF springs to mind).
Keep in mind that even though your images are outside the struct, each struct needs to know what frame of animation it's on... otherwise, all of your monsters will all have to be on the same frame at the same time, which doesn't look realistic.
Mason McCuskey
Spin Studios
www.spin-studios.com