Skocz do zawartości

zastosowanie delta time przy loopowaniu muzyki


Cruel_boy

Rekomendowane odpowiedzi

loopuje muzyke loop pointem uzywajac funkcji związanych z pozycją dźwięku (ponieważ dalej nie ma na to osobnej funkcji w gm)

 

create:

GML
musicvar = audio_play_sound(music,9999,0);

 

looppoint=3,090;

 

step:

GML
musicpos = audio_sound_get_track_position(musicvar);

 

if musicpos >= audio_sound_length(musicvar)

{

audio_sound_set_track_position(musicvar,looppoint);

}

 

muzyka nie loopuje się (loopuje sie gdy wszystkie księżyce, planety i gwiazdy ułożą się w jednej linii), chyba że przy warunku if odejme z dwie klatki od audio_sound_length, wtedy jest większa szansa na to że warunek zajdzie, jednak loop najczęściej wskoczy za wcześnie

 

w takim razie - jak w ten kod wplecić delta_time dla zwiększonej dokładności? (albo może jakoś inaczej to zrobić żeby muzyka loopowała się z jak najmniejszą dziurą)

Odnośnik do komentarza
Udostępnij na innych stronach

Pewnie chodzi o coś innego bo odpowiedź moja jest zbyt oczyswista ale:

 

 

GML
audio_play_sound(index, priority, loop);

 

Przecież ostatnia zmienna odpowiada za loop a Ty ustawiłeś tam na stałe 0

 

ta zmienna odpowiada za loop od samego początku. gdybym ustawił na 1, muzyka zamiast całkowicie sie zatrzymywać, po prostu rozpoczęła by sie znowu od początku a nie od wyznaczonego przeze mnie loop pointa.

 

edit: wymarzoną funkcją byłoby coś w stylu:

 

GML
audio_sound_set_loop_point(index,looppoint)

 

i jej odpowiednik get. działałaby ze zmienną loops i byłoby cacy.

Odnośnik do komentarza
Udostępnij na innych stronach

A w jakich okolicznościach to jest używane? Postać się zbliża do źródła muzyki czy coś w tym stylu?

 

Nie dałoby rady wstawić tą 1 przy loop i robić stop-start music?

 

Przykład z manuala

 

GML
if !global.SFX

{

audio_stop_sound(snd_Waterfall);

}

else

{

audio_play_sound_at(snd_Waterfall, x, y, 0, 100, 300, 1, true, 1);

}

Odnośnik do komentarza
Udostępnij na innych stronach

A w jakich okolicznościach to jest używane? Postać się zbliża do źródła muzyki czy coś w tym stylu?

 

Nie dałoby rady wstawić tą 1 przy loop i robić stop-start music?

 

Przykład z manuala

 

GML
if !global.SFX

{

audio_stop_sound(snd_Waterfall);

}

else

{

audio_play_sound_at(snd_Waterfall, x, y, 0, 100, 300, 1, true, 1);

}

 

hm, chyba sie nie rozumiemy. nie chodzi mi o zadna postac, rowniez nie chodzi mi o odtwarzanie dzwieku w jakiejs pozycji. muzyka jest w osobnym obiekcie kontrolerze, ktory po prostu ma wlaczyc muzyke przy starcie w roomie. po prostu background music. jedyne co chce osiągnąć to aby nie było żadnej luki w loopie lub żeby w ogóle loop zaszedł jeśli chce aby muzyka loopowała się NIE od początku, ale od danego momentu. kod w pierwszym poście działałby gdyby nie sprawdzał co klatke warunku if lecz co mikrosekunde.

 

edit: wczoraj zrobilem maly programik obrazujacy problem i rowniez solucja z ktorej nie jestem do konca zadowolny:

 

https://dl.dropboxusercontent.com/u/2648819...msoundissue.exe

Odnośnik do komentarza
Udostępnij na innych stronach

Jako workaround możesz podzielić plik na 2. Najpierw odtwarzasz ten do którego już nie chcesz wracać i potem włączasz ten który już normalnie w całości się loopuje

 

obecnie uzywam tej metody, jest ona nieco lepsza od przedstawionej wcześniej, jednak wymaga tych dwóch plików i dalej opiera się na sprawdzaniu czy powinno przejść do drugiego pliku co klatke a nie częściej, co skutkuje w słyszalnej przerwie między pierwszym a drugim plikiem. nie wspominając ze gra nie zawsze ma idealnie stałe fps

Odnośnik do komentarza
Udostępnij na innych stronach

Nie wskakuje w odpowiednim momencie bo czas stepu nie pokrywa sie z dokladna milisekunda w ktorej dany kawalek powinien sie zaczac badz skonczyc.

Najlepiej zebys wycial loopowane audio do bufera i zrobil audio_queue do ktorego dodajesz zawartosc tego bufera. Niestety nie ma funkcji, albo takowe gdzieś zgubiłem, które pozwoliłyby to zrobić wewnąrz GM'a, wiec jedynym wyjsciem jest trzymanie pliku dzwiekowego jako included file w formacie .wav. Jak bedzie mi sie chcialo dam w edicie lub nastepnej odpowiedzi kod, ale nie obiecuje bo juz mi sie nie chce :v

Odnośnik do komentarza
Udostępnij na innych stronach

Nie wskakuje w odpowiednim momencie bo czas stepu nie pokrywa sie z dokladna milisekunda w ktorej dany kawalek powinien sie zaczac badz skonczyc.

Najlepiej zebys wycial loopowane audio do bufera i zrobil audio_queue do ktorego dodajesz zawartosc tego bufera. Niestety nie ma funkcji, albo takowe gdzieś zgubiłem, które pozwoliłyby to zrobić wewnąrz GM'a, wiec jedynym wyjsciem jest trzymanie pliku dzwiekowego jako included file w formacie .wav. Jak bedzie mi sie chcialo dam w edicie lub nastepnej odpowiedzi kod, ale nie obiecuje bo juz mi sie nie chce :v

 

nie mialem styczności z bufferami i po przeczytaniu w dokumentacji na czym polegają pewnie nadziałbym sobie dużo memory leaków albo innych kłopotów. patrząc na to wszystko denerwuje mnie ze nie ma na to jakiejs prostej funkcji...

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...