# Totaler Absturz beim mehrmaligen Abspielen von Sounds



## NoobMitSauce (23. Dez 2009)

Ich bin verzweifelt.
Ursprüngliche Idee: ein kleines moorhuhnartiges spiel, bei dem es mit der Maus irgendetwas abzuschießen gilt.
Da ich noch nie mit Sounds gearbeitet habe und auch sonst noch ziemlich unwissend bin habe ich verschiedenste Methoden ausprobiert um bei Mausklick einen kleinen Sound abzuspielen. Immer wieder trat folgendes Problem auf: Beim ersten Klick funktioniert alles wunderbar, beim zweiten vielleicht auch noch, aber dann - friert der Bildschirm ein, keine wie auch immer geartete Reaktion des PCs mehr. Übrig bleibt nur noch das ungeliebte Ausschalten des PCs.
Inzwischen habe ich, der Überlegung folgend, dass andere das doch auch hinkriegen, einfach die Klasse SoundLib aus Quaxli's Tutorial verwendet  doch zu meinem Ärger musste ich feststellen, dass das Problem noch immer auftrat...
(Zum Code: ich mache das Simpelste, ich verwende SoundLib gemäß den Angaben des Tutorials und rufe im MouseListener die Methode zum Abspielen des Sounds auf.)
Hat jemand eine Ahnung, woran das liegt?

Danke im Voraus
NoobMitSauce


----------



## Steev (23. Dez 2009)

Hast du das ganze schon mal mit einem anderen Sound probiert?
Du solltest ebenfalls aufpassen, dass du nicht mehrfach ein-und-denselben Sound initialisierst und von der Platte streamst, da du sonst zu viele Ressourcen verbrauchst.
Dann wüsste ich noch gerne welche JDK/JRE und welches OS du verwendest, da man so schon mal das Problem etwas eingrenzen kann. Wenn es dir nichts ausmacht, dann poste doch einfach den Quellcode in dem du den Sound abspielst (auch das drumherum, manchmal liegt das Problem auch wo anders).

Gruß
Steev


----------



## NoobMitSauce (23. Dez 2009)

JRE 6
JDK 1.6.0_12 (steht so auf dem Ordner)
zum Operating System: Da bin ich mir ehrlich gesagt nicht sicher, was als Antwort erwartet wird.. :bahnhof: Windows XP?


