首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在NSUserDefault中存储CCSprite

如何在NSUserDefault中存储CCSprite
EN

Stack Overflow用户
提问于 2012-01-21 22:18:26
回答 1查看 344关注 0票数 1

在使用CCSprite子类生物时,我遇到了一个奇怪的问题。

让我们,我的对象是生物*生物;

类生物声明-

代码语言:javascript
运行
复制
@interface Creature : CCSprite <NSCoding>{

    int creatureAge;
    NSString *creatureName;
}

实现

代码语言:javascript
运行
复制
+(id)initializeCreatureWithType:(int)type
{

    Creature *creature = nil;




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


    return creature;

}

问题是当我在NSUserDefault中存储我的生物类对象‘生物’时-

代码语言:javascript
运行
复制
- (void)encodeWithCoder:(NSCoder *)encoder {

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

把它解码成-

代码语言:javascript
运行
复制
- (id)initWithCoder:(NSCoder *)decoder {
    if((self = [super init])) {

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

然后使用以下命令保存生物对象-

代码语言:javascript
运行
复制
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *myEncodedObject = [NSKeyedArchiver archivedDataWithRootObject:creature];

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

以及负载-

代码语言:javascript
运行
复制
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
 NSData *myEncodedObject = [defaults objectForKey:@"my_pet"];
 Creature* newcreature = (Creature *)[NSKeyedUnarchiver unarchiveObjectWithData: myEncodedObject];

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

我现在该怎么做才能让这个新生物有图像呢?是否需要添加镜像名称作为单独的属性?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-21 22:36:29

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

代码语言:javascript
运行
复制
@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:是“更多可可”。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8953661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档