【问题标题】:How do I know which scene has called a particular scene?我如何知道哪个场景调用了特定场景?
【发布时间】:2015-03-07 18:15:03
【问题描述】:

我有一个显示分数的场景。有多个级别,每个级别都有不同的场景。
我试了这个就知道哪个场景叫乐谱场景了:

为每个场景创建一个 BOOL,并在各自的 didMoveToView 中将它们设置为 YES。

将该 BOOL 值从该场景传输到使用 NSUserDefaults 调用的场景。

使用 if 语句检查哪个是 YES。

但这似乎没有按预期工作。
我有一个 if 语句,它检查不同的 BOOL 值中的哪一个是 YES(因为只有调用该场景的那个应该是,对吧?因为没有调用其他场景,因此它们各自 BOOL 的值是设置为否?)并运行该特定代码以显示分数和高分,如下所示:

if (calledByMED == YES) {
    highScoreLabel.text = [NSString stringWithFormat:@"Best %ld", (long) highScoreMED];

    //[self highScoreLabel];

    NSInteger scoreMED = [prefs integerForKey:@"scoreMED"];

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



}

else if (calledByE == YES) {
        highScoreLabel.text = [NSString stringWithFormat:@"Best %ld", (long) highScoreE];

        //[self highScoreLabel];

        NSInteger easyScore =  [prefs integerForKey:@"scoreE"];

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



    }

但是,它并没有按照应有的方式进行。假设如果我从“E”场景调用乐谱场景,代码应该跳过 calledByMED 对吗?
但是,它没有。它执行 calledByMED 中的代码所说的并跳过 calledByE,即使我已经由 E 调用它。

我在这里错过了什么?

【问题讨论】:

  • 如果你有多个场景你应该知道什么场景需要高分?你的高分方法本身就是一个类吗?还有,为什么一开始就有这么多场景?
  • 我不太明白你的意思。每个级别都有一个场景。
  • 你必须知道什么场景要求高分的唯一原因是高分方法是否在一个类中。是这样吗?
  • 不,事实并非如此。那我该怎么做我想做的事
  • 如果高分方法在每个场景中,那么只需调用您想要的方法部分。如果你知道什么场景调用了方法,为什么还要有一个 IF 语句?

标签: ios objective-c sprite-kit


【解决方案1】:

一系列 BOOL 是表示单个属性的笨拙方式,该属性一次只能是一件事。更好的表示是单个枚举或字符串,它保存表示呈现场景的内容。 SKNode 有一个 userData 字典。您可以在其中使用一个键:

// when presenting a scene:
scene.userData =  [@{ @"fromScene" : @"levelTwo" } mutableCopy];

在乐谱场景中:

if ([scene.userData[@"fromScene"] isEqualToString:@"levelTwo"]) {}

枚举会更快更简洁,但您可能希望使用自定义属性,而不是尝试将枚举(基本上是一个 int)包装到字典中。

【讨论】:

  • 谢谢!像魅力一样工作!
  • 很高兴听到。我认为原始问题的根本原因是您在从一个级别导航时设置了一个布尔值,忘记重置它,然后在不同级别的导航上设置一个不同的布尔值。那时你会设置两个布尔值,然后就会出现混乱。
  • 是的,就是这样。多亏了你,现在已经修好了! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多