```
import java.awt.*;
import java.awt.event.*;
import javax.sound.sampled.*;
import java.io.*;
import java.util.Random;


public class Wundermoorhuhn extends Frame implements Runnable{
  // Anfang Attribute
  Thread th = new Thread(this);
  private Image dbImage;
  private Graphics dbg;
  Image CursorImage;
  Cursor cursor;
  Wunder[] wunder = new Wunder[10];
  int[][] collision = new int[1000][700];
  final int LINKS = 0;
  final int RECHTS = 1;
  final int OBEN = 2;
  final int UNTEN = 3;
  Wolke[] wolke = new Wolke[3];
  Image Sonne;
  Doktor[] doktor = new Doktor[3];
  Random random = new Random();
  SoundLib slib;



  // Ende Attribute

  public Wundermoorhuhn(String title) {
    // Frame-Initialisierung
    super(title);
    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent evt) { System.exit(0); }
    });
    int frameWidth = 1000;
    int frameHeight = 700;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    // Anfang Komponenten
    CursorImage = Toolkit.getDefaultToolkit().getImage("Fadenkreuz.gif");
    cursor = Toolkit.getDefaultToolkit().createCustomCursor(CursorImage,new Point(15,15),"Fadenkreuz");
    setCursor(cursor);
    Sonne = Toolkit.getDefaultToolkit().getImage("Sonne.png");

    for (int i = 0; i < 1000; i++)
    {
      for (int j = 0; j < 700; j++)
      {
        collision[i][j] = -1;
      }
    }

    for (int i = 0; i < wunder.length; i++)
    {
      wunder[i] = null;
    }
    for (int i = 0; i < doktor.length; i++)
    {
      doktor[i] = null;
    }
    for (int i = 0; i < wolke.length; i++)
    {
      wolke[i] = new Wolke();
    }

    this.addMouseListener(new java.awt.event.MouseAdapter() {
      public void mouseClicked(java.awt.event.MouseEvent e) {
        //hier wird die Maus abgefragt
        getCollision();
        if(collision[z1][z2]> -1)
        {
          if(collision[z1][z2]> 9)
          {
            doktor[collision[z1][z2]-10].setRichtung(UNTEN);
          }
          else
          {
            wunder[collision[z1][z2]] = null;
            if(random.nextBoolean())
            {
              wunder[collision[z1][z2]] = new Wunder(-210,random.nextInt(360),RECHTS,random.nextInt(4)+6);
            }
            else
            {
              wunder[collision[z1][z2]] = new Wunder(1010,random.nextInt(360),LINKS,random.nextInt(4)+6);
            }

          }
        }
        slib.playSound("ding");
      }
    });
    
    slib = new SoundLib();
    slib.loadSound("ding","ding.wav");

    // Ende Komponenten

    setResizable(false);
    setVisible(true);
    initiateLevel(1);
  }
  
  // Anfang Methoden ===========================================

  public void startAnimation()
  {
    th.start();
  }

  public void run()
  {
    while(true)
    {
      update(getGraphics());
      try
      {
        Thread.sleep(25);//Verzögerung zwischen den Bildern
      }catch (InterruptedException e)
      {
        //nichts
      }
    }
  }
  
  public void update(Graphics g)
  {
    // Initialisierung des DoubleBuffers
    if (dbImage == null)
    {
      dbImage = createImage (this.getSize().width, this.getSize().height);
      dbg = dbImage.getGraphics ();
    }
    // Bildschirm im Hintergrund löschen
    dbg.setColor (getBackground ());
    dbg.fillRect (0, 0, this.getSize().width, this.getSize().height);

    // Auf gelöschten Hintergrund Vordergrund zeichnen
    dbg.setColor (getForeground());
    
    // BILD ERSTELLEN =================================
    //Grüner Boden
    dbg.setColor(new Color(20,185,20,255));
    dbg.fillRect (0, 0, this.getSize().width, this.getSize().height);
    //Blauer Himmel
    dbg.setColor(new Color(65,65,255,255));
    dbg.fillRect (0, 0, this.getSize().width, this.getSize().height*2/3);
    //Gelbe Sonne
    dbg.drawImage(Sonne,780,0,this);
    //Wolken
    for (int i = 0; i < wolke.length; i++)
    {
      wolke[i].zeichnen(dbg);
    }
    //Doktoren
    for (int i = 0; i < doktor.length; i++)
    {
      if(doktor[i] != null)
      {
        doktor[i].zeichnen(dbg);
      }
    }
    //Wundervögel
    for (int i = 0; i < wunder.length; i++)
    {
      if(wunder[i] != null)
      {
        wunder[i].zeichnen(dbg);
      }
    }
    //===============================================
    
    
    g.drawImage (dbImage, 0, 0, this);
  }

  public void paint(Graphics g)
  {
    //nichts
  }
  
  public void getCollision()
  {
    for (int i = 0; i < 1000; i++)
    {
      for (int j = 0; j < 700; j++)
      {
        collision[i][j] = -1;
      }
    }
    for (int i = 0; i < doktor.length; i++)
    {
      if(doktor[i] != null)
      {
        doktor[i].getCollision(collision,i,this);
      }
    }
    for (int i = 0; i < wunder.length; i++)
    {
      if(wunder[i] != null)
      {
        wunder[i].getCollision(collision,i,this);
      }
    }
  }
  
  public void initiateLevel(int level)
  {
    System.out.println("initiateLevel wird aufgerufen");
    for (int i = 0; i < wunder.length; i++)
    {
      wunder[i] = null;
    }
    switch (level) {
      case 1 :
        wunder[0] = new Wunder(50,50,LINKS,2);
        wunder[1] = new Wunder(400,300,RECHTS,2);
        doktor[0] = new Doktor(100);
        break;
      case 2 :
        wunder[0] = new Wunder(400,50,LINKS,2);
        wunder[1] = new Wunder(50,400,RECHTS,2);
        break;
      default:
        System.out.println("Fehler beim initiieren des Levels");
    }
  }
  // Ende Methoden ===========================================

  public static void main(String[] args) {
    Wundermoorhuhn wundermoorhuhn = new Wundermoorhuhn("Wundermoorhuhn");
    wundermoorhuhn.startAnimation();
  }
}
```

Das ganze Kollisionszeugs bitte ignorieren, ich weiß, dass das gelinde gesagt verbesserungswürdig ist, es geht mir um dieses Sound-Problem.

Dankeschön
NoobMitSauce


----------



## Steev (23. Dez 2009)

Zu dem Sound:
Du Spielst den Sound ja im Grunde genommen nur über die SoundLib ab. Ich vermute hier liegt das Problem primär an dem Sound selbst. wav kann ja ziemlich groß werden, wie groß ist die Datei ungefähr?
Hast du schon einmal probiert das Programm unter einer früheren JDK auszuführen. Ich hatte kürzlich mit dem Sound ein ähnliches Problem, wo ich dann feststellen musste, das zwischen den JDKs etwas im Hintergrund geändert wurde.

Zum Spiel:
Ich würde für alle Objekte, die angeklickt werden können ein Objekt erstellt und hier eine Instanz der Klasse Rectangle als Attribut verweisen. Damit kannst du einfach über den Standard eine Kollisionsabfrage durchführen.
Du kannst dir ja mal folgenden Post ansehen...

http://www.java-forum.org/spiele-mu.../88412-performancetest-kleines-spielchen.html

In einem der letzten Beiträge findest du auch den damals aktuellen Quellcode.

Gruß
Steev


----------



## NoobMitSauce (23. Dez 2009)

Die Datei ist 78.9 KB groß. Ich hatte es auch schon mal mit .au probiert, aber die ist ja noch größer.. Welches Format wäre denn empfehlenswert?
Das mit der älteren jdk werde ich mal probieren.

Dankeschön
NoobMitSauce


----------



## NoobMitSauce (23. Dez 2009)

Nicht zu fassen... mit der älteren Version macht er keine Probleme mehr... schon irgendwie absurd...
...     ... Danke !!!!!
Tut mir übrigens Leid wegen des Doppelposts, beim nächsten Problem, das ich habe, melde ich mich hier an.

Vielen, vielen Dank,
NoobMitSauce


----------

