c# - 重复一个实例的声音

标签 c# audio xna effects repeat

我一直在阅读有关将声音编程到 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/

相关文章:

android - 选择最后连接的音频源android

python - Python读取.3gpp文件

c# - 需要有关单游戏屏幕分辨率和交集的帮助

c# - 使用 LINQ C# 将模型类集合转换为基于属性作为 KEY 的字典

c# - 使用 WHERE 子句重构简单的 SQL 语句

ios - 我的 Sprite Kit 游戏第一次播放音频变慢?

c# - C# 和 XNA 中的游戏配置

c++ - 在 C++ 中创建具有自定义速率处理的更新方法

c# - 授权 token 未在 ASP.NET Core 中绑定(bind)

javascript - 在 Chart.js MVC c# 中使用模型中的数据