2012-01-21 8 views
1

CCSpriteのサブクラスCreatureで作業する際に奇妙な問題があります。NSUserDefaultにCCSpriteを保存するには

私の対象は、「クリーチャー*」のクリーチャーです。

クラスクリーチャーはdeclaration-

@interface Creature : CCSprite <NSCoding>{ 

    int creatureAge; 
    NSString *creatureName; 
} 

実装

+(id)initializeCreatureWithType:(int)type 
{ 

    Creature *creature = nil; 




    creature = [[[super alloc] initWithFile:[NSString stringWithFormat:@"ch%i_default.png",type]]autorelease]; 


    return creature; 

} 

私はNSUserDefault using-

- (void)encodeWithCoder:(NSCoder *)encoder { 

    [encoder encodeObject:self.creatureName forKey:@"creatureName"]; 
    [encoder encodeInt:self.creatureAge forKey:@"creatureAge"]; 
} 

そして、中に私のクリーチャークラスオブジェクト '生き物' を保存するときに問題がありますそれを使ってデコードする。

- (id)initWithCoder:(NSCoder *)decoder { 
    if((self = [super init])) { 

     self.creatureName = [decoder decodeObjectForKey:@"creatureName"]; 
     self.creatureAge= [decoder decodeIntForKey:@"creatureAge"]; 
} 

その後

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
NSData *myEncodedObject = [NSKeyedArchiver archivedDataWithRootObject:creature]; 

[defaults setObject:myEncodedObject forKey:@"my_pet"]; 

そして、荷重 -

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
NSData *myEncodedObject = [defaults objectForKey:@"my_pet"]; 
Creature* newcreature = (Creature *)[NSKeyedUnarchiver unarchiveObjectWithData: myEncodedObject]; 

問題は、私はこれをロードしたときに、私が以前に格納された生き物のプロパティ値を取得するということですが、using-生き物オブジェクトを保存以前の生き物に割り当てられた画像はおそらくコピーされません。なぜなら、以前のクリーチャーのプロパティ値を取得するにもかかわらず、私は任意のCCLayerにnewcreatureを追加するとイメージを表示しないからです。

新鮮な画像を取得するにはどうしたらいいですか?別のプロパティとしてイメージ名を追加する必要がありますか?

+0

確かに、答えは、特定のクラスに属するすべてをエンコード/デコードする必要があります。だから私はオブジェクトを使用して対応するイメージが必要な場合、これもエンコード/デコードする必要があります。 – russell

答えて

2

あなたは、単に、同様のタイプを格納し、このようにそれを行うことができます:

@interface Creature : CCSprite { 
    int creatureType; 
    int creatureAge; 
    NSString *creatureName; 
} 

+ (id)creatureWithType:(int)type; 
- (id)initWithCreatureType:(int)type; 
@end 

@implementation Creature 

+ (id)creatureWithType:(int)type 
{ 
    return [[[[self class] alloc] initWithCreatureType:type] autorelease]; 
} 

- (id)initWithCreatureType:(int)type 
{ 
    self = [super initWithFile:[NSString stringWithFormat:@"ch%i_default.png", type]]; 
    if (!self) return nil; 

    creatureType = type; 

    return self; 
} 

- (id)initWithCoder:(NSCoder *)decoder { 
    int type = [decoder decodeIntForKey:@"creatureType"]; 
    self = [self initWithCreatureType:type]; 
    if (!self) return nil; 

    self.creatureName = [decoder decodeObjectForKey:@"creatureName"]; 
    self.creatureAge= [decoder decodeIntForKey:@"creatureAge"]; 

    return self; 
} 

- (void)encodeWithCoder:(NSCoder *)encoder 
{ 
    [encoder encodeInt:creatureType forKey:@"creatureType"]; 
    [encoder encodeObject:self.creatureName forKey:@"creatureName"]; 
    [encoder encodeInt:self.creatureAge forKey:@"creatureAge"]; 
} 
@end 

あなたは、同様の特性を経由してcreatureTypeを公開する場合があります。 initializeCreatureWithType:の代わりに、creatureWithType:という名前を使用するのは「もっとココア」だということに注意してください。

+0

お返事ありがとうございます。私はそれを知っているが、ch%i_default、ch%i_sad、ch%i_happyなどが必要なので、タイプは十分ではないので、NSStringが必要です。しかし、それは主な問題ではない、私は別のプロパティとしてイメージをエンコードする必要があるかどうかは混乱していた。実際には、最初はイメージがオブジェクト自体の中にラップされると思っていたので、それを明示的に追加する必要はありません。誰もなぜそれが起こらないか説明できますか? – russell

+0

生成された文字列( 'ch1_default.png'など)をインスタンス変数に格納し、intで表示したのと同じ方法でエンコード/デコードすることができます。次に' initWithCoder: 'で' self = [self initWithFile :decodedString]; '。イメージを保存する場合は、[UIImagePNGRepresentation](http://developer.apple.com/library/ios/#documentation/uikit/reference/UIKitFunctionReference/Reference/reference.html#//apple_ref/c/func/)を使用します。 UIImagePNGRepresentation)を使用して 'UIImage'を' NSData'に変換し、 '[UIImage imageWithData:]'に変換します。 – DarkDust

関連する問題