0

我有一个在 Xcode 中创建的视频游戏应用程序,SpriteKit 和一个“游戏”模板应用程序。我的游戏有一个分数标签,用于跟踪分数并在玩家得分时更新。下面是我为当前分数和高分这两个标签创建的代码。我的应用程序中有更多代码,但我只是想简化它并仅显示与这种情况相关的代码。当我关闭应用程序并重新打开应用程序时,分数会重置为零。但我想要的是即使你关闭应用程序也能保存高分?而且,如果当前分数高于高分,那么如果有意义的话,我希望将高分更新为新分数。

我愿意接受建议。

游戏场景.h

#import <SpriteKit/SpriteKit.h>

@interface GameScene : SKScene <SKPhysicsContactDelegate>
{
    NSTimer *timerOne;
    NSTimer *timerTwo;
    NSInteger HighScore;
    NSInteger score;
}
@end

游戏场景.m

-(void)didMoveToView:(SKView *)view {

   //SCORELABEL
    SKLabelNode *scoreLabel = [SKLabelNode labelNodeWithFontNamed:@"ChalkboardSE-Bold"];
    scoreLabel.position = CGPointMake(CGRectGetMidX(self.frame), self.frame.size.height-50);
    scoreLabel.fontSize = 30;
    scoreLabel.text = @"0";
    scoreLabel.fontColor = [SKColor blueColor];
    scoreLabel.name = @"scoreLabel";
    [self addChild:scoreLabel];
}



-(void) didBeginContact:(SKPhysicsContact *)contact {

   //When redblock comes in contact with redball
   if (contact.bodyA.categoryBitMask == CollisionCategoryRedBlock &&
        contact.bodyB.categoryBitMask == CollisionCategoryRedBall) {

        //Update the score label and add 1 to the current score
        [self addPoint:1];
    }

   //if anything else happens it's gameover
   else {
       [self performGameOver];
   }

}

//Method to add a point to the scorelabel
-(void) addPoint:(NSInteger)points {


    score += points;

    SKLabelNode *scoreLabel = (SKLabelNode*)[self       childNodeWithName:@"scoreLabel"];

    scoreLabel.text =[NSString stringWithFormat:@"%ld", (long)score];

}

//Gameover method which will show the high score label
-(void) performGameOver {

    //HIGHSCORELABEL
    SKLabelNode *highScoreLabel = [SKLabelNode labelNodeWithFontNamed:@"ChalkboardSE-Bold"];
    highScoreLabel.position = CGPointMake(CGRectGetMidX(self.frame), 100);
    highScoreLabel.fontSize = 20;
    highScoreLabel.text = [NSString stringWithFormat:@"High Score: %ld", (long)score];
    highScoreLabel.fontColor = [SKColor blueColor];
    [self addChild:highScoreLabel];
}
4

2 回答 2

1

您可以使用 NSUserDefaults,或者如果您打算使用设备同步并存储更大量的数据,则使用 NSCoding。

最简单快捷的是 NSUserDefaults。NSCoding 稍微难一些,但有一些是通过网络引导的。就目前而言,NSUSer Defaults 会是这样的:

在实现时创建一个 NSUserDefaults:

@implementation FKMyScene{
    NSUserDefaults *prefs;
    /* Any other you use below*/
  }

然后,在 init 启动它是这样的:

prefs = [[NSUserDefaults alloc] init];
    if(!prefs)
        [prefs setInteger:0 forKey:@"YourAppHighScore"];

现在它应该可以工作并将存储所需键的值。(我们将Integer设置为0,所以初始值为0。接下来,假设您要存储高分,您将使用一个字符串来命名该值(如“YourAppHighScore”)并用这个名称召唤Integer。

/*This should fetch the value whenever you need*/    
[prefs integerForKey:@"YourAppHighScore"];

/*This should update the value whenever you need*/
/*Note that I use setInteger to insert the new value. This can be used anywhere.*/
if(currentScore > [prefs integerForKey:@"YourAppHighScore"])
        [prefs setInteger:currentScore forKey:@"YourAppHighScore"];

如果您打算保存其他任何内容,您可以使用相同的方法执行此操作,但请验证您是否需要 integerForKey、objectForKey 等。

于 2015-03-06T18:21:03.883 回答
1

假设我们有一个高分数组,即:多个用户

Userdefaults、Core Data 和 Plists 都可以读/写,但是如果你使用 plist,你需要注意你把它放在什么目录下。请参阅下面的 plist 部分。

NSUserDefaults
这些是你可以说的全局变量,在它们被销毁之前不会删除它们的状态。但可以同步

要将它们写入用户默认值:

NSArray *stringsArray = [[NSArray alloc] arrayWithObjects: string1, string2, string3, nil];
[[NSUserDefaults standardUserDefaults] setObject:stringsArray forKey:@"MyStrings"];
[[NSUserDefaults standardUserDefaults] synchronize]

从 userdefaults 读取:

NSArray *stringsArray = [[NSUserDefaults standardUserDefaults] objectForKey:@"MyStrings"];

列表

如果要修改您的字符串,您将需要写入和读取 plist,但您不能写入应用程序的资源。

  1. 要有一个读/写 plist 首先找到文档目录

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *stringsPlistPath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"Strings.plist"];
    
  2. 创建数组(我假设字符串是 string1,...)

    NSArray *stringsArray = [[NSArray alloc] arrayWithObjects: string1, string2, string3, nil];
    
  3. 将其写入文件

    [stringsArray writeToFile:stringsPlistPath atomically:YES];
    

要阅读 plist:

  1. 找到文档目录

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *stringsPlistPath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"Strings.plist"];
    
  2. 读入:

    NSArray *stringsArray = [NSArray arrayWithContentsOfFile:stringsPlistPath];
    
于 2015-03-06T18:21:14.270 回答