即使应用程序关闭,也可以在我的应用程序中保存游戏关卡?

Posted

技术标签:

【中文标题】即使应用程序关闭,也可以在我的应用程序中保存游戏关卡?【英文标题】:Save game level in my app even when the app is closed? 【发布时间】:2012-08-23 02:54:42 【问题描述】:

我正在为 iPhone 制作一款 RPG 游戏,一切运行良好,但我需要知道如何保存我的游戏关卡,以便即使用户关闭在后台运行的应用程序,整个游戏也不会从头再来。我什至在考虑带回老式游戏并制作它,这样您就必须输入密码才能从上次中断的地方开始。但即便如此,我也不知道如何正确保存游戏。另外,即使我确实保存了游戏,即使应用程序完全关闭,我如何才能让它保持保存状态?到目前为止,我已尝试将保存数据代码添加到 AppWillTerminate 行,但仍然没有。任何帮助表示赞赏。

【问题讨论】:

这是一个非常开放的问题——我认为我们可以建议您将游戏数据写入应用程序文档目录(或 iCloud)中的“应用程序将终止”方法中的文件.您当然可以在应用恢复时读取这些文件。 我对游戏开发完全陌生,我什至不知道如何保存文档或合并 iCloud 抱歉。有任何教程链接可以至少了解这些基础知识吗? raywenderlich.com/tutorials 可能是个不错的起点。 【参考方案1】:

我不确定您是要保存用户所在的级别,还是要保存游戏状态。如果您只是想保存用户所在的级别,您应该使用@EricS 的方法(NSUserDefaults)。保存游戏状态稍微复杂一些。我会这样做:

//Writing game state to file
    //Some sample data
    int lives = player.kLives;
    int enemiesKilled = player.kEnemiesKilled;
    int ammo = player.currentAmmo;

    //Storing the sample data in an array
    NSArray *gameState = [[NSArray alloc] initWithObjects: [NSNumber numberWithInt:lives], [NSNumber numberWithInt:enemiesKilled], [NSNumber numberWithInt:ammo], nil]; 

    //Writing the array to a .plist file located at "path"
    if([gameState writeToFile:path atomically:YES]) 
        NSLog(@"Success!");
    

//Reading from file
    //Reads the array stored in a .plist located at "path"
    NSArray *lastGameState = [NSArray arrayWithContentsOfFile:path];

.plist 看起来像这样:

使用数组意味着在重新加载游戏状态时,您必须知道存储项目的顺序,这还不错,但如果您想要更可靠的方法,您可以尝试使用NSDictionary 是这样的:

//Writing game state to file
    //Some sample data
    int lives = player.kLives;
    int enemiesKilled = player.kEnemiesKilled;
    int ammo = player.currentAmmo;
    int points = player.currentPoints;

    //Store the sample data objects in an array
    NSArray *gameStateObjects = [NSArray arrayWithObjects:[NSNumber numberWithInt:lives], [NSNumber numberWithInt:enemiesKilled], [NSNumber numberWithInt:points], [NSNumber numberWithInt:ammo], nil];

    //Store their keys in a separate array      
    NSArray *gameStateKeys = [NSArray arrayWithObjects:@"lives", @"enemiesKilled", @"points", @"ammo", nil];

    //Storing the objects and keys in a dictionary
    NSDictionary *gameStateDict = [NSDictionary dictionaryWithObjects:gameStateObjects forKeys:gameStateKeys];

    //Write to file
    [gameStateDict writeToFile:path atomically: YES];

//Reading from file
    //Reads the array stored in a .plist located at "path"
    NSDictionary *lastGameState = [NSDictionary dictionaryWithContentsOfFile:path];

字典 .plist 看起来像这样:

【讨论】:

【参考方案2】:

保存关卡:

[[NSUserDefaults standardUserDefaults] setInteger:5 forKey:@"level"];

阅读关卡:

NSInteger level = [[NSUserDefaults standardUserDefaults] integerForKey:@"level"];

每当用户进入该级别时,我都会设置它。您可以等到您被发送到后台,但等待真的没有意义。

【讨论】:

以上是关于即使应用程序关闭,也可以在我的应用程序中保存游戏关卡?的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的游戏中保存用户的等级?

如果存在验证错误,防止引导模式关闭

独立 python 应用程序的数据存储

游戏循环完全冻结了我的程序

打开游戏GeForce Experience出现的提示怎么关

即使在 Core Data 上下文保存后数据也没有保留