我正在尝试创建一个继承自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();
}
答案 0 :(得分:0)
你的问题不是唯一的 您无权访问构造函数,因此无法创建派生类。无论您是否使用XNA,都是一样的。
如果你想直接使用你的新音效,你可以创建一个伪装饰器,它接收实际的SoundEffectInstance
并包装它。
但是,如果您想将声音效果传递给想要SoundEffectInstance
的XNA方法,这对您没有帮助。
答案 1 :(得分:0)
我通过在类中添加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;
}