Objective c 精灵套件:如何在不同场景之间传递分数?

Objective c 精灵套件:如何在不同场景之间传递分数?,objective-c,sprite-kit,Objective C,Sprite Kit,我被困在两个场景之间,MyScene和MyMenu。 分数变化的游戏部分被声明为_score(NSInteger),其标签是_scoreLabelNode(SKLabelNode)。我用来初始化标签的代码,并在MyScene中创建保存分数的标签是 _score = 0; _scoreLabelNode = SKLabelNode labelNodeWithFontNamed:@"MarkerFelt-Wide; _scoreLabelNode.position =CGPointMake (CGR

我被困在两个场景之间,MyScene和MyMenu。 分数变化的游戏部分被声明为_score(NSInteger),其标签是_scoreLabelNode(SKLabelNode)。我用来初始化标签的代码,并在MyScene中创建保存分数的标签是

_score = 0;
_scoreLabelNode = SKLabelNode labelNodeWithFontNamed:@"MarkerFelt-Wide;
_scoreLabelNode.position =CGPointMake (CGRectGetMidX(self.frame), 3 *self.frame.size.height /4);
_scoreLabelNode.zPosition = 100;
_scoreLabelNode.text = [NSString stringWithFormat:@"%d",_score];
_scoreLabelNode.fontColor =[UIColor blackColor];
[self addChild:_scoreLabelNode]
所以我想我的问题是,当分数需要在MyScene中更改,并且需要在MyMenu中显示用户获得的分数时,如何在两个场景之间传递分数。提前谢谢


PS:我只是在学习代码,所以希望您能给出详细的回答

在MyScene中使用类似的NSUserDefaults:

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[prefs setInteger:_score forKey:@"score"];
在我的菜单中:

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
int score = [prefs integerForKey:@"score"];
SKLabelNode *scoreLabel = [SKLabelNode labelNodeWithFontNamed:@"MarkerFelt-Wide"];
//Other label node configuration here
scoreLabel.text = [NSString stringWithFormat:@"%d",score]
//Other configuration here

“这可能不太对,”我从头顶上写道。Xcode将帮助您修复任何警告/错误。

您还可以使用MyMenu场景的
userData
属性

 - (void) goToMenuScene
 {
      SKView *spriteView = (SKView *) self.view;
      SKScene *newScene = [[MyMenu alloc]initWithSize:self.size];

      NSMutableDictionary *dic = [[NSMutableDictionary alloc]init]
      [dic setInteger:_score forKey:@"score"];
      newScene.userData = dic;

      [spriteView presentScene:newScene];

 }
在要呈现场景的位置,请调用

[self goToMenuScene];
在我的菜单场景中

int score = [[self.userData objectForKey:@"score"]intValue];

启动时,我会在应用程序代理中设置我的分数,例如

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
     //SETUP SCORE
     [[NSUserDefaults standardUserDefaults] synchronize];
     NSInteger *score = [[NSUserDefaults standardUserDefaults] integerForKey:@"hasAnsweredQuestion"];
     if (!score) {
          //SET SCORE AS nathreed SUGGESTS
     }
但同样,您也可以在menuViewController中检查每次是否有分数


祝你好运

我喜欢阿卡什的答案,但这里有一种更简单的替代方法

您可以声明一个score属性MyMenu.h文件

@property (nonatomic, assign) int score;
然后,在MyScene.m文件中

- (void) goToMyMenuScene
{
    SKScene *myMenuScene = [[MyMenu alloc]initWithSize:self.size];
    myMenuScene.score = _score;
    [self.view presentScene:myMenuScene];
}

我把每个代码放在哪里?在接口还是在实现中?我把它们都放在每个文件的.m的实现部分。这导致了和以前一样的事情。不管我得到什么,分数都是0。我是不是应该删除每个文件中的_scoreLabelNode代码?考虑到您编写的SKLabelNode是scoreLabel,我是否应该删除U,以及scoreLabelNode中的节点?我必须在接口中声明任何东西吗?我同意@nathreed。在应用程序启动时(应用程序内委托didFinishLaunching方法),如果userDefaults值返回nil,您可能希望将分数设置为0。然后,当菜单出现时,您可以通过获取用户默认值来更新分数。您必须在中添加用户默认值MyScene@JoelBalmer你有没有办法和我分享这些代码?感谢技术上这种方法会起作用,但我认为这不是NSUserDefaults的预期用途。我在MyScene中得到了“使用未声明的标识符‘goToMenuScene’”,而在MyMenuh中“没有可见的‘NSMutableDictionary’接口声明选择器‘IntegerWorkey’”。您如何调用该方法?你需要写[self-goToMenuScene];哪一个?虚无或虚无,本质上,这就是你必须做的。试试看,自己看看。实验。这就是你学习的方式。好的,我已经将-(void)goToMenuScene代码粘贴到MyScene中。m此外,我还粘贴了self goToMenueScene代码。在MyMenum中,我粘贴了int分数线。我得到的错误是使用了未声明的标识符goToMenuScene(来自MyScene)和未使用变量'score'@akashg的通知