【问题标题】:NSKeyedUnarchiver SKSpriteNode not showingNSKeyedUnarchiver SKSpriteNode 未显示
【发布时间】:2014-06-10 14:09:07
【问题描述】:

当我从保存状态恢复时,我的 SKSpriteNode 没有出现在视图中。

在保存和恢复过程中没有错误或警告。

我正在使用此代码保存我的播放器类:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:_player];
[defaults setObject:data forKey:@"player"];
[defaults synchronize];

我的播放器类有以下编码器/解码器:

-(void)encodeWithCoder:(NSCoder *)encoder {
[encoder encodeObject:self.currentPlatform forKey:@"currentPlatform"];
[encoder encodeObject:[NSNumber numberWithBool:self.floorContact] forKey:@"floorContact"];
[encoder encodeObject:[NSNumber numberWithInt:self.currentState] forKey:@"currentState"];
// and many more...
}

-(instancetype)initWithCoder:(NSCoder *)decoder {
    if (self = [super initWithCoder:decoder]) {
        _animations = [Animations sharedInstance];
        self.texture = [_animations playerStart];
        self.texture.filteringMode = SKTextureFilteringNearest;
        self.name = @"player";
        self.zPosition = 999;
        // more physicsBody stuff...

        self.currentPlatform = [decoder decodeObjectForKey:@"currentPlatform"];
        self.floorContact = [[decoder decodeObjectForKey:@"floorContact"] boolValue];
        self.currentState = [[decoder decodeObjectForKey:@"currentState"] intValue];
        // and many more...
    }
    return self;
}

然后我用这个代码恢复我的播放器:

NSData *savedPlayer = [[NSUserDefaults standardUserDefaults] objectForKey:@"player"];
_player = [NSKeyedUnarchiver unarchiveObjectWithData:savedPlayer];

问题是恢复后播放器精灵不可见。然而,点击屏幕,玩家跳跃(视图上下移动)、挥剑(存在音效)和发射导弹(导弹可见且移动)——所有 3 个动作都是从玩家类启动的。我只是看不到玩家精灵。

编辑:添加视频

播放器类初始化的Video

Video of restore player class from saved state:

【问题讨论】:

    标签: ios sprite-kit nsuserdefaults nskeyedarchiver nskeyedunarchiver


    【解决方案1】:

    抱歉,这是一个老问题,但我刚刚开始设置保存我的游戏,并遇到了这个问题。我没有看到任何答案,所以我想我会做出贡献。

    我不确定像你这样设置纹理是否也会自动设置精灵大小,我还没有测试过,但我的精灵最初是用以下方式创建的:

    [SKSpriteNode spriteNodeWithTexture:<#Texture#> size:CGSizeMake(<#Width#>,<#Height#>)]
    

    该方法要求同时提供纹理和大小,我注意到您正在重新设置纹理属性,但缺少:

    self.size = CGSizeMake(w,h)
    

    -(instancetype)initWithCoder:(NSCoder *)decoder
    

    也许精灵正在构建中,它们只是不可见,因为它们的宽度和高度为 0?

    更新

    事实证明,self 只需要以不同的方式初始化,而不是 self = [super initWithCoder:decoder]。这是我在纸牌精灵上的完整初始化方法:

    - (id)initWithCoder:(NSCoder *)aDecoder
    {
        self = [super initWithTexture:[aDecoder decodeObjectForKey:@"texture"] color:[UIColor clearColor] size:CGSizeMake(106,156)];
        if(self) {
            self.name = [aDecoder decodeObjectForKey:@"name"];
            self.theme = [aDecoder decodeObjectForKey:@"theme"];
            self.suit = [aDecoder decodeObjectForKey:@"suit"];
            self.value = [aDecoder decodeIntForKey:@"value"];
            self.ID = [aDecoder decodeIntForKey:@"ID"];
            self.locked = [aDecoder decodeBoolForKey:@"locked"];
            self.faceUp = [aDecoder decodeBoolForKey:@"faceUp"];
            self.black = [aDecoder decodeBoolForKey:@"black"];
            self.dealCard = [aDecoder decodeBoolForKey:@"dealCard"];
            self.highlighted = [aDecoder decodeBoolForKey:@"highlighted"];
            self.highlightAction = [aDecoder decodeObjectForKey:@"highlightAction"];
            self.inStackNode = [aDecoder decodeObjectForKey:@"inStackNode"];
            self.shadowNode = [aDecoder decodeObjectForKey:@"shadowNode"];
            self.highlightNode = [aDecoder decodeObjectForKey:@"highlightNode"];
            self.zPosition = [aDecoder decodeFloatForKey:@"zPosition"];
            [self addChild:self.shadowNode];
            [self addChild:self.inStackNode];
        }
        return self;
    }
    

    【讨论】:

    • 好点。我最终以另一种方式解决了我的问题,但您的建议很可能是问题所在。
    • 实际上,事实证明根本不是这样。昨天我完成了我的测试,发现 self 必须初始化为:self = [super initWithTexture:[aDecoder decodeObjectForKey:@"texture"] color:[UIColor clearColor] size:CGSizeMake(&lt;#width#&gt;,&lt;#height#&gt;)]; self = [super initWithCoder:decoder] 不是为我做的,并且精灵被渲染为无纹理,即使我们设置了self.texture = &lt;#SKTexture#&gt;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多