繁体   English   中英

我保存和加载游戏状态的最佳方式是什么

[英]What is the best way for me to Save & Load gamestate

我只是想知道,保存/加载游戏状态很难吗?

我正在创建一个游戏,我希望能够保存游戏状态,以防有电话或玩家结束游戏以继续玩另一次或游戏崩溃,然后选择开始新游戏或继续他/她离开了。

游戏状态包含 SFX、背景音乐(背景音乐应该从它结束的地方继续)。 (两个按钮),一个充满 uiimages 的网格(图像应该重新出现在游戏结束前的相同位置),得分(高分和 playercore),级别和网格外的另外 3 个 uiimage。

你有什么建议吗?

有什么好的教程吗? 我已经检查过了,但我似乎只找到 cocos2d 并且我目前没有使用 cocos2d。

//Load the saved gamestate
- (void)loadGameState {
    // Set up the file manager and documents path
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0]; NSMutableData *gameData;
    NSKeyedUnarchiver *decoder;
    NSString *documentPath = [documentsDirectory stringByAppendingPathComponent:@"gameState.dat"];
    gameData = [NSData dataWithContentsOfFile:documentPath]; 
    decoder = [[NSKeyedUnarchiver alloc] initForReadingWithData:gameData];

    NSLog(@"INFO - GameScene: Loading saved game duration."); 
    //timeSinceGameStarted = [[decoder decodeObjectForKey:@"timeSinceGameStarted"] floatValue];
    NSLog(@"INGO - GameScene: Loading saved game score."); 
    playerscore = [[decoder decodeObjectForKey:@"playerscore"] floatValue];
    NSLog(@"INGO - GameScene: Loading saved high score."); 
    highscore = [[decoder decodeObjectForKey:@"highscore"] floatValue];
    NSLog(@"INGO - GameScene: Loading saved level."); 
    level = [[decoder decodeObjectForKey:@"Level"] floatValue];
    NSLog(@"INFO - GameScene: Loading game time data."); 

    [decoder release];
}

//Saving the current gamestate
-(void)saveGameState {
    NSLog(@"Saving game state");

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *gameStatePath = [documentsDirectory stringByAppendingPathComponent:@"gameState.dat"];

    NSMutableData *gameData; 
    NSKeyedArchiver *encoder; 
    gameData = [NSMutableData data]; 
    encoder = [[NSKeyedArchiver alloc] initForWritingWithMutableData:gameData];

    // Archive the games timer settings
    NSNumber *savedGameStartTime = [NSNumber numberWithFloat:totalSeconds]; 
    //NSNumber *savedTimeSinceGameStarted = [NSNumber numberWithFloat:timeSinceGameStarted]; 
    NSNumber *savedPlayerScore = [NSNumber numberWithFloat:playerscore];
    NSNumber *savedHighScore = [NSNumber numberWithFloat:highscore];
    NSNumber *savedcurrentlevel = [NSNumber numberWithFloat:level];

    [encoder encodeObject:savedGameStartTime forKey:@"gameStartTime"];
    //[encoder encodeObject:savedTimeSinceGameStarted forKey:@"timeSinceGameStarted"];

    [encoder encodeObject:savedPlayerScore forKey:@"playerscore"]; 
    [encoder encodeObject:savedHighScore forKey:@"highscore"]; 

    [encoder encodeObject:savedcurrentlevel forKey:@"Level"]; 

    // Finish encoding and write the contents of gameData to file
    [encoder finishEncoding]; 
    [gameData writeToFile:gameStatePath atomically:YES]; 
    [encoder release];

    // Tell the game controller that a resumed game is available
    //sharedGameController.resumedGameAvailable = YES;
}

我想到的一种方法是将所有这些信息存储在 plist 或类似文件中; 事物的坐标和位置,音乐曲目的时间等,然后当用户看到恢复上一个 session 的选项时,您只需阅读所述 plist 的内容并将所有内容放回原处即可。

我知道这是一个特别粗略的答案,但这种方法在我过去工作过的 2 和 3D 应用程序中有效 - 诚然,我们只跟踪了几十个项目 - 我相信你的游戏可能会更大。

回应您的评论:

为此,我使用了 NSUserDefaults - 因此您可以通过查看 Apple 网站上的 class 参考资料找到一些很好的信息。 在相关位置创建一个 NSUserDefaults 成员,然后可以轮询您的图形实例和音乐类等以了解它们的距离 - 所以您需要编写一个方法来为您想要保存的每个 class 返回此信息 - 或:对于每一帧,让各自的类自动将它们的最新位置等写入您的默认文件。 要设置默认文件...

yourNSUserDefaultsMember = [NSUserDefaults standardUserDefaults];
[[NSUserDefaults standardUserDefaults] registerDefaults:[NSDictionary dictionaryWithContentsOfFile: [[NSBundle mainBundle]pathForResource: @"Defaults" ofType: @"plist"]]];

为了使其工作,您需要创建一个名为 Defaults 的 plist 文件或任何您喜欢的文件。 然后使用位于 class 参考中的方法调用,您可以轻松地向其写入字符串和整数等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM