0

保存した状態から復元しているときに、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 つのアクションはすべてプレイヤー クラスから開始されます。プレイヤースプライトが見えません。

編集:ビデオを追加しました

プレーヤー クラスの初期化のビデオ。

保存された状態からプレーヤー クラスを復元​​するビデオ:

4

1 に答える 1

1

申し訳ありませんが、これは少し古い質問ですが、ゲームの保存もセットアップし始めたばかりで、これに遭遇しました。答えがなかったので、貢献したいと思いました。

あなたのようにテクスチャを設定すると、スプライトのサイズも自動的に設定されるかどうかはわかりません。これはまだテストしていませんが、スプライトはもともと次のように作成されています。

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

そのメソッドはテクスチャとサイズの両方を要求します。テクスチャ プロパティを再設定していることに気付きましたが、次のものがありません。

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;
}
于 2014-12-01T02:26:09.560 に答える