Objective-C-Kategorie und neuer iVar

Ich versuche, die Funktionalität von SimpleAudioEngine von cocos2d zu erweitern, indem ich mehrere Soundeffekte nacheinander als eine Art Kette abspielen kann. Ich habe versucht, dies mit einer Erweiterung zu tun. Jetzt wurde mir jedoch klar, dass ich wahrscheinlich auch einen iVar brauche, um die Namen aller Audiodateien zu speichern und einen, um festzustellen, welcher Sound gerade abgespielt wird.

Es scheint jedoch, dass ich keine iVars zu einer Kategorie hinzufügen kann. Stattdessen habe ich versucht, eine Erweiterung zu verwenden, aber es scheint, dass sie in der ursprünglichen .m-Datei der Klasse enthalten sein müssen, damit dies auch nicht funktioniert. Gibt es noch einen anderen Weg, der es mir erlaubt, dies zu tun?

Die Kopfzeile mit der Kategorie

<code>#import <Foundation/Foundation.h>
@interface SimpleAudioEngine(SoundChainHelper)<CDLongAudioSourceDelegate>
-(void)playSoundChainWithFileNames:(NSString*) filename, ...;
@end
</code>

Und die .m-Datei mit der Endung:

<code>#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
</code>

Alternativ habe ich versucht, die iVars als Eigenschaften zu definieren, die kompiliert werden. Ich kann sie jedoch weder synthetisieren, noch habe ich eine andere Möglichkeit, sie an eine Methode zu binden.

Ich versuche, die Funktionalität als eine Kategorie von SimpleAudioEngine zu implementieren, sodass ich mich nur an eine Klasse erinnern muss, die sich mit all meinen Soundproblemen befasst. und damit ich eine so einfache Kette erstellen kann:

<code>[[SimpleAudioEngine sharedEngine] playSoundChainWithFileNames:@"6a_loose1D.mp3", @"6a_loose2D.mp3", @"6a_loose3D.mp3", @"6a_loose4D.mp3", @"6b_won1D.mp3", nil];
</code>

Wenn es einen anderen Weg gibt, der das gleiche / ein ähnliches Ergebnis liefert, wäre ich auch sehr dankbar.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage