我正在使用 NSKeyedArchiver
归档 NSMutableDictionary
包含 NSMutableArray
子类 SKSpriteNode
秒。这是一款纸牌游戏,我在其中保存了一些游戏统计数据,然后保存了一系列与游戏相关的 Sprite 。
归档工作得很好。我也在实现 - (id)initWithCoder:(NSCoder *)aDecoder
和 - (void)encodeWithCoder:(NSCoder *)aCoder
在我的 SKSpriteNode
子类以确保所有属性(包括 Sprite 的纹理)都编码到存档中。
问题是当我取消归档这个游戏数据时。在 iOS 8 中,我的 NSMutableArray
的 SKSpriteNode
它解压得很好,并以它们的纹理和属性完好无损地添加回游戏中。
然而,在 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。我现在保存 NSMutableArray
或 NSMutableDictionary
在用户默认值中表示我的卡片属性,然后在需要恢复已保存的游戏时根据这些值重建我的 Sprite 。
现在一切正常。
关于ios - 取消存档 SKSpriteNode 会破坏 iOS 7.1 中 Sprite 的 SKTexture,否则没问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27283811/