2014-05-08 14 views
5

Sto sviluppando un gioco di guida usando SpriteKit e sto avendo problemi con gli effetti sonori del motore.Riproduzione effetti sonori motore per iOS SpriteKit Gioco ... AVAudioPlayer vs SKAction vs?

Voglio avere due suoni diversi del motore. Uno per quando viene premuto il pulsante dell'acceleratore e uno per quando il pulsante dell'acceleratore non viene premuto. Uno dei due suoni verrà riprodotto costantemente mentre il gioco sta andando.

Qual è l'approccio migliore? I miei file audio dovrebbero essere estremamente brevi (0,10 secondi o meno) e in loop o dovrebbero essere abbastanza lunghi e attivati ​​e disattivati? Devo usare SKAction per riprodurre i suoni o AVAudioPlayer o qualcos'altro? Ho provato a utilizzare AVAudioPlayer ma ogni volta che metto in pausa e riproduco il lettore (accendendo o spegnendo il motore), la frequenza fotogrammi del gioco diminuisce momentaneamente. Qualsiasi aiuto è apprezzato!

+1

Skaction PlaySound è estremamente rudimentale. Potresti voler cercare in ObjectAL. – LearnCocos2D

+0

L'ultimo aggiornamento di ObjectAL è il 2013-04-16. Quanto è stabile con le versioni iOS più recenti? – salocinx

risposta

6

Sulla base del commento lasciato da LearnCocos2D, ho esaminato ObjectAL. Per chi non ha familiarità con ObjectAL, è progettato per essere un'interfaccia semplice e intuitiva a OpenAL e AVAudioPlayer. È possibile scaricare e trovare maggiori informazioni su di esso qui ...

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

Per la mia clip audio che ho usato da 3 a 5 secondo file audio .caf lunga di un suono del motore. ObjectAL mi ha permesso di effettuare un ciclo continuo e variare il tono del file audio. Variando il tono, ho potuto simulare il motore a diverse velocità.

Qui di seguito è un esempio del codice ...

due variabili membro oppure è possibile impostare come proprietà ...

ALBuffer *_buffer; 
ALSource *_source; 

metodo per inizializzare l'effetto sonoro del motore ...

- (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]; 
} 

All'interno del mio metodo di aggiornamento SKScene ho regolato il passo in base alla velocità.

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

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

    _source.pitch = enginePitch; 
} 

A causa di un presunto bug in SpriteKit, ho avuto un problema con un errore gpus_ReturnNotPermittedKillClientEXC_BAD_ACCESS quando si chiude l'applicazione. Ho trovato la soluzione qui ...

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

2

Suggerirei di utilizzare AVAudioPlayer. Devi averlo in proprietà e non creare ogni volta che vuoi giocare qualcosa. SKAction è cattivo in un modo che non è possibile interrompere o annullare (anche rimuovendo l'azione).

Problemi correlati