ios - 取消存档 SKSpriteNode 会破坏 iOS 7.1 中 Sprite 的 SKTexture,否则没问题

标签 ios objective-c sprite-kit nskeyedarchiver skspritenode

我正在使用 NSKeyedArchiver归档 NSMutableDictionary包含 NSMutableArray子类 SKSpriteNode秒。这是一款纸牌游戏,我在其中保存了一些游戏统计数据,然后保存了一系列与游戏相关的 Sprite 。

归档工作得很好。我也在实现 - (id)initWithCoder:(NSCoder *)aDecoder- (void)encodeWithCoder:(NSCoder *)aCoder在我的 SKSpriteNode子类以确保所有属性(包括 Sprite 的纹理)都编码到存档中。

问题是当我取消归档这个游戏数据时。在 iOS 8 中,我的 NSMutableArraySKSpriteNode它解压得很好,并以它们的纹理和属性完好无损地添加回游戏中。

然而,在 iOS 7.1 中,除节点的纹理外,所有内容都会解包。相反,我收到错误:SKTexture: Error loading image resource: "MissingResource.png"我的 Sprite 用大红色 X 代替它们的纹理。

这是我的代码:

存档:

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    SKView *view = (SKView *)self.window.rootViewController.view;
    if( view.scene ) {
        GameScene* game = (GameScene*)view.scene;

        NSMutableDictionary* currentGame = [[NSMutableDictionary alloc] init];

        // game stats
        [currentGame setObject:[[Global getSharedInstance] undoStack] forKey:@"undoStack"];
        [currentGame setObject:[NSNumber numberWithInt:game.hints] forKey:@"remainingHints"];
        [currentGame setObject:[NSNumber numberWithInt:game.undos] forKey:@"remainingUndos"];
        [currentGame setObject:[NSNumber numberWithInt:[[Global getSharedInstance] moves]] forKey:@"gameMoves"];
        [currentGame setObject:[NSNumber numberWithInt:[[Global getSharedInstance] score]] forKey:@"gameScore"];
        [currentGame setObject:[NSNumber numberWithInteger:[[Global getSharedInstance] elapsedTime]] forKey:@"elapsedTime"];
        [currentGame setObject:[NSNumber numberWithInteger:[[Global getSharedInstance] minutes]] forKey:@"minutes"];
        [currentGame setObject:[NSNumber numberWithInteger:[[Global getSharedInstance] startedTimeInterval]] forKey:@"startedTimeInterval"];
        [currentGame setObject:[NSNumber numberWithInteger:[[Global getSharedInstance] elapsedPauseTime]] forKey:@"elapsedPauseTime"];
        [currentGame setObject:[NSNumber numberWithInteger:[[Global getSharedInstance] lastPauseTime]] forKey:@"lastPauseTime"];

        // here - game cards SKSpriteNodes
        [currentGame setObject:game.cards forKey:@"cards"];

        // encode to disk
        NSData* encodedData = [NSKeyedArchiver archivedDataWithRootObject:currentGame];
        [encodedData writeToFile:[Global gameDataFilePath] atomically:YES];
    }
}

Sprite 编码

- (id)initWithCoder:(NSCoder *)aDecoder
{
    NSLog(@"%@",[aDecoder decodeObjectForKey:@"texture"]);

    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;
}

- (void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:self.theme forKey:@"theme"];
    [aCoder encodeObject:self.suit forKey:@"suit"];
    [aCoder encodeInt:self.value forKey:@"value"];
    [aCoder encodeInt:self.ID forKey:@"ID"];
    [aCoder encodeBool:self.black forKey:@"black"];
    [aCoder encodeBool:self.locked forKey:@"locked"];
    [aCoder encodeBool:self.faceUp forKey:@"faceUp"];
    [aCoder encodeBool:self.dealCard forKey:@"dealCard"];
    [aCoder encodeBool:self.highlighted forKey:@"highlighted"];
    [aCoder encodeObject:self.highlightAction forKey:@"highlightAction"];
    [aCoder encodeObject:self.inStackNode forKey:@"inStackNode"];
    [aCoder encodeObject:self.shadowNode forKey:@"shadowNode"];
    [aCoder encodeObject:self.highlightNode forKey:@"highlightNode"];
    [aCoder encodeObject:self.name forKey:@"name"];
    [aCoder encodeFloat:self.xScale forKey:@"scale"];
    [aCoder encodeFloat:self.zPosition forKey:@"zPosition"];
    [aCoder encodeObject:self.texture forKey:@"texture"];
}

NSLog()- (id)initWithCoder:(NSCoder *)aDecoder方法在 iOS 8 中打印正确的 SKTexture,在 iOS 7 中打印缺失图像 SKTexture。

想法?

最佳答案

根据我自己的问题,我选择做的是将游戏状态存储在 [NSUserDefaults standardUserDefaults][NSUbiquitousKeyValueStore defaultStore] 中用于 iCloud。我现在保存 NSMutableArrayNSMutableDictionary 在用户默认值中表示我的卡片属性,然后在需要恢复已保存的游戏时根据这些值重建我的 Sprite 。

现在一切正常。

关于ios - 取消存档 SKSpriteNode 会破坏 iOS 7.1 中 Sprite 的 SKTexture,否则没问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27283811/

相关文章:

ios - 如何响应来自 GCD 的内存压力通知?

ios - ViewController 中快速的多维数组

swift - SpriteKit : why node in collision has category bit mask of 4294967295 when this category was never assigned to a node

ios - SpriteKit : Just wondering why my script won't work properly?

iphone - iOS:企业服务器架构

iphone - lowercaseStringWithLocale是做什么的?

objective-c - 在 Objective-C 中解析 ISO8601 日期(iPhone OS SDK)

ios - 如何连接两个字段以使用 NSPredicate 进行搜索?

ios - 错误的区域计算 objective-c ?

swift - 在 Swift 中枚举类成员