SpriteKit正确处理声音

时间:2014-04-24 20:27:30

标签: ios sprite-kit audio

我有一个SpriteKit游戏,我有许多不同的精灵激光,飞机等等。这些精灵中的许多都有一个声音,只要它们可见就会播放。现在我在SKSpriteNode本身播放声音。这可能不是我想要的,因为如果我有50个相同的精灵,他们都将播放相同的声音并抽出资源。但是,我不确定哪里是播放声音的最佳位置,因为对于其中一些精灵,我需要检查它是否应该播放。我想我可以将声音放在GameScene中并在每次更新期间循环遍历所有精灵,以确定应该和不应该播放的声音,这样每个声音只会有一个实例。我希望将所有精灵代码保存在精灵本身中,但这可以解决同一声音播放的多个实例的问题。这是处理声音的正确方法吗?

3 个答案:

答案 0 :(得分:2)

如果没有看到您的代码,很难给您一个正确的代码示例。但是,你可以得到你可以尝试的东西的主旨。

在MyScene中添加一个属性BOOL propSound

每当你创建一个新的飞机并想知道添加道具声音时,请执行以下操作:

if(propSound == false)
{
    propSound = true;
    // add your code to play prop sound
}

如果将每个新创建的平面精灵添加到NSMutableArray中,如此[yourArrayName addObject:newPlane];,则每次移除平面时都可以检查数组计数,以便知道最后一个平面是否已被移除且声音是否需要停止。

if([yourArrayName count] == 0)
{
    propSound = false;
    // add your code to stop prop sound
}

答案 1 :(得分:0)

也许你正在寻找这样的东西?

NSMutableArray *coin = [[NSMutableArray alloc] initWithCapacity:1];
SKAction *_coinSound = [SKAction playSoundFileNamed:@"Pickup_Coin4.wav"   waitForCompletion:NO];
    [coin addObject:_coinSound];
    SKAction *_playCoinSound = [SKAction sequence:coin];

然后我只检查我的情况中的“角色”是否触及了硬币。如果是这样,它将播放声音。

if([_adventurer intersectsNode:coin]){
            [coin runAction:_playCoinSound];
}

编辑:

看到你对你的问题的评论。我想你可以检查屏幕上是否至少有一个平面,如果有,那么你可以播放一个声音循环。如果声音少于1则。

如果已经播放,请不要再播放相同的声音。您可以使用BOOL查看声音是否已播放。

BOOL isPlaneSoundOn = false;

if(!isPlaneSoundOn && _planeNode.count > 0){
 //play the sound
 isPlaneSoundOn = true;
} else if(_plane.count == 0) {
 //stop the sound
 isPlaneSoundOn = false;
}

这样的事情。也许你明白了这个想法:)

答案 2 :(得分:0)

我会亲自使用SKAction playSoundWithFilename播放任何社区声音,并将此声音指定为关键。

然后我会检查密钥是否存在,如果不存在,则播放声音