Wie kann ich mein Soundmodul in Java verbessern?
Posted: 07 Jan 2025, 03:18
Ich entwickle ein 2D-Spiel in Java und manchmal habe ich Probleme mit dem Ton. Im Moment verwende ich in vielen Teilen keinen Ton, außer in der Musik, beim Gehen, beim Angreifen und wenn Feinde Schaden erleiden.Ich hinterlasse Ihnen den Code der Soundklasse und den Fehler, den ich habe:
Fehler:
Ich habe versucht, Ausnahmen hinzuzufügen oder nach einer anderen Bibliothek zu suchen, aber ich weiß nicht, welche besser helfen würde. Ich weiß auch nicht, warum sich so viele Threads ansammeln, wie im Fehler erwähnt. Es ist Thread 40 und ich glaube nicht, dass ich die Klasse an so vielen Stellen verwende.
Ich würde mich über Ihre Hilfe sehr freuen.
Code: Select all
public class SoundThread extends Thread {
private String filename;
private Clip clip;
private float volumeScale;
private boolean isPlaying;
public SoundThread(String filename) {
try {
this.filename = filename;
clip = AudioSystem.getClip();
}
catch (LineUnavailableException ex) {
Logger.getLogger(SoundThread.class.getName()).log(Level.SEVERE, null, ex);
}
}
@Override
public void run() {
isPlaying = true;
try {
InputStream in = getClass().getResourceAsStream("/sonidos/" + filename + ".wav");
if (in != null) {
AudioInputStream ais = AudioSystem.getAudioInputStream(new BufferedInputStream(in));
clip = AudioSystem.getClip();
clip.open(ais);
clip.start();
while (clip.isActive()) {
Thread.sleep(80);
}
}
else {
System.err.println("No se pudo cargar el recurso de sonido: " + filename);
}
}
catch (UnsupportedAudioFileException | IOException | LineUnavailableException | InterruptedException e) {
e.printStackTrace();
} finally {
isPlaying = false;
}
}
public void reproducir(float volumen) {
if (!isPlaying && clip != null && !clip.isActive()) {
new Thread(() -> {
try {
InputStream in = getClass().getResourceAsStream("/sonidos/" + filename + ".wav");
if (in != null) {
AudioInputStream ais = AudioSystem.getAudioInputStream(new BufferedInputStream(in));
clip = AudioSystem.getClip();
clip.open(ais);
ajustarVolumen(clip, volumen);
clip.start();
}
else {
System.err.println("No se pudo cargar el recurso de sonido: " + filename);
}
}
catch (UnsupportedAudioFileException | IOException | LineUnavailableException e) {
e.printStackTrace();
}
}).start();
}
}
public void repetir(float volumen) {
if (!isPlaying && clip != null && !clip.isActive()) {
new Thread(() -> {
try {
InputStream in = getClass().getResourceAsStream("/sonidos/" + filename + ".wav");
if (in != null) {
AudioInputStream ais = AudioSystem.getAudioInputStream(new BufferedInputStream(in));
clip = AudioSystem.getClip();
clip.open(ais);
ajustarVolumen(clip, volumen);
clip.start();
clip.loop(Clip.LOOP_CONTINUOUSLY);
}
else {
System.err.println("No se pudo cargar el recurso de sonido: " + filename);
}
}
catch (UnsupportedAudioFileException | IOException | LineUnavailableException e) {
e.printStackTrace();
}
}).start();
}
}
private void ajustarVolumen(Clip clip, float volumen) {
if (clip != null)
FloatControl gainControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);
float range = gainControl.getMaximum() - gainControl.getMinimum();
float gain = (range * volumen) + gainControl.getMinimum();
gainControl.setValue(gain);
}
}
public long getDuracion() {
return clip.getMicrosecondLength();
}
public void detener() {
if (clip != null && clip.isRunning()) {
clip.stop();
isPlaying = false;
}
}
public void cambiarArchivo(String nuevoArchivo) {
detener();
this.filename = nuevoArchivo;
}
}
Code: Select all
Exception in thread "Thread-40" java.lang.IllegalArgumentException: Unsupported control type: Master Gainat java.desktop/com.sun.media.sound.AbstractLine.getControl(AbstractLine.java:149)
at principal.sonido.SoundThread.ajustarVolumen(SoundThread.java:116)
at principal.sonido.SoundThread.lambda$reproducir$0(SoundThread.java:68)
at java.base/java.lang.Thread.run(Thread.java:842)
Ich würde mich über Ihre Hilfe sehr freuen.