gameOver声音不停播放

时间:2014-12-25 15:39:07

标签: ios objective-c methods sprite-kit

当图像离开屏幕时(游戏应该结束),gameOver声音会不停地播放。这表明即使游戏结束并且显示菜单,gameOver方法仍继续被更新方法调用。我希望你明白发生了什么。我该怎么做才能阻止这个?

编辑:添加&& !gameEnds后(请参阅下面的更新方法),gameOver方法被调用两次,我想知道为什么在所有数字中,它被调用两次。

-(void)gameOver
{
    self.gameEnds = YES;

    // Play the gameOver sound
    [self runAction:[SKAction playSoundFileNamed:@"gameOver.caf" waitForCompletion:NO]];

    [mainLayer enumerateChildNodesWithName:@"Board" usingBlock:^(SKNode *node, BOOL *stop) {
        [node runAction:[SKAction fadeOutWithDuration:1.0f]];
    }];

    [mainLayer enumerateChildNodesWithName:@"Time" usingBlock:^(SKNode *node, BOOL *stop) {
        [node runAction:[SKAction fadeOutWithDuration:1.0f]];
    }];

    // showing the menu
    [menu show];
}

此方法计算点击次数(当用户点击屏幕时自我计数器增量)

-(void)callNextImage: (UITapGestureRecognizer *)recognizer
{
    self.counter++;
}

当图像离开屏幕并且点击次数小于4时,应调用gameOver方法,此方法似乎与此相关

-(void)update:(CFTimeInterval)currentTime {
    /* Called before each frame is rendered */

    if (self.counter < 4
        && (image.position.y > self.frame.size.height + 75.5f) && !gameEnds) {
        [self gameOver];
    }
}

2 个答案:

答案 0 :(得分:0)

一种显而易见的方法是暂停场景。因此,gameOver将包括以下行:

self.paused = true

这将阻止再次调用update:。如果你没有更多的动画可以执行,你只能这样做,但是因为游戏已经结束,实际上可能就是这种情况。

如果这种方法是不可接受的,那么你需要修改你在update:中测试的条件,看看你是否应该以这样的方式调用gameOver,如果它在一次传递中是真的那么在下一个传递以及下一个和下一个和下一个传递中也不是真的...例如,您可以在gameOver中引发一个Bool标志(属性)并在条件下对其进行测试。

答案 1 :(得分:0)

似乎这种方法被连续调用,并且一旦游戏回到菜单后仍然被调用,但我敢打赌,情况并非如此。您播放声音的方法是异步调用的,并且您只需通过在渲染每个帧之前进入游戏方法来创建有限但非常大量的方法调用,并且有多个帧符合您的“在你真正退出游戏之前的标准游戏。如果你在比赛结束后在菜单上等了足够长的时间,最终所有排队的声音都会播放,它就会停止。

你只需要一种方法来确保播放声音的方法只被调用一次。这可以像使用布尔属性gameIsOver一样简单。如果不是YES,则将其设置为yes,然后调用播放声音的方法。否则,返回。