添加标签后无法取消暂停SKScene

时间:2014-11-25 00:44:26

标签: ios sprite-kit skscene

我可以使用暂停按钮(SKSpriteNode)和一个简单的方法暂停和取消暂停SKScene。

-(void) pauseGame {

    SKView *view = (SKView *) self.view;

    if(!view.paused){
        view.paused = YES;

    }else{
        view.paused = NO;
        [pauseLabel removeFromParent];
    }    
}

并在touchesBegan方法

中调用它
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

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

    // If game is paused allow the button to be touched
    if (isGamePaused == NO) {


        //if pause button touched, pause the game
        if (node == pauseButton) {

            [self pauseGame];

        }
    }
}

这种方式很好。我可以按下按钮暂停游戏并再次按下以取消暂停游戏。但是,我想让用户知道游戏暂停,然后屏幕被冻结,所以我尝试了这个:

我创建了这个SKLabel。

-(void) addPauseLabel {

    // Creating label
    pauseLabel = [SKLabelNode labelNodeWithFontNamed:universalFont];
    pauseLabel.text = @"Game is Paused";
    pauseLabel.fontSize = 42;
    pauseLabel.position = CGPointMake(self.frame.size.width/2, self.frame.size.height/2 + 60);
    pauseLabel.zPosition = 6;

    [self addChild:pauseLabel];
}

然后我创建了一个序列,我在其中添加标签然后暂停游戏

-(void) pauseSequence{

    SKAction *pauseSequence = [SKAction sequence:@[
                                                   [SKAction performSelector:@selector(addPauseLabel) onTarget:self],
                                                   [SKAction performSelector:@selector(pauseGame) onTarget:self],
                                                   ]];
    [self runAction:pauseSequence];

}

最后,在touchesBegan方法中,我调用[self pauseSquence];最后而不是[self pauseGame];

当我按下暂停按钮时,标签被添加并且游戏被暂停,但是再次按下按钮以取消游戏并没有做任何事情。这是为什么?任何帮助将不胜感激。谢谢。

3 个答案:

答案 0 :(得分:0)

您的取消暂停按钮无法正常工作的最可能原因是暂停后,无法检测到任何触摸。你基本上把自己锁定在场景之外,这意味着场景无法完成任务。

暂停SpriteKit游戏的普遍接受的方法是不暂停场景,而是创建多个节点。一个节点将包含您的游戏玩法("游戏图层"),另一个节点将包含暂停元素("暂停图层")。当您的场景检测到按下暂停按钮时,将游戏层中的所有内容设置为暂停,然后调出暂停层。按下恢复按钮时,隐藏暂停图层并取消暂停游戏图层。

答案 1 :(得分:0)

你应该知道这个序列在这里没有用处。最好只打电话:

[self addPauseLabel];
[self pauseGame];

由于这是主要的变化,奇数和不必要地使用序列可能导致这种行为。

答案 2 :(得分:0)

视图暂停时您无法执行操作,因此如果视图未暂停,则应致电[self pauseSequence];如果视图暂停,则应[self pauseGame]

touchesBegan方法

if (!self.view.paused) {
    // Add label and pause
    [self pauseSequence];
}
else {
    // Resume game
    [self pauseGame];
}