Мне нужна ваша помощь, чтобы решить эту проблему.
Я нашел учебное пособие по сохранению / загрузке состояния игры Учебник по сохранению игрового состояния и думаю, что сам справился довольно хорошо, но застрял.
Прежде всего это то, что мне нужно сэкономить при перемещении игры на задний план и при выходе из игры.
* Playerscore
* Highscore
* Уровень
* Время
* сетка и кирпичи на ней (сетка 6x6, и у меня есть 35 кирпичей, которые можно перемещать внутри сетки) // не знаю, как сохранить / загрузить эту часть
* количество рубинов
* состояние настроек, если кнопка музыки, а также кнопка SFX включена или выключена // не знаю, как сохранить / загрузить эту часть
* состояние музыки, в начале песни или в середине и т. Д., Когда игра остановлена // не знаю, как сохранить / загрузить эту часть
Я не знаю, как загрузить игру в состояние паузы с изображениями Ready, Set, Go, которые должны появиться перед началом с того места, где остановился пользователь. (не знаю, как подключить их к applicationDidEnterBackground и applicationWillTerminate в моем UIApplicationDelegate, то же самое с частью сохранения)
Затем я хочу, чтобы главное меню было известно, есть ли сохраненное игровое состояние, и позволяю пользователю выбирать между новой игрой и продолжать.
код ниже показывает, как я это сделал в файле mainmenu.m и в моем файле gameview.m. Дайте мне знать, если вы хотите увидеть и игровой контроллер ...
mainmenu.h
//Игровой контроллер
GameController * sharedGameController;
mainmenu.m
//The game begins either by continue or by resetting the gamestate
-(IBAction)start{
NSLog(@"Start");
newgame.hidden = NO;
if(sharedGameController.resumedGameAvailable == YES){
//IF there is a gamestate saved then activate the continue button
continuegame.hidden = YES;
continuegame.alpha = 1.0;
continuegame.enabled = YES;
}
else{
continuegame.hidden = NO;
continuegame.alpha = 0.5;
continuegame.enabled = NO;
}
korridor1.hidden = NO;
fackla.hidden = NO;
Start.hidden = YES;
option.hidden = YES;
howtoplay.hidden = YES;
SFXimage.hidden = YES;
Musicimage.hidden = YES;
back.hidden = NO;
}
//Continue previous game
-(IBAction)ContinueGame{
[audio stop];
audio.numberOfLoops = 0;
[audio release];
NSLog(@"Continue");
back.hidden = YES;
newgame.hidden = YES;
continuegame.hidden = YES;
korridor1.hidden = NO;
fackla.hidden = YES;
Start.hidden = YES;
option.hidden = YES;
howtoplay.hidden = YES;
SFXimage.hidden = YES;
Musicimage.hidden = YES;
[UIView beginAnimations:@"korridor_1.png" context:nil];
[UIView setAnimationDuration:1];
korridor1.transform = CGAffineTransformMakeScale(13,13);
korridor1.alpha = 1.0f;
[UIView commitAnimations];
//The Game begins
[NSTimer scheduledTimerWithTimeInterval:1.5 target:self selector:@selector(GameView) userInfo:nil repeats:NO];
}
gameview.m
//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(@"INGO - GameScene: Loading saved amount of rubies.");
totalrubies = [[decoder decodeObjectForKey:@"totalrubies"] 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];
// Archive the players score
NSNumber *savedPlayerScore = [NSNumber numberWithFloat:playerscore];
// Archive the games high score
NSNumber *savedHighScore = [NSNumber numberWithFloat:highscore];
// Archive the current game level
NSNumber *savedcurrentlevel = [NSNumber numberWithFloat:level];
// Archive the total amount of rubies
NSNumber *savedTotalRubies = [NSNumber numberWithFloat:totalrubies];
[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"];
[encoder encodeObject:savedTotalRubies forKey:@"totalrubies"];
// 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;
}