【问题标题】:save highscore for each level of game in ios在ios中为每个级别的游戏保存高分
【发布时间】:2015-04-17 10:59:47
【问题描述】:

我是 iOS 开发的新手,正在开发一款数学游戏,其中我有 3 个级别,简单、普通和困难。我想以编程方式为每个级别保存高分,但不知道如何?

[[NSUserDefaults standardUserDefaults]integerForKey:@"highScore"]<[SingletonClass sharedSingleton].Score){

[[NSUserDefaults standardUserDefaults] setInteger:[SingletonClass sharedSingleton].Score forKey:@"highScore"];

[[NSUserDefaults standardUserDefaults]synchronize];

我正在使用此代码来保存高分。但是这段代码为每个级别保存了相同的高分。

【问题讨论】:

  • 为什么不使用 Game Center 来管理分数和成就,它易于使用,无需使用 NSUserDefault 处理。

标签: ios math multi-level


【解决方案1】:

您可以使用三个单独的密钥来存储 highScore - MGHighScoreEasyMGHighScoreNormalMGHighScoreHard

if(gameMode == MGGameModeEasy) {

  [[NSUserDefaults standardUserDefaults] setInteger:[SingletonClass sharedSingleton].Score forKey:@"MGHighScoreEasy"];
  [[NSUserDefaults standardUserDefaults] synchronize];
} else if (....) {

}

【讨论】:

    【解决方案2】:

    这是一个关于如何构建代码/数据的问题,而不是如何保存它。鉴于高分是我想要的玩家的一个属性和一个可以存储所有高分的用户类(猜测是单例)的 NSDictionary 属性。

    例如:

    NSArray *keys = [NSArray arrayWithObjects:@"easy", @"medium", @"hard", nil];
    NSArray *objects = [NSArray arrayWithObjects:@"value1", @"value2", @"value3", nil]; 
    NSDictionary *dictionary = [NSDictionary dictionaryWithObjects:objects 
                                                       forKeys:keys];
    

    现在您可以将此 NSDictionary 存储在 NSUserDefaults 中,当您检索它时,您将获得所有分数。

    例如:

    [[NSUserDefaults standardUserDefaults] setObject:dictionary forKey:@"highScores"];
    [[NSUserDefaults standardUserDefaults] synchronize];
    

    【讨论】:

    • 谢谢,我没有想到使用字典和数组。再次感谢
    • @Mikael- 我认为它会帮助我。
    • @MSwapnil 这是我认为最有效的方式 :)
    【解决方案3】:

    使用 NSUserDefaults 来保存分数会让你的游戏很容易被破解。

    您可以使用 NSKeyedArchiver 将数据保存到文件中

    -(void)saveState {
    
    
        NSLog(@"Saving state");
    
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];
        NSString *statePath = [documentsDirectory stringByAppendingPathComponent:someFileName];
    
        NSMutableData *appData;
        NSKeyedArchiver *encoder;
        appData = [NSMutableData data];
        encoder = [[NSKeyedArchiver alloc] initForWritingWithMutableData:appData];
         // SaveData using [encoder encodeObject:(id)object forkey(NSString *)key]
        [encoder encodeObject:someUserObject forKey:@"someUserKey"];
        [encoder encodeInteger:someUserscore forKey:@"someUserScoreKey"];
    
    
        // Finish encoding and write the contents of gameData to file
        [encoder finishEncoding];
        [appData writeToFile:statePath atomically:YES];
    
    
    }
    

    然后您可以像这样使用文件加载数据

    -(void)loadState
    {
        NSLog(@"Loading state");
    
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString  *documentsDirectory = [paths objectAtIndex:0];
        NSString *statePath = [documentsDirectory stringByAppendingPathComponent:someFileName];
    
        NSData *appData;
        NSKeyedUnarchiver *decoder;
    
        appData = [NSData dataWithContentsOfFile:statePath];
        if (appData)
        {
            NSLog (@"file Loaded");
            decoder = [[NSKeyedUnarchiver alloc] initForReadingWithData:appData];
            // set data here using [decoder decodeObject for key...
            someUserObject = [decoder decodeIntegerForKey:@"someUserKey"];
            someUserScore = [decoder decodeObjectForKey:@"someUserScoreKey"];
    
        }
        else
        {
            NSLog(@"No saved data available or incorrect file name");
        }
    
    }
    

    您编码/解码的任何自定义类都需要确保它们符合 NSCoding。

    【讨论】:

      【解决方案4】:

      有两种存储游戏分数的方法,创建Database和存储记分卡数组到NSUserDefault

      将记分卡数组存储在NSUserDefault中。

      [[NSUserDefaults standardUserDefaults] setValue:arrayHighScore  forKey:@"highScore"];
      [[NSUserDefaults standardUserDefaults] setValue:arrayMiddiumScore  forKey:@"MediaumScore"];
      [[NSUserDefaults standardUserDefaults] setValue:arrayEasyScore  forKey:@"EasyScore"];
      [[NSUserDefaults standardUserDefaults]synchronize];
      

      【讨论】:

      • 一个arrayEasyScore 将被保存,因为您对所有人使用相同的密钥。
      • 其实我离开是为了换键。:)
      猜你喜欢
      • 2013-05-19
      • 1970-01-01
      • 2021-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多