我一直在阅读有关将声音编程到 c# XNA 游戏中的不同方法。我决定使用声音实例来控制音量,但在播放 .wav 时,我意识到声音只会在播放完毕后再次播放,而只使用音效 .Play()(而不是instance) 会导致它播放自己的多个副本,如果被要求的话。所以我的问题是,在按住一个按钮会导致单个音效一次播放多次(例如机枪的重复嗡嗡声等)的情况下,而不是等到声音文件结束循环;你将如何使用实例?我假设我遗漏了什么,或者某个实例不是为此用途而设计的。如果是这样,音效的基本选项与音效实例的基本选项之间的主要区别是什么?提前致谢。
最佳答案
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(),因此请在某处保存它们的集合或以其他方式访问它们。
关于c# - 重复一个实例的声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8994292/