2012-04-07 5 views
2

Ich habe einen Lade-Sound-Effekt, der 8 Sekunden lang ist, der ausgelöst wird, um nur am Ende jedes Levels in meinem Spiel zu spielen.Der Sound-Effekt stoppt in der Mitte, wenn mehrere Sounds gespielt werden?

Das Problem ist, der Sound-Effekt stoppt auf halbem Weg, wenn andere Sounds zur gleichen Zeit spielen (Laser, Explosionen, etc). Ich habe an anderer Stelle gelesen, dass Sie bis zu 32 gleichzeitige Sounds gleichzeitig spielen können, aber das Spiel kann vielleicht bis zu 7 oder 8 Soundeffekte gleichzeitig spielen. Aber der Auflade-Sound-Effekt hört immer noch auf.

Wenn ich im Spiel nicht schieße und den Aufladungseffekt nur spielen lasse, spielt er den ganzen Weg durch.

ich vorzuladen meine Töne beim Start wie folgt:

-(void)setupSound 
{ 
    [[SimpleAudioEngine sharedEngine] playBackgroundMusic:@"Kickshock.mp3" loop:YES]; 
    [[SimpleAudioEngine sharedEngine] preloadEffect:@"explosion_large.caf"]; 
    [[SimpleAudioEngine sharedEngine] preloadEffect:@"explosion_small.caf"]; 
    [[SimpleAudioEngine sharedEngine] preloadEffect:@"laser_ship.caf"]; 
    [[SimpleAudioEngine sharedEngine] preloadEffect:@"powerup.mp3"]; 
    [[SimpleAudioEngine sharedEngine] preloadEffect:@"railgun.mp3"]; 
    [[SimpleAudioEngine sharedEngine] preloadEffect:@"metal.mp3"]; 
    [[SimpleAudioEngine sharedEngine] preloadEffect:@"count.mp3"]; 
    [[SimpleAudioEngine sharedEngine] preloadEffect:@"charge_up.mp3"]; 
} 

-(id)init 
{ 
    if((self = [super init])) 
    { 
     [self setupSound]; 
     // Rest of other code.. 
    } 
    return self; 
} 

und ich sie spielen, wenn nötig (Laser-Schießen, Ende Ebene, Dinge explodieren, etc.):

[[SimpleAudioEngine sharedEngine] playEffect:@"charge_up.mp3" pitch:1.0 pan:0.0 gain:0.4]; 

I‘ Ich nehme an, dass der Auflade-Sound seinen "Slot" verliert, da andere Sounds spielen? Wie oben erwähnt, habe ich nur 7 oder 8 Sounds, die gleichzeitig abgespielt werden, wenn der Lade-Sound-Effekt abschneidet.

Wenn mein Sound seinen "Slot" verliert, gibt es eine Möglichkeit, dass ich einen bestimmten Sound-Effekt einsperren kann, damit er seinen "Slot" nicht verliert?

Irgendeine Idee, was ich falsch mache oder was ich tun kann, um das zu beheben? Jede Hilfe wird sehr geschätzt! : D Danke fürs schauen.

Antwort

1

Um mehrere Sounds zu spielen, würde ich CDAudioManager mit CDSoundEngine anstelle von SimpleAudioEngine verwenden.

CDSoundEngine erlaubt mehrere Kanäle (bis zu 32), die gleichzeitig Sounds abspielen können.

Beispiel:

// create engine 
CDSoundEngine * engine = [CDAudioManager sharedManager].soundEngine; 

// assign groups 
NSArray * groups = [NSArray arrayWithObjects: 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], nil]; 

[engine defineSourceGroups:groups]; 
[CDAudioManager initAsynchronously:kAMM_FxPlusMusicIfNoOtherAudio]; 

// load requests 
NSMutableArray * requests = [[[NSMutableArray alloc] init] autorelease]; 

NSString * plist_sounds = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:[NSString stringWithFormat:@"Sounds.plist"]]; 
if (![[NSFileManager defaultManager] fileExistsAtPath:plist_sounds]) { 
    plist_sounds = [[NSBundle mainBundle] pathForResource:@"Sounds" ofType:@"plist"]; 
} 
NSDictionary * dictionary_sounds = [[NSDictionary dictionaryWithContentsOfFile:plist_sounds] objectForKey:@"Sounds"]; 
if (dictionary_sounds != nil) { 
    for (id key in dictionary_sounds) { 
     [requests addObject:[[[CDBufferLoadRequest alloc] init:[key intValue] filePath:[dictionary_sounds objectForKey:key]] autorelease]]; 
    } 
} 

[engine loadBuffersAsynchronously:requests]; 

Dann einen Ton zu spielen:

- (ALuint)play:(NSInteger)sound group:(NSInteger)group loop:(BOOL)forever volume:(float)volume { 
    [[CDAudioManager sharedManager].soundEngine playSound:sound sourceGroupId:group pitch:1.0f pan:0.0f gain:volume loop:forever]; 
} 
1

Ok Ich habe es herausgefunden, nachdem sie von dem Tutorial zu beobachten:

http://bobueland.com/cocos2d/?p=200

Ich wusste nicht, dass SimpleAudioEngine für kurze Soundeffekte gemeint ist.

Für diejenigen, die an dieser Stelle stecken geblieben sind, dann ist hier, was ich tat:

In der Schnittstelle:

CDLongAudioSource *rightChannel; 

In meinem init oder setupSound Methode:

rightChannel = [[CDAudioManager sharedManager] audioSourceForChannel:kASC_Right]; 
[rightChannel load:@"charge_up.mp3"]; 

Und wenn ich es spielen möchte:

[rightChannel play]; 

Ich bin mir sicher, dass das nur funktioniert, wenn du nur einen langen Klangeffekt hast. Wenn Sie mehrere lange Soundeffekte haben, bin ich mir sicher, dass Sie anders vorgehen müssen. Es sei denn, ich erstelle nur mehr Instanzen von CDLongAudioSource? Hat jemand irgendwelche Links/Tutorials dafür? Vielen Dank!

1

sorry für mein einfaches Englisch ...
einfachen Motor 32 Audiokanäle im Moment max haben

if(SoundId == 0) 
{ 
    // when you say playEffect engine capture one channel for effect 
    // do playEffect once and save result SoundID for Stop or Resume effect 
    SoundId = SimpleAudioEngine::sharedEngine()->playEffect("audio.mp3"); 
} 
// effect loaded, channel captured, say resume for play effect again, nothing more 
else 
{ 
    SimpleAudioEngine::sharedEngine()->resumeEffect(SoundId); 
} 

// if you say effect nothing will happen with channel try 
SimpleAudioEngine::sharedEngine()->stopEffect(SoundID); 

In diesem Fall wird der Kanal des ersten Effekts nicht sein ersetzt durch einen neuen Effekt, , wenn die Anzahl der Läufe mehr als 32