Staram się rozszerzyć funkcjonalność SimpleAudioEngine z cocos2d z możliwością odtwarzania kilku efektów dźwiękowych jeden po drugim jako pewnego rodzaju łańcucha. Próbowałem to zrobić z rozszerzeniem. Jednak teraz zdałem sobie sprawę, że prawdopodobnie potrzebuję również iVar, aby zapamiętać nazwy wszystkich plików dźwiękowych i jeden do zapamiętania, który dźwięk jest obecnie odtwarzany.Objective-C Kategoria i nowy iVar
Wygląda jednak na to, że nie mogę dodać iVars do kategorii. Zamiast tego próbowałem użyć rozszerzenia, ale wygląda na to, że muszą znajdować się w oryginalnym pliku .m klasy, więc to też nie zadziała. Czy istnieje jeszcze inny sposób, który pozwala mi to zrobić?
Nagłówek z kategorii
#import <Foundation/Foundation.h>
@interface SimpleAudioEngine(SoundChainHelper)<CDLongAudioSourceDelegate>
-(void)playSoundChainWithFileNames:(NSString*) filename, ...;
@end
a .m-pliku z rozszerzeniem:
#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
Alternatywnie próbowałem zdefiniować Ivars jako właściwości, które będzie skompilować. Jednak nie mogę ich ani syntezować, ani nie mam żadnej innej możliwości związania ich z żadną metodą.
Próbuję wdrożyć funkcjonalność jako kategorię SimpleAudioEngine, tak że potrzebuję tylko pamiętać jedną klasę, która zajmuje się wszystkimi moimi problemami z dźwiękiem. i tak, że mogę stworzyć łańcuch tak proste, jak to:
[[SimpleAudioEngine sharedEngine] playSoundChainWithFileNames:@"6a_loose1D.mp3", @"6a_loose2D.mp3", @"6a_loose3D.mp3", @"6a_loose4D.mp3", @"6b_won1D.mp3", nil];
Jeśli istnieje inny sposób, który daje taki sam/podobny wynik byłbym bardzo wdzięczny.
Dlaczego nie ma podklasy SimpleAudioEngine? – lawicko
możliwy duplikat [Objective-C: Property in Category] (http: // stackoverflow.com/questions/8733104/target-c-property-in-category) – hfossli