C# 从一个实例重复声音
我一直在读关于将声音编程到c#XNA游戏中的不同方法的书。我决定使用声音实例进行音量控制,但在播放.wav时,我意识到声音只有在完成后才能再次播放,而如果要求播放,仅使用声音效果.play()(而不是实例)将导致它播放自己的多个副本。所以我的问题是,在一个场景中,按下一个按钮会导致一个单一的声音效果一次播放多次(例如机关枪的重复嗡嗡声等),而不是等到声音文件结束时循环播放;您将如何使用实例?我假设我遗漏了一些东西,或者某个实例不是为这种用途而设计的。如果是,音效的基本选项与音效实例的基本选项之间的主要区别是什么?提前感谢。AC# 从一个实例重复声音,c#,audio,xna,effects,repeat,C#,Audio,Xna,Effects,Repeat,我一直在读关于将声音编程到c#XNA游戏中的不同方法的书。我决定使用声音实例进行音量控制,但在播放.wav时,我意识到声音只有在完成后才能再次播放,而如果要求播放,仅使用声音效果.play()(而不是实例)将导致它播放自己的多个副本。所以我的问题是,在一个场景中,按下一个按钮会导致一个单一的声音效果一次播放多次(例如机关枪的重复嗡嗡声等),而不是等到声音文件结束时循环播放;您将如何使用实例?我假设我遗漏了一些东西,或者某个实例不是为这种用途而设计的。如果是,音效的基本选项与音效实例的基本选项之间
SoundEffectInstance
是声音播放的单个实例;根据定义,一次不能播放多个。当然,您可以拥有相同SoundEffect
的多个实例。事实上,这就是调用SoundEffect.Play()
时发生的基本情况:您正在创建一个实例并播放它
考虑到这一点,你有几个选择。如果您[大概]想在按下按钮时阻止10亿个声音完全播放,那么您绝对不应该使用SoundEffect.Play()
,正如您所发现的,将创建许多实例(这可能对性能和总体管理非常不利)。对于频率较低的声音,这可能是一个不错的方法
话虽如此,SoundEffectInstance
可以以何种方式使用?基本上,它可以从一开始就重新启动。请注意,您仍然可以有多个SoundEffectInstance
s当然,每个游戏组件一个(或多个)。通过这种方式,您的一支枪可以重新启动,而不会干扰同一声音的不同枪的实例。或者,出于性能原因,您可以选择每个声音效果只有一个实例
我在尝试以“简单”的方式重新启动时遇到问题:
从历史上看,这对我不起作用;如果对您有利,请忽略以下内容:
我要做的是为每个实例设置自己的“重启”标志。因此,我用自己的类包装了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; }
}
}
使用此方法,您必须为每个
声音
调用每个帧的Update(),因此请将它们的集合保存在某个地方,或者使它们可以访问。一个SoundEffectInstance
是声音播放的单个实例;根据定义,一次不能播放多个。当然,您可以拥有相同SoundEffect
的多个实例。事实上,这就是调用SoundEffect.Play()
时发生的基本情况:您正在创建一个实例并播放它
考虑到这一点,你有几个选择。如果您[大概]想在按下按钮时阻止10亿个声音完全播放,那么您绝对不应该使用SoundEffect.Play()
,正如您所发现的,将创建许多实例(这可能对性能和总体管理非常不利)。对于频率较低的声音,这可能是一个不错的方法
话虽如此,SoundEffectInstance
可以以何种方式使用?基本上,它可以从一开始就重新启动。请注意,您仍然可以有多个SoundEffectInstance
s当然,每个游戏组件一个(或多个)。通过这种方式,您的一支枪可以重新启动,而不会干扰同一声音的不同枪的实例。或者,出于性能原因,您可以选择每个声音效果只有一个实例
我在尝试以“简单”的方式重新启动时遇到问题:
从历史上看,这对我不起作用;如果对您有利,请忽略以下内容:
我要做的是为每个实例设置自己的“重启”标志。因此,我用自己的类包装了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; }
}
}
使用此方法,您必须为每个声音
的每一帧调用Update(),因此请将它们的集合保存在某个位置,或者使它们可以访问