在Sprite Kit中暂停游戏:为什么这不起作用?

时间:2014-05-30 10:29:59

标签: ios objective-c sprite-kit

所以我在游戏中添加了一个暂停按钮,冻结和解冻视图。但是我想让它显示一条消息,说明" PAUSE"如果视图当前已冻结,则在屏幕上显示。但如果我触摸暂停按钮,它就不会显示标签。这真的很奇怪,因为我发现如果我将我的设备转为横向模式,那么" PAUSE"消息出现。 (反之亦然,所以如果我在横向模式下触摸按钮并将我的设备变为肖像,则会出现暂停标签) 有人能想出来吗?

BTW:我也试过不同的方法来做这件事,比如在场景开始时立即初始化暂停标签,并在需要时隐藏/显示它。这也没有用。 我也尝试在更新方法中使用if语句(如果场景暂停=>显示暂停标签),这也没有用。

我之前在这里问过这个问题和苹果devforums但是没有人可以解决这个问题。有人认为我会在viewwilllayoutsubviews中呈现场景,这可以解释肖像景观行为,但我从未在我的整个应用程序代码中使用该方法。

 -(void)gameScene{


 //Pause
    pauseButton = [SKSpriteNode spriteNodeWithImageNamed:@"pause.jpg"];
    pauseButton.position = CGPointMake(screenWidth/2, screenHeight-80);
    pauseButton.zPosition = 5;
    pauseButton.name = @"pauseButton";
    pauseButton.size = CGSizeMake(80, 80);

    [self addChild:pauseButton];

    //Pause Label (wenn Pause gedrückt wird)
    pauseLabel = [SKLabelNode labelNodeWithFontNamed:@"Arial"];
    pauseLabel.text = @"PAUSE";
    pauseLabel.fontSize = 70;
    pauseLabel.position = CGPointMake(screenWidth/2, screenHeight/2);
    pauseLabel.zPosition = 5;
    pauseCount = 1;
}




-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

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

    SKNode *node = [self nodeAtPoint:location];


    if ([node.name isEqualToString:@"pauseButton"]) {            

        pauseCount++;


        if (pauseCount%2 == 0) {
            self.scene.view.paused = YES;
            [self addChild:pauseLabel];

        }

        else{
            self.scene.view.paused = NO;
            [pauseLabel runAction:remove];
        }


    }

}

1 个答案:

答案 0 :(得分:2)

我有一个类似的暂停问题,发现问题与这样一个事实有关:尽管pauseLabel被添加到节点树中,但场景在显示之前暂停了。我使用的解决方案是使用SKAction来运行标签添加和按顺序暂停。

SKAction *pauseLabelAction = [SKAction runBlock:^{
   [[self scene] addChild:pauseLabel];
}];

SKAction *delayAction = [SKAction waitForDuration:0.1]; // Might not be needed.

SKAction *pauseSceneAction = [SKAction runBlock:^{
   [[[self scene] view] setPause:YES];
}];

SKAction *sequence = [SKAction sequence:@[pauseLabelAction, delayAction, pauseSceneAction]];
[self runAction:sequence];

我没有对此进行测试,但可能还需要稍微延迟,以便在暂停触发之前显示标签时间。