このクラスには、プロトコル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 です。CCNode
NSCoding
@interface LevelData : CCNode <NSCoding>
でのプロトコルの実装を次に示しますPlayerData
。NSMutableArray
オブジェクトに準拠するカスタム 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 つの異なる配列があります)。