gpt4 book ai didi

audio - SpriteKit-当敌人被杀死时如何停止声音

转载 作者:行者123 更新时间:2023-12-02 23:51:52 28 4
gpt4 key购买 nike

我正在用SpriteKit构建我的第一个项目,但我无法弄清楚这部分。

我的项目包括飞入屏幕的敌方直升机。每个敌人播放大约14秒长的声音文件。这不是循环。它包括敌人进入屏幕之前接近的声音,以及在屏幕上移动时发出的更多声音。问题是,当我杀死其中一架直升机时,即使将敌方直升机节点从场景中移开,声音仍会继续播放。

我尝试使用playSoundFileNamed操作,但我知道这些操作无法停止。

我尝试使用SoundManager,但由于所有敌人都具有相同的文件ID,所以如果我停止一个文件,它会停止所有文件,即使仍然在屏幕上的文件也是如此。

我阅读了我应该使用OpenAL的信息,但是找不到能说明如何在播放的每种声音中添加某种ID的信息,以了解停止哪种声音。

与AVAudioPlayer相同。我尝试为每个敌人创建一个播放器,但由于某种原因,runBlock SKAction只会忽略此代码,并且从不播放声音。奇怪的。我还读过AVAudioPlayer比播放声音FX更适合播放背景音乐。

是否有某种声音引擎可以帮助解决此问题?

最佳答案

我能够解决它,将所有音频播放器排列在一起。这是代码:

首先,您创建一个NSMutableArray来跟踪所有玩家(称为“playerArray”)。然后,每个SKSpriteNode在添加到场景中时都会得到自己的播放器:

NSError *error;
NSURL * backgroundSound = [[NSBundle mainBundle] URLForResource:@"coptersound" withExtension:@"mp3"];
AVAudioPlayer *copterPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:backgroundSound error:&error];
copterPlayer.numberOfLoops = 1;
copterPlayer.delegate = self;
[copterPlayer prepareToPlay];

SKAction *moveCopter = [SKAction moveToX:(-10 - enemy.size.width) duration:14];
SKAction *copterSound = [SKAction runBlock:^{

[playerArray addObject:copterPlayer];
[copterPlayer play];

[enemy.userData setValue:copterPlayer forKeyPath:@"player"];

}];

SKAction *moveGroup = [SKAction group:@[copterSound, moveCopter]];

然后,当检测到碰撞时,这就是我停止播放器的方式:
   [[enemy.userData objectForKey:@"player"] stop];
[playerArray removeObject:[enemy.userData objectForKey:@"player"]];

需要暂停所有玩家吗?做这个:
    for(AVAudioPlayer *a in playerArray) {
[a pause];
}

并且不要忘记使用以下方法从阵列中删除所有已完成比赛的玩家:
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag {
[playerArray removeObject:player];
}

不知道这是否是最好的方法,但是效果很好。自从我第一次使用SpriteKit以来,仍然开放寻求更好的建议。

关于audio - SpriteKit-当敌人被杀死时如何停止声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23146059/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com