我如何知道哪个场景调用了特定场景?
How do I know which scene has called a particular scene?
我有一个显示分数的场景。有多个级别,每个级别都有不同的场景。
我试过这个是为了知道哪个场景称为得分场景:
为每个场景创建一个 BOOL,并在各自的 didMoveToView 中将它们设置为 YES。
使用 NSUserDefaults 将该 BOOL 值从那个场景传输到被调用的场景。
使用 if 语句检查哪一个是“是”。
但这似乎没有按预期工作。
我有一个 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 调用它。
我在这里错过了什么?
一系列 BOOL 是表示一次只能表示一个事物的单个 属性 的笨拙方式。更好的表示是单个枚举或一个字符串,用于保存表示当前场景的内容。 SKNode 有一个 userData 字典。您可以在其中使用一个键:
// when presenting a scene:
scene.userData = [@{ @"fromScene" : @"levelTwo" } mutableCopy];
在得分场景中:
if ([scene.userData[@"fromScene"] isEqualToString:@"levelTwo"]) {}
枚举会更快更简洁,但您可能希望使用自定义属性,而不是尝试将枚举(基本上是一个 int)包装到字典中。
我有一个显示分数的场景。有多个级别,每个级别都有不同的场景。
我试过这个是为了知道哪个场景称为得分场景:
为每个场景创建一个 BOOL,并在各自的 didMoveToView 中将它们设置为 YES。
使用 NSUserDefaults 将该 BOOL 值从那个场景传输到被调用的场景。
使用 if 语句检查哪一个是“是”。
但这似乎没有按预期工作。
我有一个 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 调用它。
我在这里错过了什么?
一系列 BOOL 是表示一次只能表示一个事物的单个 属性 的笨拙方式。更好的表示是单个枚举或一个字符串,用于保存表示当前场景的内容。 SKNode 有一个 userData 字典。您可以在其中使用一个键:
// when presenting a scene:
scene.userData = [@{ @"fromScene" : @"levelTwo" } mutableCopy];
在得分场景中:
if ([scene.userData[@"fromScene"] isEqualToString:@"levelTwo"]) {}
枚举会更快更简洁,但您可能希望使用自定义属性,而不是尝试将枚举(基本上是一个 int)包装到字典中。