SKScene 识别 GameScene 的高分
Posted
技术标签:
【中文标题】SKScene 识别 GameScene 的高分【英文标题】:The SKScene recognizes the high score of the GameScene 【发布时间】:2015-06-19 12:36:41 【问题描述】:我希望我的SKScene
(MedalScene
) 能够识别出GameScene
的高分,因为如果高分例如为“20”,那么它将显示为一枚奖牌。我该怎么做?
我在 GameScene 中获得高分的代码:
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
[ud setObject:[NSString stringWithFormat:@"%d",_score] forKey:SCORE_OVER];
int scoreString=[[ud objectForKey:BEST_SCORE] intValue];
if(scoreString < _score)
[ud setObject:[NSString stringWithFormat:@"%d",_score] forKey:BEST_SCORE];
scoreString = _score;
这是我的 MedalScene
奖牌的当前代码:
if(scoreString >= 20)
SKSpriteNode *medal1 = [SKSpriteNode spriteNodeWithImageNamed:@"medal_1"];
medal1.position = CGPointMake(CGRectGetMaxX( self.frame )*1/4 + 8, CGRectGetMidY(self.frame) + 21);
[self addChild:medal1];
My GameScene 显示 GameOver 的得分和最高分。这是代码:
-(void)showGameOver
NSUserDefaults *hud = [NSUserDefaults standardUserDefaults];
[hud setObject:[NSString stringWithFormat:@"%d",_score] forKey:SCORE_OVER];
int scoreString = [[hud objectForKey:BEST_SCORE] intValue];
if(scoreString < _score)
[hud setObject:[NSString stringWithFormat:@"%d",_score] forKey:BEST_SCORE];
scoreString = _score;
SKLabelNode *lbOver = [SKLabelNode labelNodeWithFontNamed:@"Walibi0615"];
lbOver.position = CGPointMake(CGRectGetMaxX(self.frame)*3/4, CGRectGetMidY(self.frame)+33);
lbOver.zPosition = 1;
lbOver.fontSize = 20;
lbOver.fontColor = [UIColor blackColor];
lbOver.text = [NSString stringWithFormat:@"%d", _score];
[_gameOver addChild:lbOver];
SKLabelNode *lbMaxOver = [SKLabelNode labelNodeWithFontNamed:@"Walibi0615"];
lbMaxOver.position = CGPointMake(CGRectGetMaxX(self.frame)*3/4, CGRectGetMidY(self.frame)-14);
lbMaxOver.zPosition = 1;
lbMaxOver.fontSize = 20;
lbMaxOver.fontColor = [UIColor blackColor];
lbMaxOver.text = [NSString stringWithFormat:@"%d", scoreString];
[_gameOver addChild:lbMaxOver];
我已经创建了第二个场景(MedalScene),这个场景应该可以识别 GameScene 的 scoreString,因为例如,如果最高分等于 20,那么它将在这个场景中出现一个奖牌。
这是目前的奖牌代码(MedalScene):
if(scoreString >= 20)
SKSpriteNode *medal1 = [SKSpriteNode spriteNodeWithImageNamed:@"medal_1"];
medal1.position = CGPointMake(CGRectGetMaxX( self.frame )*1/4 + 8, CGRectGetMidY(self.frame) + 21);
[self addChild:medal1];
我希望现在我的意思很清楚了。预先感谢您的帮助! :)
【问题讨论】:
【参考方案1】:您应该在设置后同步您的用户默认值。
[ud synchronize];
不过,我也会在你的 userdefaults 中使用真正的整数(i.s.o. 手动转换为字符串),所以类似于
NSInteger score = [ud integerForKey:BEST_SCORE];
if (_score > score)
[ud setInteger:_score forKey:BEST_SCORE];
[ud synchronize];
【讨论】:
感谢您的快速回复。如果我用你的代码替换 GameScene 代码,高分会在 GameScene 中消失。所以我只想要一个指向我的 MedalScene 的链接。 @StefanoVuottoCésar 如果您同步您的用户默认值并且它们仍然没有出现在其他场景中,则其他情况是错误的。老实说,很难掌握您的确切问题是什么,您的问题没有多大意义,而且您发布的代码很少。尝试更清楚地解释您的问题和/或发布更多代码。 @StefanoVuottoCésar 在阅读了您编辑的问题后,您似乎确实需要在更改用户默认值后添加一个同步调用,如果您想将它们与“20”进行比较,则应该使用整数(比较字符串到 20 作为整数没有意义)。 我修改了一点你的代码,现在它可以工作了!感谢您的帮助彼得!以上是关于SKScene 识别 GameScene 的高分的主要内容,如果未能解决你的问题,请参考以下文章
如何捕捉 SKScene 暂停或 audioEngine 停止的时刻?
SKScene - 如何从 SKSpriteNode 获取类
从 UIViewController 呈现 SKScene - Swift