2013-07-11 37 views
0

我試圖創建一個新類FadableSoundEffectInstance,它繼承自SoundEffectInstance從內部SoundEffectInstance繼承,沒有定義構造函數

FadableSoundEffectInsance將使SoundEffectInstances被easlily褪色進出,但完成課後,我與這個可愛的錯誤在這裏進行獎勵:

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

順便說一聲:'SoundEffectInstance'沒有密封。 –

+0

@DanielHilgarth,對不起,對不起。 – Cyral

回答

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; 
    } 
0

你的問題是不是唯一的。
您無權訪問構造函數,因此無法創建派生類。無論您是否使用XNA,這都是一樣的。

如果您想直接使用新的音效,您可以創建一個僞裝飾器,該裝飾器需要採用實際的SoundEffectInstance幷包裝它。

但是,如果您想要將聲音效果傳遞給需要SoundEffectInstance的XNA方法,這並不能幫助您。

+0

與XNA方法互操作的問題很容易解決:只需編寫一個隱式轉換運算符,返回底層的'SoundEffectInstance'。 –

+0

@ColeCampbell:那會有幫助嗎?它將不再是一個褪色。 –

+0

你是否期望XNA的內部代碼在衰落的聲音效果上調用新的方法使其淡入淡出?也許我誤解了你想要創造的點。當你到達一個需要'SoundEffectInstance'的XNA方法時,它的衰落方面是無關緊要的。我的建議完全是一個方便的問題,爲您節省了不得不通過屬性公開底層'SoundEffectInstance'的步驟。 –