Si hemos probado nuestro el programa anterior, nos habremos dado cuenta de dos cosas : en primer lugar el fps
ha bajado considerablemente y - lo que es mas grave - el juego ha comenzado a funcionar "a trompicones". El problema
es que Java necesita preparar un sonido para su reproducción y este proceso lleva tiempo. Cada vez que solicitamos
que se toque algo, como lo estamos haciendo desde nuestro bucle principal, el programa se detiene mientras Java perpara
el sonido. Un planteamiento mejor - que además arregla el problema de los trompicones - es crear un nuevo hilo
temporal que y desde este nuevo hilo solicitar la ejecución de un sonido. De esta forma el programa principal puede
continuar sin que tengamos que esperar. Afortunadamente, tenemos todas las peticiones de reproducción de sonidos
centralizadas en la clase SoundCache de forma que será fácil añadir el cambio sin
afectar al resto del programa:
SoundCache.java
1 /**
2 * Curso Básico de desarrollo de Juegos en Java - Invaders
3 *
4 * (c) 2004 Planetalia S.L. - Todos los derechos reservados. Prohibida su reproducción
5 *
6 * http://www.planetalia.com
7 *
8 */
9 package version28;
10
11 import java.applet.Applet;
12 import java.applet.AudioClip;
13 import java.net.URL;
14
15 public class SoundCache extends ResourceCache{
16 protected Object loadResource(URL url) {
17 return Applet.newAudioClip(url);
18
19 }
20 public AudioClip getAudioClip(String name) {
21 return (AudioClip)getResource(name);
22 }
23
24 public void playSound(final String name) {
25 new Thread(
26 new Runnable() {
27 public void run() {
28 getAudioClip(name).play();
29 }
30 }
31 ).start();
32 }
33
34 public void loopSound(final String name) {
35 new Thread(
36 new Runnable() {
37 public void run() {
38 getAudioClip(name).loop();
39 }
40 }
41 ).start(); }
42