没有显示SKSpriteNode



当我从保存状态恢复时,我的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个动作都是由玩家职业发起的。我只是看不到玩家的精灵。

编辑:添加视频

播放器类初始化视频。

从保存状态恢复播放器类的视频:

对不起,这是一个老问题,但我刚刚开始设置保存我的游戏以及遇到这个。我没有看到任何答案,所以我想我应该贡献一下。

我不确定设置纹理是否也会自动设置精灵大小,我还没有测试过,但我的精灵最初是用

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

该方法要求纹理和大小,我注意到你正在重新设置纹理属性,但缺少a:

self.size = CGSizeMake(w,h)

-(instancetype)initWithCoder:(NSCoder *)decoder

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

更新

结果是,self必须以不同的方式初始化,而不是与self = [super initWithCoder:decoder]初始化。下面是我在纸牌精灵上的完整init方法:

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

最新更新