0

Xcode で作成したビデオ ゲーム アプリ、「ゲーム」テンプレート アプリケーションを使用した SpriteKit があります。私のゲームには、スコアを追跡するスコア ラベルがあり、プレーヤーがポイントを獲得すると更新されます。以下は、現在のスコアとハイスコアの 2 つのラベル用に作成したコードです。私のアプリにはもっと多くのコードがありますが、単純化して、この状況に関連するコードを表示したかっただけです。アプリを閉じてアプリを再度開くと、スコアがゼロにリセットされます。でも、アプリを閉じてもハイスコアの数字を保存したいのですが?また、現在のスコアがハイスコアよりも高い場合、それが理にかなっていれば、ハイスコアを新しいスコアに更新したいと考えています。

私は提案を受け入れます。

GameScene.h

#import <SpriteKit/SpriteKit.h>

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

GameScene.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 のデフォルトは次のようになります。

実装時に NSUserDefaults を作成します。

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

次に、初期化時に次のように開始します。

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 :
これらは一種のグローバル変数であり、破棄されるまで状態を削除しません。しかし、同期することができます

それらを userdefaults に書き込むには:

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 に答える