如何在NSUserDefault中存储CCSprite



我在处理CCSprite子类Creature时遇到了一个奇怪的问题。

我的目标是生物;

类生物声明-

@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中时

- (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];

问题是,当我加载这个时,我得到了以前存储的生物的属性值,但分配给以前生物的图像可能没有复制。因为如果我将新生物添加到任何CCLayer,它不会显示任何图像,尽管它获得了以前生物的属性值。

我现在可以做些什么来获得带有图像的新作品?是否需要将图像名称添加为单独的属性???

您也可以简单地存储类型,然后这样做:

@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。请注意,使用名称creatureWithType:而不是initializeCreatureWithType:是"更多的Cocoa"。

最新更新