hilfe mit sound bin verzweifelt!!



  • hallo ,
    Ich versuch mal mein Problem zu schildern ich programmier ein spiel und habe folgendes problem!!
    Wenn man die spiel Figur bewegt, wird quasi in einer schleife eine Funktion ausgeführt die sich immer nähe zum Zielord bewegt.
    Sprich die Funktion wird so oft ausgeführt bis sich die Figur am Ziel befindet.
    Und da diese Funktion direkt nicht weiß wann eine Bewegung beginnt, wird in der Funktion aufgerufen.
    Da die Funktion ca 30 mal in der Sekunde aufgerufen wird, soll verhindert werden das auch 30 Clips abgespielt werden, sondern immer nur eine Aktion gleichzetig abgespielt wird. ZB, soll dann ueberprüft werden ob der Sound der abgespielt wird, bereits am spielen ist, wenn ja, tue nix, wenn nicht stoppe den alten sound (falls ein anderer sound spielt) und spiele den neuen Sound ab. bis jetzt habe dieses aber wie kann ich das realisieren kann mir da jemand helfen!!
    im vorraus danke!!

    import javax.sound.sampled.;
    import java.io.
    ;

    class soundklasse
    {

    static File file = null;
    static AudioInputStream stream = null;
    static Clip clip = null;

    public soundklasse()
    {

    file = new File("sound/schwert/Schwert1.wav");

    try
    {
    stream = AudioSystem.getAudioInputStream(file);
    }catch(UnsupportedAudioFileException e)
    {
    System.out.println("Kein unterstuetztes AudioFormat!");
    System.exit(0);
    }
    catch(IOException e2){System.out.println("Fehler beim Oeffnen der Sounddatei!");System.exit(1);}

    DataLine.Info info = new DataLine.Info(Clip.class,stream.getFormat());

    try{
    clip = (Clip) AudioSystem.getLine(info);
    }catch(LineUnavailableException e){System.out.println("Line konnte nicht benutzt werden");System.exit(1);}

    try{
    clip.open(stream); clip.start();
    }catch(LineUnavailableException e){System.out.println("Fehler beim Öffnen des AudioStreams");System.exit(1);}
    catch(IOException e){}

    clip.start();
    //warte solange wie das AudioSystem den Clip wiedergibt
    while(clip.isActive()){}
    //stoppe Clip nachdem er komplett wiedergegeben wurde
    clip.stop();
    //schliesse den Clip und gib somit die gebundenen Resourcen wieder //frei
    clip.close();

    }
    }

    wenn ich das teste indem ich quasi ne schleife durchläufe(in einer anderen klasse), die ca 30-40 mal pro sekunde iteriert wird und wenn ich dann dieses abspiele wird dann nicht ein clip abgespielt sondern die clips werden ueberlagert. 😕



  • Musst halt den neuen Sound nur abspielen, wenn er nicht der gleiche wie der neue ist. Vielleicht auch das ganze Soundzeug in nen Thread auslagern.



  • Korrektur:
    Musst halt den neuen Sound nur abspielen, wenn er nicht der gleiche wie der alte ist. Vielleicht auch das ganze Soundzeug in nen Thread auslagern.



  • so kann ich es vielleicht über Applet.newAudioClip(file.toURL()); machen? aber das funzt auch irgendwie auch nicht??
    ich teste das immer mit einer schleife extern aus der klasse und ich habe dan immer nur die überlagerung!!
    bei midi gibt es den befelh is.Running funzt auch bei midi doch bei Applet.newAudioClip(file.toURL()); geht das nicht gibt es etwas ähnliches oder wie kann man das machen bitte bitte ist sehr sehr wichtig!!
    im vorraus danke

    import java.io.File;
    import java.io.IOException;
    import javax.sound.midi.;
    import java.awt.
    ;
    import java.awt.event.;
    import java.applet.
    ;
    import java.net.;
    import javax.sound.midi.MidiSystem;
    import javax.sound.sampled.
    ;

    public class aktion

    {
    boolean abfrage=false;
    AudioClip clip;
    String level_musik[]={"sound/hintergrundmusik/DUNE2036.mid","sound/hintergrundmusik/aoe2.mid"};
    // 2dimensionales array da für jeden spieler andere fertigkeiten haben d.h das das erste 1 dim für spierl 2 dimension
    // für die fähigkeit ist
    String[][] aktion={ // treffer aktion gehen normal gehen im schnee
    {"sound/schrei/aua.wav","sound/schwert/Schwert1.wav","sound/schwert/Schwert2.wav","sound/schritte/gehen.wav","sound/schritte/schnee/schnee3.wav"}, //barbar
    {"sound/schrei/aua.wav","sound/magiesound/sel1.wav" ,"sound/magiesound/Feuer.wav","sound/schritte/gehen.wav","sound/schritte/schnee/schnee3.wav"}, //magier
    {"sound/schrei/aua.wav","sound/schwert/pfeil/pfeil.wav","sound/schwert/pfeil/pfeil2.wav","sound/schritte/gehen.wav","sound/schritte/schnee/schnee3.wav"}, //elf
    };
    String inventar[]={"sound/inventar/oeffnen.wav","sound/inventar/Heilung.wav","sound/hintergrundmusik/levelbeendet/Actraiser_title.wav"};
    boolean pause=false;

    public aktion()
    {
    //abfrage=false;
    }
    public void aktionSound(int spieler,int i)
    {

    try{
    File file = new File(aktion[spieler][0]);
    clip = Applet.newAudioClip(file.toURL());
    clip.play();

    }catch(MalformedURLException e){ System.out.println(e); }
    }

    }

    }



  • kara2609 schrieb:

    so kann ich es vielleicht über Applet.newAudioClip(file.toURL()); machen? aber das funzt auch irgendwie auch nicht??
    ich teste das immer mit einer schleife extern aus der klasse und ich habe dan immer nur die überlagerung!!

    Warum in ner schleife? spiel den sound doch nur einmal ab.

    und verwende man codetags



  • [quote="mojoo"]

    kara2609 schrieb:

    so kann ich es vielleicht über Applet.newAudioClip(file.toURL()); machen? aber das funzt auch irgendwie auch nicht??
    ich teste das immer mit einer schleife extern aus der klasse und ich habe dan immer nur die überlagerung!!

    Warum in ner schleife? spiel den sound doch nur einmal ab.

    Ich versuch mal mein Problem zu schildern
    Wenn man sich die Figur bewegt, wird quasi in einer schleife eine Funktion ausgeführt die sich immer nähe zum Zielord bewegt.
    Sprich die Funktion wird so oft ausgeführt bis sich die Figur am Ziel befindet.
    Und da diese Funktion direkt nicht weiß wann eine Bewegung beginnt, wird in der Funktion immer sowas wie aktion.play(bewegung) aufgerufen.
    Da die Funktion ca 30 mal in der Sekunde aufgerufen wird, soll verhindert werden das auch 30 Clips abgespielt werden, sondern immer nur eine Aktion gleichzetig abgespielt wird. ZB, soll dann ueberprüft werden ob der Sound der abgespielt wird, bereits am spielen ist, wenn ja, tue nix, wenn nicht stoppe den alten sound (falls ein anderer sound spielt) und spiele den neuen Sound ab.



  • es ist doch nicht schwer sich zu merken, was gerade gespielt wird und das dann nicht mehr abzuspielen


Anmelden zum Antworten