[英]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.