1. Usa il tag CODE per postare il codice, altrimenti non si capisce nulla
2. Segui le convenzioni di Java per nomi di classi, attributi e metodi, semplifichi la lettura a chi legge il tuo codice. Ad esempio:
codice:
public class Sprite {
private String spriteImage = "Haggar.gif"; // non e' meglio passarlo col costruttore? O tutti gli sprite avranno questa immagine?
private int animationId;
private int frameId;
public int dx;
public int dy;
private int x;
private int y;
private BufferedImage spriteSheet;
private Animation[] animations; // e' un array, andrebbe al plurale
....
2.1 Perché dx e dy sono public?
3. Posta lo stack trace completo dell'eccezione, è molto più utile di quel che credi.
Detto questo, dal codice che hai postato non vedo dove istanzi SpriteSheet che quindi immagino resti a null, da qui l'errore NullPointerException. A meno che getSubImage non sia un metodo statico.
edit: noto ora la classe animation (Animation!), lì dentro non istanzi mai frames, quando fai frames[num_frames], frames è null.