Я пытаюсь расширить функциональность SimpleAudioEngine из cocos2d возможностью проигрывать несколько звуковых эффектов один за другим как некую цепочку. Я пытался сделать это с расширением. Однако теперь я понял, что мне, вероятно, также нужен iVar, чтобы запоминать имена всех звуковых файлов, и один, чтобы помнить, какой звук воспроизводится в данный момент.
Однако кажется, что я не могу добавить iVars в категорию. Вместо этого я попытался использовать расширение, но кажется, что они должны быть в исходном .m файле класса, чтобы это тоже не сработало. Есть ли еще один способ, который позволяет мне это сделать?
Заголовок с категорией
#import <Foundation/Foundation.h>
@interface SimpleAudioEngine(SoundChainHelper)<CDLongAudioSourceDelegate>
-(void)playSoundChainWithFileNames:(NSString*) filename, ...;
@end
И .m-файл с расширением:
#import "SoundChainHelper.h"
@interface SimpleAudioEngine() {
NSMutableArray* soundsInChain;
int currentSound;
}
@end
@implementation SimpleAudioEngine(SoundChainHelper)
// read in all filenames and start off playing process
-(void)playSoundChainWithFileNames:(NSString*) filename, ... {
soundsInChain = [[NSMutableArray alloc] initWithCapacity:5];
va_list params;
va_start(params,filename);
while (filename) {
[soundsInChain addObject:filename];
filename = va_arg(params, NSString*);
}
va_end(params);
currentSound = 0;
[self cdAudioSourceDidFinishPlaying:nil];
}
// play first file, this will also always automatically be called as soon as the previous sound has finished playing
-(void)cdAudioSourceDidFinishPlaying:(CDLongAudioSource *)audioSource {
if ([soundsInChain count] > currentSound) {
CDLongAudioSource* mySound = [[CDAudioManager sharedManager] audioSourceForChannel:kASC_Right];
[mySound load:[soundsInChain objectAtIndex:0]];
mySound.delegate = self;
[mySound play];
currentSound++;
}
}
@end
В качестве альтернативы я попытался определить iVars как свойства, которые будут компилироваться. Однако я не могу ни синтезировать их, ни какой-либо другой возможности привязать их к какому-либо методу.
Я пытаюсь реализовать функциональность как категорию SimpleAudioEngine, поэтому мне нужно помнить только один класс, который решает все мои проблемы со звуком. и чтобы я мог создать такую простую цепочку:
[[SimpleAudioEngine sharedEngine] playSoundChainWithFileNames:@"6a_loose1D.mp3", @"6a_loose2D.mp3", @"6a_loose3D.mp3", @"6a_loose4D.mp3", @"6b_won1D.mp3", nil];
Если есть другой способ, дающий тот же/похожий результат, я тоже был бы очень благодарен.