2010-02-11 5 views
2

Je joue avec succès les sons dans un jeu d'applet Java (1.5) en utilisant le code suivant:Comment jouer des sons dans les jeux Java?

// get an available clip to play it 
Clip clip = null; 
for (Clip clipTemp : players) { 
    if (!clipTemp.isOpen()) { 
    clip = clipTemp; 
     break; 
    } 
} 
if (clip == null) { 
    // no available player found, don't play 
    return; 
} 

clip.open(audioFormat, audioByteData, 0, audioByteData.length); 

clip.start(); 

(Les joueurs sont une liste de clips que j'ouvert au début dans le but de réduire les temps d'attente, une ligne l'écouteur ferme la ligne lorsque l'événement stop est récupéré.)

Le problème auquel je suis confronté est le retard intermittent de 1 seconde lors de la lecture d'un son. C'est plutôt pauvre.

Y at-il un moyen d'améliorer cela? Est-ce que SourceDataLines vaut la peine d'être pris en compte?

Répondre

2

L'applet Java diffuse votre clip lorsque vous le souhaitez, ce qui explique pourquoi vous obtenez un délai car le fichier audio n'a pas encore été chargé en mémoire.

Cela fait longtemps que je n'ai pas fait de programmation d'applet Java, mais je me souviens que j'avais l'habitude de pré-charger tous mes clips et que les appels suivants à jouer ne rouvraient pas les fichiers.

Voici une partie d'un de mes anciens projets

Clip shoot; 

private loadShootWav() 
{ 
    AudioInputStream sample; 
    sample = AudioSystem.getAudioInputStream(this.getClass().getResource("shoot.wav")); 
    shoot = AudioSystem.getClip(); 
    shoot.open(sample); 
} 

public void playShootSFX() 
{ 
    shoot.stop(); 
    shoot.setFramePosition(0); 
    shoot.start(); 
} 
+0

Salut - merci pour votre réponse. Le même son pourrait être requis pour être joué plusieurs fois. Suggéreriez-vous une sorte de regroupement de plusieurs clips pour chaque effet sonore avant la main? – Pool

+0

Ouais - J'implémente habituellement une classe singleton 'SoundManager' qui charge tous les clips. Le code ci-dessus jouera le son plusieurs fois, mais réinitialisera le clip à chaque fois. Si vous voulez dire jouer 5 du même son, mais le mélanger à des intervalles légèrement différents, je suggère de vous essayer de charger 5 clips, puis quand vous appelez playSFX() incrémenter un compteur qui pointe vers le prochain clip à jouer . – JSmyth

+0

@JSmyth Je fais quelque chose comme ça, mais si j'ouvre plusieurs AudioInputStream du même fichier son, je commence à obtenir LineUnavailableException. Pouvez-vous jeter un coup d'oeil à ma question? http://stackoverflow.com/questions/20184650/why-am-i-getting-this-lineunavailableexception – trusktr

0

Si je lis correctement votre code, vous trouvez un clip non ouvert et l'ouverture avant de jouer. Il serait plus rapide de prendre des clips ouverts et de les redémarrer. Vous devrez peut-être arrêter et réinitialiser leurs positions en premier, comme indiqué par JSmyth dans l'exemple playShootSFX().

Je reçois une très bonne réponse avec SourceDataLines. La bonne chose est qu'ils démarrent plus vite qu'un Clip non ouvert, puisqu'ils commencent tout de suite au lieu d'attendre que TOUTES les données du son soient chargées dans la RAM (ce qui se produit chaque fois que vous "ouvrez" un Clip). Mais, oui, si vous avez beaucoup de petits sons qui sont joués fréquemment, un pool de clips est la voie à suivre. Si vous voulez qu'ils se chevauchent, ou jouent toujours à l'achèvement, alors vous avez besoin de plusieurs copies. Si ce n'est pas le cas, arrêtez, réinitialisez à 0 et redémarrez. Mais ne continuez pas à rouvrir! Si vous faites cela, vous pouvez aussi bien utiliser une SourceDataLine.

+0

J'ai quelques problèmes. Je pense que je devrais faire ce que vous avez mentionné ici. Pouvez-vous poster un exemple? Voici ma question: http://stackoverflow.com/questions/20184650/why-am-i-getting-this-lineunavailableexception – trusktr

+0

En regardant votre message lié, il semble que vous avez déjà résolu le problème. Très bien! Je n'ai pas essayé Beads moi-même mais ça a l'air intéressant. J'ai aussi entendu de bonnes choses à propos de la bibliothèque TinySound, pour supporter plusieurs lectures. Surtout si j'ai utilisé mon propre code. –

+0

Sucré. Je vais devoir vérifier TinySound. Perles est sympa car il vous donne des "machines" (ce que je les appelle) que vous pouvez brancher les entrées et brancher les sorties dans les entrées de la machine externe. Vous pouvez filtrer un son avec des effets, etc.Ce qui est cool, c'est qu'il gère automatiquement les lignes de données en additionnant les valeurs de tous les sons simulatanés pour produire la sortie finale. – trusktr

Questions connexes