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.