Проблемы applicationWillTerminate / ApplicationDidEnterBackground - PullRequest
0 голосов
/ 13 июля 2011

Мне нужна ваша помощь, чтобы решить эту проблему.

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

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

* 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;

}

1 Ответ

0 голосов
/ 13 июля 2011

есть nstimer, который заставляет его готовиться, устанавливать, идти, тогда, если go не скрыт, тогда у вас есть не приостановленная игра. Состояние

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