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?
Zufällige Datei aus einem Ordner wählen
- GM 8
-
-
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
- 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.
- musik[1]=sound_add("musik/Sound01.mp3", 1, 1);
- musik[2]=sound_add("musik/Sound02.mp3", 1, 1);
- ...
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
- 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.
- 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
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
- //---------------------------------------
- //Sucht eine .mp3 Datei aus .\musik\
- //---------------------------------------
- //return: Der Pfad zur Datei, wenn keine gefunden wurde nur ein leeren String
- //---------------------------------------
- var str,files,f,pos,musik;
- f = 0;
- //Starte die Suche
- str=file_find_first(working_directory+"\musik\*.mp3",fa_archive);
- if (str == "") str = file_find_next();
- //Alle passenden Dateien speichern
- do {
- f = f + 1;
- files[f] = str;
- str = file_find_next();
- } until(str == "")
- //Suche Beenden
- file_find_close();
- //datei aussuchen
- if(f>0) {
- pos = irandom_range(1,f);
- return files[pos];
- }
- return "";
Das kann man da z.B. so nutzen:
Ich hoffe das hilft dir.
FG
andre111 -
Bei dem Code von andre würde ich aber statt einer do-Schleife lieber while verwenden, weil bei do-Schleifen der Code immer mind. einmal ausgeführt wird. Wenn aber gar keine Dateien da sind, wird die Schleife unnötig ausgeführt, was dann vielleicht auch zu Fehlern führt.
-
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
- var str,files,f,pos,musik;
- f = 0;
- //Starte die Suche
- str=file_find_first(working_directory+"\DATA\Music\*.mp3",fa_archive);
- if (str == "") str = file_find_next();
- //Alle passenden Dateien speichern
- do {
- f = f + 1;
- files[f] = str;
- str = file_find_next();
- } until(str == "")
- //Suche Beenden
- file_find_close();
- str=file_find_first(working_directory+"\DATA\Music\*.ogg",fa_archive);
- if (str == "") str = file_find_next();
- //Alle passenden Dateien speichern
- do {
- f = f + 1;
- files[f] = str;
- str = file_find_next();
- } until(str == "")
- //Suche Beenden
- file_find_close();
- str=file_find_first(working_directory+"\DATA\Music\*.wav",fa_archive);
- if (str == "") str = file_find_next();
- //Alle passenden Dateien speichern
- do {
- f = f + 1;
- files[f] = str;
- str = file_find_next();
- } until(str == "")
- //Suche Beenden
- file_find_close();
- //datei aussuchen
- if(f>0) {
- pos = irandom_range(1,f);
- return files[pos];
- }
- return "";
Funktioniert bisher perfekt. -
Ups... da hat sich wohl doch der Fehlerteufel eingeschlichen. Wenn ich nur eine MP3 Datei im Ordner habe, wird nichts abgespielt.
-
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
- var str,files,f,pos,musik;
- f = 0;
- //Starte die Suche
- str=file_find_first(working_directory+"\DATA\Music\*.mp3",fa_archive);
- if (str == "") str = file_find_next();
- //Alle passenden Dateien speichern
- while(str != "") {
- f = f + 1;
- files[f] = str;
- str = file_find_next();
- }
- //Suche Beenden
- file_find_close();
- str=file_find_first(working_directory+"\DATA\Music\*.ogg",fa_archive);
- if (str == "") str = file_find_next();
- //Alle passenden Dateien speichern
- while(str != "") {
- f = f + 1;
- files[f] = str;
- str = file_find_next();
- }
- //Suche Beenden
- file_find_close();
- str=file_find_first(working_directory+"\DATA\Music\*.wav",fa_archive);
- if (str == "") str = file_find_next();
- //Alle passenden Dateien speichern
- while(str != "") {
- f = f + 1;
- files[f] = str;
- str = file_find_next();
- }
- //Suche Beenden
- file_find_close();
- //datei aussuchen
- if(f>0) {
- pos = irandom_range(1,f);
- return files[pos];
- }
- return "";
-
Benutzer online 1
1 Besucher