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

时间:2011-05-26 07:44:13

标签: iphone objective-c cocoa-touch xcode

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

我正在制作一款游戏,我希望能够保存游戏状态以防万一有电话或玩家结束游戏继续播放另一次或游戏崩溃,然后选择开始新游戏或继续他/她离开的地方。

游戏状态包含SFX,背景音乐(背景音乐应该在结束时继续播放)。 (两个按钮),一个充满uiimages的网格(图像应该重新出现在游戏结束前的相同位置),得分(高分和玩家核心),等级以及网格外的3个uiimages。

你推荐什么?

那里有没有好的教程?我已经检查了但是我似乎只找到了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;
}

1 个答案:

答案 0 :(得分:1)

我想到的一种方法是将所有这些信息存储在plist或类似物中;事物的坐标和位置,音轨的时间等,然后当用户被提供恢复上一次会话的选项时,你可以只读取所述plist的内容并将所有内容放回原处。

我知道这是一个特别粗略的答案,但这种方法在2&我过去曾经做过的3D应用程序 - 不可否认我们只跟踪了几十个项目 - 我相信你的游戏可能要大得多。

回应你的评论:

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

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

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