2013-07-11 1 views
0

SoundEffectInstance을 상속하는 새로운 클래스 FadableSoundEffectInstance을 만들려고합니다.내부 SoundEffectInstance에서 상속 받음, 정의 된 생성자 없음

FadableSoundEffectInsanceSoundEffectInstances이 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을 반환합니다. 당신은 내가 SoundEffect.CreateFadableInstance()

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

BTW :'SoundEffectInstance'는 봉인되지 않았습니다. –

+0

@DanielHilgarth, 맞습니다, 죄송합니다. – Cyral

답변

0

클래스를 상속하는 대신 SoundEffectInstance을 클래스에 추가하여이 문제를 해결했지만 가장 좋은 해결책은 아니지만 작동합니다.

public SoundEffectInstance BaseInstance; 

그리고이 내 확장 방법을 변경 : 사운드 효과를 처리 SoundEffectInstance으로 바꿀 및 초기화를 할

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

그리고 내 클래스를 클래스가해야 할 수도 있습니다

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

귀하의 질문이 고유하지 호출 할 수있는 깊이

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

그리고 확장 방법 볼 필요 넣다

여기 내 관련 코드입니다.
생성자에 액세스 할 수 없으므로 파생 클래스를 만들 수 없습니다. 이것은 XNA를 사용하든 사용하지 않든간에 동일합니다.

새로운 사운드 효과를 직접 사용하려는 경우 실제 SoundEffectInstance을 가져 와서 랩핑하는 의사 데코레이터를 만들 수 있습니다.

SoundEffectInstance을 원하는 XNA 메서드에 사운드 효과를 전달하려는 경우에는이 방법이 도움이되지 않습니다.

+0

XNA 메서드와의 상호 운용 문제는 해결하기 쉽습니다. 기본 'SoundEffectInstance'를 반환하는 암시 적 변환 연산자를 작성하십시오. –

+0

@ColeCampbell : 그러면 어떻게 도움이 될까요? 그것은 더 이상 사라지지 않을 것입니다. –

+0

XNA의 내부 코드가 사라지는 페이딩 사운드 효과에 대해 새 메서드를 호출 할 것으로 기대합니까? 아마 당신이 만들려고했던 점을 오해했습니다. 'SoundEffectInstance'를 필요로하는 XNA 메서드에 도달하게되면, 그 페이딩 측면은 부적합합니다. 제안은 순전히 편의의 문제이며 속성을 통해 기본 SoundEffectInstance를 노출해야하는 번거 로움을 덜어줍니다. –