# Sounds im Spiel



## Grevak (9. Aug 2015)

Hallo,

ich habe ein kleines Problem in meinem Pong Spiel.
Ich habe Sounds eingebunden und sie funktionieren auch gut, nur gibt es ein kleines Problem.

Wenn der Ball gegen die Wand oder der Barriere knallt dann kommt auch zwar der Ton, aber manchmal wenn gleich sofort danach noch eine Wand kommt wird der Sound des Balles oft nur einmal abgespielt, also bei der ersten Wand. Bei der die in kürzester Zeit direkt darauffolgt oftmals nicht.

Code der Soundklasse:


```
package de.grevak.classes;

import java.net.*;
import javax.sound.sampled.*;

public class Sound {

    Clip sound;
 
    public Sound(String file) {
        try {
            URL name = this.getClass().getClassLoader().getResource(file);
            AudioInputStream audio = AudioSystem.getAudioInputStream(name);
            sound = AudioSystem.getClip();
            sound.open(audio);
        }
        catch(Exception ex) {
            ex.printStackTrace();
        }
    }
 
    public void play() {
        sound.setFramePosition(0);
        sound.setMicrosecondPosition(0);
        sound.start();
    }
}
```

Weiß jemmand weiter?

MfG Grevak


----------



## JeromeC (10. Aug 2015)

Grevak hat gesagt.:


> Bei der die in kürzester Zeit direkt darauffolgt oftmals nicht.


Den Satz versteh ich nicht.
Wie lange dauert das Abspielen der Audio-Datei? Könnte es sein, dass das Abspielen noch aktiv ist, wenn der Ball das nächste Hindernis trifft und daher die erneute Wiedergabe nicht möglich ist, da die Ressource blockiert ist bzw. die Methode noch arbeitet?
Bekommst du irgendwelche Fehler?


----------



## DeBukkIt (10. Aug 2015)

Wie JeromeC schon sagte, scheint es, als werde noch der Sound vom ersten Aufprall abgespielt, wenn der zweite gerade stattfindet.

Mein Lösungsvorschlag: Das Abspielen von Sounds grundsätzlich einem neuen Thread zuordnen, sodass kein Teil deines Programmes auf das Ende der Sounddatei warten muss, sondern der Ton, wie vermutlich gewollt, auf jeden Fall stets im Hintergrund läuft.
Einzige _Gefahr _dabei: Wenn du das unkontrolliert laufen lässt und, durch einen Bug etwa, dein Ball aufeinmal die Wand mehrmals nacheinander berührt, "explodieren" irgendwann deine Lautsprecher, weil der Sound in einer Sekund ich-weiß-nicht-wie-oft gestartet wird.

Einfachste Variante - Du passt deine play()-Methode folgendermaßen an:

```
public void play() {
     new Thread(new Runnable(){
          public void run(){
               sound.setFramePosition(0);
               sound.setMicrosecondPosition(0);
               sound.start();
          }
     }).start();
}
```


----------



## Grevak (10. Aug 2015)

Danke für die Antworten, die Datei braucht übrigens 0-1 Sekunden zum Abspielen.
Es funktioniert schon sehr viel besser. Wenn er jedoch an einer der Ecken kommt und dann nur noch einige Pixel fehlen bis zur Wand wirds trotzdem nur einmal abgespielt und wenn er direkt in der Ecke aufschlägt, also gleichzeitig an beiden Seiten der Wand, wird er garnicht abgespielt.


----------



## RalleYTN (11. Aug 2015)

Du kannst natürlich auch 2 Soundobjekte erstellen. das erste wird standardmäßig abegespielt, wenn es allerdings gerade abgespielt wird wird der zweite Ton abgespielt.
Also so mache ich das zumindest und es funktioniert perfekt. 

Einziger Nachteil: Der Arbeitsspeicher wird doppelt so stark ausgelastet. Kann man sich bei kleineren Sounds von 0 - 20 Sekunden erlauben.


----------



## Grevak (13. Aug 2015)

Es funktioniert super, danke für eure Hilfen.


----------

