从内部SoundEffectInstance继承,未定义构造函数

本文关键字:未定义 构造函数 继承 内部 SoundEffectInstance | 更新日期: 2023-09-27 18:21:55

我正在尝试创建一个新的类FadableSoundEffectInstance,它继承自SoundEffectInstance

我的FadableSoundEffectInsance会让SoundEffectInstances稍微淡出,但在完成课程后,我得到了一个可爱的错误:

The type 'Microsoft.Xna.Framework.Audio.SoundEffectInstance' has no constructors defined

经过一段时间的研究和对XNA来源的挖掘,我发现了这一点。

internal SoundEffectInstance(SoundEffect parentEffect, bool fireAndForget)
{
...
}

所以它确实有一个构造函数,但我无法访问它

我该如何解决这个问题才能创建我的类?

请注意,对于以前没有使用过XNA的人,不要使用blah = new SoundEffectInstance创建新类,而是加载SoundEffect并使用方法CreateInstance()。此外,SoundEffect是一个密封类。此外,在我的新类中添加一个构造函数会引发同样的错误,但对于SoundEffectInstance

这是我的相关代码,以防你需要深入查看

FadableSoundEffectInstance

    public sealed class FadableSoundEffectInstance : SoundEffectInstance
    {
        public float FadeSpeed = .01f;
        public AudioFadeState FadeState = AudioFadeState.Normal;
        public void FadeOut()
        {
            //Logic
        }
        public void FadeIn()
        {
            //Logic
        }
        public void Update(GameTime gameTime)
        {
            //Logic
        }
    }

还有一个扩展方法,这样我就可以调用SoundEffect.CreateFadableInstance()

    public static FadableSoundEffectInstance CreateFadableInstance(this SoundEffect soundEffect)
    {
        return (FadableSoundEffectInstance)soundEffect.CreateInstance();
    }

从内部SoundEffectInstance继承,未定义构造函数

您的问题不是唯一的
您没有访问构造函数的权限,因此无法创建派生类。无论您是否使用XNA,这都是一样的。

如果你想直接使用你的新音效,你可以创建一个伪装饰器,它接受实际的SoundEffectInstance并包装它

但是,如果您想将声音效果传递给需要SoundEffectInstance的XNA方法,这对您没有帮助。

我通过向类添加SoundEffectInstance而不是继承它来解决这个问题,这可能不是最优雅的解决方案,但它确实有效。

public SoundEffectInstance BaseInstance;

将我的扩展方法更改为:

    public static FadableSoundEffectInstance CreateFadableInstance(this SoundEffect soundEffect)
    {
        return new FadableSoundEffectInstance(soundEffect);
    }

和我的类处理声音效果,把它变成一个SoundEffectInstance,并做任何初始化该类可能需要

    public FadableSoundEffectInstance(SoundEffect soundEffect, float fadeSpeed = .1f)
    {
        BaseInstance = soundEffect.CreateInstance();
        BaseInstance.Volume = 0;
        FadeSpeed = fadeSpeed;
    }