Alguien me puede decir cómo puedo hacer para que los frames cambien en orden (0,1,2). He intentado muchas veces y nada.
Ah, por cierto, estoy trabajando en Netbeans 7.2.
Ese comportamiento «aleatorio» casi siempre viene de llamar al avance de frame desde el sitio equivocado, no de un problema real con el orden de los frames.
Si estás llamando a algo tipo sprite.nextFrame() dentro del método paint(), el problema es que paint() no se ejecuta a un ritmo fijo ni predecible, se llama cuando el sistema decide repintar, así que el frame puede avanzar varias veces en una pasada o quedarse parado, dando esa sensación de aleatoriedad.
Lo correcto es separar «cuándo avanza el frame» de «cuándo se pinta». Usa un game loop con un Thread propio (o un TimerTask) que controle el ritmo:
while (running) {
sprite.nextFrame(); // solo aquí, una vez por ciclo
canvas.repaint();
try { Thread.sleep(200); } catch (InterruptedException e) {}
}
Y en paint()/paint(Graphics g) del Canvas, solo dibujas el estado actual del sprite (sprite.paint(g)), nunca avanzas el frame ahí. Con esto el avance queda controlado por tu bucle a un intervalo fijo (en el ejemplo, 200ms = 5 frames por segundo), y el orden 0,1,2... se respeta siempre porque solo hay un sitio en el código que llama a nextFrame().
Alvaro