Как лучше всего сохранять и загружать игровое состояние? - PullRequest
1 голос
/ 26 мая 2011

Мне было просто интересно, сложно ли сохранить / загрузить состояние игры?

Я создаю игру и хочу сохранить состояние игры на случай, если поступит вызов или игрок завершит игру, чтобы продолжить играть в другой раз, или игра вылетает, а затем дать возможность начать новую игру. или продолжайте с того места, где он остановился.

Состояние игры содержит 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 Ответ

1 голос
/ 26 мая 2011

Единственный способ, который мне приходит в голову, - хранить всю эту информацию в списке или аналогичном; координаты и положения вещей, время музыкальной дорожки и т. д., а затем, когда пользователю предоставляется возможность возобновить свою последнюю сессию, вы можете просто прочитать содержимое указанного списка и все вернуть туда, где оно было.

Я понимаю, что это очень грубый ответ, но эта методология сработала в приложениях 2 & 3D, над которыми я работал в прошлом - по общему признанию, мы отслеживали только несколько десятков элементов - я уверен, что ваша игра, вероятно, будет намного больше.

В ответ на ваш комментарий:

Для этого я использовал NSUserDefaults - так что вы найдете некоторую полезную информацию, посмотрев ссылку на класс на сайте Apple. Создайте член NSUserDefaults в соответствующем месте, которое затем может опрашивать экземпляры вашей графики, классы музыки и т. Д., Чтобы выяснить, насколько они длинны - поэтому вам нужно написать метод, который возвращает эту информацию для каждого класса, который вы хотите сохранить - или : для каждого кадра получите соответствующие классы для автоматической записи их последних позиций и т. д. в ваш файл по умолчанию. Для настройки файла настроек по умолчанию ...

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

Чтобы это работало, вам нужно создать файл plist с именем Defaults или как вам угодно. Затем с помощью вызовов методов, расположенных в ссылке на класс, вы можете легко записать в нее строки, целые числа и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...