0

このクラスには、プロトコルNSMutableArrayを実装するカスタム Cocos2d オブジェクトがあります。NSCoding

@interface PlayerData : NSObject <NSCoding> {
}

@property (readwrite, nonatomic) NSMutableArray *levelsStars; //Where levelsStars is filled with objects conforming to the NSCoding protocol.

オブジェクトは(Cocos2d クラス)LevelDataから継承し、プロトコルに準拠する type です。CCNodeNSCoding

@interface LevelData : CCNode <NSCoding>

でのプロトコルの実装を次に示しますPlayerDataNSMutableArrayオブジェクトに準拠するカスタム Cocos2d オブジェクトをエンコードおよびデコードするにはNSCoding:

-(void) encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:[NSKeyedArchiver archivedDataWithRootObject:levelsStars] forKey:kLevelsStars];
}


-(id) initWithCoder:(NSCoder *)aDecoder
{
    self = [super init];
    if (self) {
        //Reading arrays:
        NSData * dataRepresentingLevelStars = [aDecoder decodeObjectForKey:kLevelsStars];
        if (dataRepresentingLevelStars!=nil) {
            NSArray * oldSavedArray = [NSKeyedUnarchiver unarchiveObjectWithData:dataRepresentingLevelStars];
            if (dataRepresentingLevelStars!=nil) {
                levelsStars = [NSMutableArray arrayWithArray:oldSavedArray];
            }
            else
            {
                levelsStars = [[NSMutableArray array] initWithCapacity:10];
            }
        }

    }

    return self;
}

このアプローチは正しいですか?この質問/回答に基づいています。

編集:ユースケースにさらに詳細を追加すると思いました

ユーザーはさまざまなキャラクターから選択できます。各キャラクターは、ユーザーのゲーム センター ID (id-character1.archive、id-character2.archive など) を追加して別のファイルに格納する予定の PlayerData オブジェクトに対応します。

Cocos2d オブジェクトの NSMutableArray カスタム配列を含むオブジェクト (スコア、ライフなど) のキャラクターの進行状況を保存します (私の実際のケースでは、それぞれ 20/30 オブジェクトを含む 5 つの異なる配列があります)。

4

1 に答える 1

0

PlayerData オブジェクトのメインの init メソッドで、アーカイブを解除します。

- (id)init {
    self = [super init];
    if (self) {
        self.levelsStars = [NSKeyedUnarchiver unarchiveObjectWithFile:pathToArchive];
        if (self.levelsStars == nil) self.levelsStars = [NSMutableArray array];
    }
}

これにより、配列内にあった各オブジェクトで initWithCoder: が呼び出されます。そして、それらを変更可能な配列に戻します。

ただし、PlayerData オブジェクトで、データを保存するためのメソッドが必要になる場合があります。

- (void)applicationDidEnterBackground:(NSNotification *)notification {
    [NSKeyedArchiver archiveRootObject:self.levelsStars toFile:pathToArchive];
}

これにより、配列内の各オブジェクトに対して encodeWithCoder: が呼び出され、それらがファイルに書き込まれます。

于 2013-08-22T13:49:03.340 に答える