Как хранить CCSprite в NSUserDefault - PullRequest
1 голос
/ 21 января 2012

У меня странная проблема при работе с подклассом CCSprite Creature.

Позвольте, мой объект - Существо * существо;

Объявление класса 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, оно не отобразит никакого изображения, хотя и получит значение свойства предыдущего существа.

Что я могу сделать сейчас, чтобы получить новое существо с изображением?нужно ли добавлять имя изображения как отдельное свойство ???

1 Ответ

2 голосов
/ 21 января 2012

Вы можете просто сохранить тип, а затем сделать это так:

@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:.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...