SpriteKit 暂停和恢复 SKView

Posted

技术标签:

【中文标题】SpriteKit 暂停和恢复 SKView【英文标题】:SpriteKit Pause and Resume SKView 【发布时间】:2014-10-25 21:45:26 【问题描述】:

我想暂停和取消暂停 SpriteKit 中的场景,在同一位置有 2 个按钮。 在场景运行时,我想显示“暂停”按钮。 当场景暂停时,我想隐藏“暂停”按钮并显示“播放”按钮。 在 SpriteKit 中,您可以使用 SpriteKit 中定义的self.scene.view.paused

我的代码:

@implementation MyScene 

SKSpriteNode *PauseButton;
SKSpriteNode *PlayButton;



-(id)initWithSize:(CGSize)size 
if (self = [super initWithSize:size]) 

[self Pause];


return self;


-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
/* Called when a touch begins */

UITouch * touch = [touches anyObject];
CGPoint location = [touch locationInNode:self];

SKNode * Node = [self nodeAtPoint:location];

if([Node.name isEqualToString:@"PauseButton"])

    self.scene.view.paused = YES;

    [PauseButton removeFromParent];
    [self Resume];


if([Node.name isEqualToString:@"PlayButton"])

    self.scene.view.paused = NO;

    [PlayButton removeFromParent];
    [self Pause];



-(void)Pause

PauseButton = [SKSpriteNode spriteNodeWithImageNamed:@"Pause.png"];
PauseButton.position = CGPointMake(self.frame.size.width / 2, self.frame.size.height / 1.04);
PauseButton.zPosition = 3;
PauseButton.size = CGSizeMake(40, 40);
PauseButton.name = @"PauseButton";

[self addChild:PauseButton];



-(void)Resume

PlayButton = [SKSpriteNode spriteNodeWithImageNamed:@"Play.png"];
PlayButton.position = CGPointMake(self.frame.size.width / 2, self.frame.size.height / 1.04);
PlayButton.zPosition = 3;
PlayButton.size = CGSizeMake(60, 60);
PlayButton.name = @"PlayButton";
[self addChild:PlayButton];


它暂停了场景,但仍然有暂停按钮,如果我再次触摸暂停按钮,场景会恢复。所以现在只有图像不会改变。我该如何解决这个问题?

【问题讨论】:

您需要手动将按钮更新为暂停场景的播放类型,反之亦然。 我应该如何以最好的方式做到这一点?我认为使用 BOOL 会收到通知。 问题是init方法只调用了一次!在初始化!您需要将处理布尔更新的代码移动到每次暂停/播放发生时调用的方法。你明白吗? 明白了,我现在不止一次调用它。暂停和恢复效果很好,但图像不会改变。 【参考方案1】:

当 SKView 暂停时,您无法更新按钮(或场景中的任何其他内容)。在您的touchesBegan 方法中,您在更新按钮之前暂停了视图(更改顺序将不起作用)。您将需要返回到运行循环,以便在暂停游戏之前更新您的按钮。这是一种方法:

这会调用一个方法在短暂的延迟后暂停视图。在touchesBegan 中的[self Resume] 语句之后添加此内容,并删除self.scene.view.paused = YES

    [self performSelector:@selector(pauseGame) withObject:nil afterDelay:1/60.0];

此方法暂停 SKView。将此添加到您的 MyScene.m

- (void) pauseGame

    self.scene.view.paused = YES;

【讨论】:

以上是关于SpriteKit 暂停和恢复 SKView的主要内容,如果未能解决你的问题,请参考以下文章

SpriteKit - 如何正确暂停和恢复应用程序

Spritekit 通过 touchesBegan 暂停和恢复 SKSpriteNode 的动作

“点击恢复”暂停文本 SpriteKit

在 spritekit 中暂停游戏时显示菜单

游戏从后台快速恢复后退出暂停状态

应用程序激活后保持游戏暂停?