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