重复一个实例中的声音
本文关键字:实例 声音 一个 | 更新日期: 2023-09-27 18:21:23
我一直在读关于将声音编程到c#XNA游戏中的不同方法。我已经决定使用一个声音实例来控制音量,但在播放.wav时,我意识到声音只有在完成后才会再次播放,而如果被要求,只使用sound Effect.play()(而不是实例)会导致它播放自己的多个副本。所以我的问题是,在按下按钮将导致单个音效同时播放多次的场景中(例如机枪的重复嗡嗡声等),而不是等到声音文件结束才循环;您将如何使用实例?我认为我缺少了一些东西,或者实例不是为这种用途而设计的。如果是,音效的基本选项和音效实例的基本选项之间的主要区别是什么?提前谢谢。
SoundEffectInstance
是声音播放的一个实例;根据定义,一次不能播放多个。当然,您可以拥有同一SoundEffect
的多个实例。事实上,当您调用SoundEffect.Play()
时,基本上就是这样:您正在创建一个实例并播放它
考虑到这一点,你有几个选择。如果你[大概]想在按下按钮时阻止十亿个声音完全播放,你绝对不应该使用SoundEffect.Play()
,就像你发现的那样,会创建很多实例(这可能对性能和整体管理非常不利)。对于频率较低的声音,这可能是一个不错的方法。
话虽如此,SoundEffectInstance
的使用方法是什么?基本上,它可以从一开始就重新启动。请注意,您仍然可以有多个SoundEffectInstance
,当然,每个游戏组件一个(或多个)。这样,你的一支枪就可以重新启动,而不会干扰另一支枪发出的相同声音。或者,出于性能原因,您可以选择每个音效只有一个实例。
我在尝试以"简单"的方式重新启动时遇到了问题:
instance.Stop();
instance.Play();
从历史上看,这对我来说并不奏效;如果是这样,请忽略以下内容:
我所要做的是为每个实例设置自己的"重启"标志。所以我用我自己的类包装了SoundEffectInstance
类:
//class that represents one sound effect instance PLUS restart flag
public class Sound
{
SoundEffectInstance instance;
bool restart;
public Sound(SoundEffectInstance i)
{
instance = i;
restart = false;
}
public bool PlayingOrRestarting()
{
return State == SoundState.Playing || restart;
}
public void Update()
{
if (restart)
{
instance.Play();
restart = false;
}
}
public void Play()
{
instance.Play();
}
public void Restart()
{
instance.Stop();
restart = true;
}
public void Stop()
{
instance.Stop();
restart = false;
}
public SoundState State
{
get { return instance.State; }
}
public float Volume
{
set { instance.Volume = value; }
get { return instance.Volume; }
}
public bool IsLooped
{
set { instance.IsLooped = value; }
get { return instance.IsLooped; }
}
}
使用此方法,您必须为每个Sound
的每个帧调用Update(),所以请将它们的集合保存在某个位置,或者使它们可以访问。