Zufällige Datei aus einem Ordner wählen

  • GM 8

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Zufällige Datei aus einem Ordner wählen

    Ich will dem Spieler die Möglichkeit geben, seine Musik in einen vordefinierten Ordner zu speichern, aus der zufällig eine Musikdatei (MP3 oder OGG) gewählt und abgespielt wird. Leider habe ich absolut keinen Ansatz, wie man aus einem Ordner zufällig eine nicht bekannte Datei aussucht. Hat das hier schon jemand gemacht?
  • Schwierig, ich kenne keine Funktion mit der man alle Dateien in einem Ordner herausfindet.
    Wenn ich mich vertue und es gibt so eine Funktion, dann würde ich mit dieser eine Array erstellen.
    Darin könnte man dann die einzelnen Dateinamen speichern.

    GML-Quellcode

    1. musik[0]=sound_add("musik/Sound00.mp3", 1, 1); //Der Pfad sollte vorher durch eine Variable die mit einer dafür gedachte Funktion die sämtliche Dateinamen im Ordner entnimmt ersetzt werden. Wenn es keine von GM gibt, kannst du evt. auf eine dll zurückgreifen wenn es eine gibt.
    2. musik[1]=sound_add("musik/Sound01.mp3", 1, 1);
    3. musik[2]=sound_add("musik/Sound02.mp3", 1, 1);
    4. ...


    Im Create Event erstellst du eine Variable die später eine Zufallszahl zugewiesen bekommt.
    In dem Teil des Codes wo du abfragst ob bereits ein Lied abgespielt wird (ich gehe mal davon aus, dass du weißt
    wie man Musik abspielt und dementsprechend wie man herausfindet ob eines abgespielt wird) lässt du durch eine GM Funktion
    eine Zufallszahl generieren die eine Reichweite je nach Anzahl der Musik hat. Danach kann der Sound abgespielt werden.

    Beispiel:

    GML-Quellcode

    1. abzuspielendeMusik=round(random(AnzahlDerMusik)); //Anzahl der Musik ist die Maximale Zufallszahl. round wird benutzt um die zufällige Zahl auf eine ganze Zahl zu runden.
    2. sound_play(musik[abzuspielendeMusik]); //Im Index des Arrays wird die zufällige Zahl verwendet also wird eine Zufällige Musik abgespielt.


    Ich hoffe als Ansatz hilft es dir. Ich habe es ebend schnell geschrieben und kann dir nicht versichern, dass der Code fehlerlos ist, vor allem, weil ich nicht mehr mit dem Game Maker arbeite :p

    Wegen des Problems, wie man herausfindet welche Dateien sich im Ordner befinden, kann ich dir leider nicht helfen, aber sicher der Rest der Community. Ich kann mir auch gut vorstellen, dass das das Hauptproblem war und mein Beitrag völlig überflüssig ist, aber was solls :thumbsup:


    MfG
  • Das ganze lässt sich mit den file_find_... Funktionen umsetzten:

    Hier ein Script den ich geschrieben habe:
    Ich hoffe er ist gut genug kommentiert.

    GML-Quellcode

    1. //---------------------------------------
    2. //Sucht eine .mp3 Datei aus .\musik\
    3. //---------------------------------------
    4. //return: Der Pfad zur Datei, wenn keine gefunden wurde nur ein leeren String
    5. //---------------------------------------
    6. var str,files,f,pos,musik;
    7. f = 0;
    8. //Starte die Suche
    9. str=file_find_first(working_directory+"\musik\*.mp3",fa_archive);
    10. if (str == "") str = file_find_next();
    11. //Alle passenden Dateien speichern
    12. do {
    13. f = f + 1;
    14. files[f] = str;
    15. str = file_find_next();
    16. } until(str == "")
    17. //Suche Beenden
    18. file_find_close();
    19. //datei aussuchen
    20. if(f>0) {
    21. pos = irandom_range(1,f);
    22. return files[pos];
    23. }
    24. return "";
    Alles anzeigen


    Das kann man da z.B. so nutzen:

    GML-Quellcode

    1. mus = suche_musik()
    2. if(mus!="") {
    3. show_message("Starte: "+mus)
    4. sound = sound_add(working_directory+"\musik\"+mus,1,true);
    5. sound_play(sound)
    6. }


    Ich hoffe das hilft dir.

    FG
    andre111
  • Super, andre, es funktioniert perfekt. Jetzt habe ich das Ding noch erweitert, so dass auch ogg und wav eingelesen werden kann. Ich habe es so gemacht:

    GML-Quellcode

    1. var str,files,f,pos,musik;
    2. f = 0;
    3. //Starte die Suche
    4. str=file_find_first(working_directory+"\DATA\Music\*.mp3",fa_archive);
    5. if (str == "") str = file_find_next();
    6. //Alle passenden Dateien speichern
    7. do {
    8. f = f + 1;
    9. files[f] = str;
    10. str = file_find_next();
    11. } until(str == "")
    12. //Suche Beenden
    13. file_find_close();
    14. str=file_find_first(working_directory+"\DATA\Music\*.ogg",fa_archive);
    15. if (str == "") str = file_find_next();
    16. //Alle passenden Dateien speichern
    17. do {
    18. f = f + 1;
    19. files[f] = str;
    20. str = file_find_next();
    21. } until(str == "")
    22. //Suche Beenden
    23. file_find_close();
    24. str=file_find_first(working_directory+"\DATA\Music\*.wav",fa_archive);
    25. if (str == "") str = file_find_next();
    26. //Alle passenden Dateien speichern
    27. do {
    28. f = f + 1;
    29. files[f] = str;
    30. str = file_find_next();
    31. } until(str == "")
    32. //Suche Beenden
    33. file_find_close();
    34. //datei aussuchen
    35. if(f>0) {
    36. pos = irandom_range(1,f);
    37. return files[pos];
    38. }
    39. return "";
    Alles anzeigen


    Funktioniert bisher perfekt.
  • Anscheinend ist es so, dass er, wenn er eine bestimmte Dateiendung nicht findet, einfach ein "nichts" als Datei weiter gibt, welches zufällig ausgewählt werden kann. Ich habe es jetzt mal so gemacht, dass ich nicht nach mp3 suche sondern nach allen Dateien. Die Schwierigkeit die ich sehe ist, dass die Soundengine (BASS) keine WMA-Files kann. Wenn sich diese im Ordner befinden und er dies auswählt, kommt einfach keine Musik. Ich brauche also irgend einen Filter. Die Soundengine kann folgende Formate abspielen: *.mp3;*.mp2;*.mp1;*.ogg;*.wav;*.mo3;*.it;*.xm;*.s3m;*.mtm;*.mod;*.umx
  • So ich habe mir das nochmal angeschaut und wie -$Marvin$- bereits gesagt hat, waren die do until Schleifen eine eher ungünstige Whl, da sie immer einmal ausgeführt werden.

    Hier die verbesserte Version:

    GML-Quellcode

    1. var str,files,f,pos,musik;
    2. f = 0;
    3. //Starte die Suche
    4. str=file_find_first(working_directory+"\DATA\Music\*.mp3",fa_archive);
    5. if (str == "") str = file_find_next();
    6. //Alle passenden Dateien speichern
    7. while(str != "") {
    8. f = f + 1;
    9. files[f] = str;
    10. str = file_find_next();
    11. }
    12. //Suche Beenden
    13. file_find_close();
    14. str=file_find_first(working_directory+"\DATA\Music\*.ogg",fa_archive);
    15. if (str == "") str = file_find_next();
    16. //Alle passenden Dateien speichern
    17. while(str != "") {
    18. f = f + 1;
    19. files[f] = str;
    20. str = file_find_next();
    21. }
    22. //Suche Beenden
    23. file_find_close();
    24. str=file_find_first(working_directory+"\DATA\Music\*.wav",fa_archive);
    25. if (str == "") str = file_find_next();
    26. //Alle passenden Dateien speichern
    27. while(str != "") {
    28. f = f + 1;
    29. files[f] = str;
    30. str = file_find_next();
    31. }
    32. //Suche Beenden
    33. file_find_close();
    34. //datei aussuchen
    35. if(f>0) {
    36. pos = irandom_range(1,f);
    37. return files[pos];
    38. }
    39. return "";
    Alles anzeigen