当我从保存的状态恢复时,我的 SKSpriteNode 没有出现在 View 中。
保存和恢复过程中没有错误或警告。
我正在使用这段代码保存我的播放器类:
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];
问题是恢复后玩家 Sprite 不可见。然而,点击屏幕,玩家跳跃( View 上下移动)、挥剑(出现音效)和发射导弹(导弹可见并移动)——所有 3 个 Action 都是从玩家类发起的。我只是看不到玩家 Sprite 。
编辑:添加视频
Video播放器类初始化。
Video从保存的状态恢复播放器类:
最佳答案
抱歉,这是一个老问题,但我刚刚开始设置保存我的游戏并遇到了这个。我没有看到任何答案,所以我想我会做出贡献。
我不确定像你这样设置纹理是否也会自动设置 Sprite 大小,我还没有测试过,但我的 Sprite 最初是用以下方法创建的:
[SKSpriteNode spriteNodeWithTexture:<#Texture#> size:CGSizeMake(<#Width#>,<#Height#>)]
该方法要求提供纹理和尺寸,我注意到您正在重新设置纹理属性,但缺少:
self.size = CGSizeMake(w,h)
在
-(instancetype)initWithCoder:(NSCoder *)decoder
也许 Sprite 正在构建中,但它们只是不可见,因为它们的宽度和高度均为 0?
更新
事实证明,self
只需要以不同的方式初始化,而不是使用 self = [super initWithCoder:decoder]
。这是我在扑克牌 Sprite 上的完整初始化方法:
- (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;
}
关于ios - NSKeyedUnarchiver SKSpriteNode 不显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24143183/