2014-05-08 18 views
5

Zajmuję się tworzeniem gier napędzających przy użyciu SpriteKit i mam problemy z efektami dźwiękowymi silnika.Odtwarzanie efektów dźwiękowych silnika dla iOS SpriteKit Gra ... AVAudioPlayer vs SKAction vs?

Chcę mieć dwa różne dźwięki silnika. Jeden do naciśnięcia przycisku przepustnicy i drugi, gdy nie jest naciśnięty przycisk przepustnicy. Jeden z dwóch dźwięków będzie grał stale podczas gry.

Jakie jest najlepsze podejście? Czy moje pliki dźwiękowe powinny być ekstremalnie krótkie (0,10 sekundy lub mniej) i zapętlone, czy powinny być dość długie i po prostu włączone i wyłączone? Czy powinienem używać SKAction do odtwarzania dźwięków lub AVAudioPlayer lub czegoś innego? Próbowałem używać AVAudioPlayer, ale za każdym razem, gdy zatrzymuję się i odtwarzam odtwarzacz (włączanie lub wyłączanie przepustnicy), szybkość odtwarzania gry chwilowo spada. Każda pomoc jest doceniana!

+1

Skaction playsound jest bardzo prymitywny. Możesz zajrzeć do ObjectAL. – LearnCocos2D

+0

Ostatnia aktualizacja ObjectAL to 2013-04-16. Jak stabilne jest to w nowszych wersjach systemu iOS? – salocinx

Odpowiedz

6

Na podstawie komentarza pozostawionego przez LearnCocos2D, zajrzałem do ObjectAL. Dla osób niezaznajomionych z ObjectAL został zaprojektowany jako prosty i intuicyjny interfejs dla OpenAL i AVAudioPlayer. można pobrać i znaleźć więcej informacji o tym tutaj ...

http://kstenerud.github.io/ObjectAL-for-iPhone/index.html

Dla mojego klipu audio użyłem 3 do 5 drugiego długiego .caf pliku audio z dźwiękiem silnika. ObjectAL pozwoliło mi na ciągłe zapętlenie i zmianę wysokości pliku audio. Zmieniając skok, mogłem symulować silnik przy różnych prędkościach.

Poniżej znajduje się przykładowy kod ...

Dwie zmienne składowe albo można je ustawić jako właściwości ...

ALBuffer *_buffer; 
ALSource *_source; 

metody zainicjować efekt dźwiękowy silnik ...

- (void)initializeSound 
{ 
    // We'll let OALSimpleAudio deal with the device and context. 
    // Since we're not going to use it for playing effects, don't give it any sources. 
    [OALSimpleAudio sharedInstance].reservedSources = 0; 

    _source = [ALSource source]; 
    _buffer = [[OpenALManager sharedInstance] bufferFromFile:@"EngineSound.caf"]; 
    _source.pitch = 0.30; // Start at low pitch for engine idle. 
    [_source play:_buffer loop:YES]; 
} 

W metodzie aktualizacji SKScene dostosowuję wysokość zgodnie z prędkością.

- (void)update:(CFTimeInterval)currentTime 
{ 
    CGFloat enginePitch; 

    // Code to calculate desired enginePitch value based on vehicle speed. 

    _source.pitch = enginePitch; 
} 

powodu rzekomego błędu w SpriteKit, miałem problem z gpus_ReturnNotPermittedKillClientEXC_BAD_ACCESS błędu podczas zamykania aplikacji. Znalazłem poprawkę tutaj ...

https://stackoverflow.com/a/19283721/3148272

2

Proponuję użyć AVAudioPlayer. Musisz go mieć na własność i nie tworzyć za każdym razem, gdy chcesz coś zagrać. SKAction jest zły w taki sposób, że nie można go zatrzymać ani anulować (nawet przez usunięcie działania).

Powiązane problemy