2012-01-24 4 views
1

나는 사운드를 C# XNA 게임으로 프로그래밍하는 다양한 방법에 대해 읽었습니다. 볼륨 컨트롤에 사운드 인스턴스를 사용하기로 결정했으나 .wav를 재생하는 동안 사운드가 완료된 후에 만 ​​다시 재생된다는 것을 알았지 만 사운드 효과 .Play()를 사용하는 대신 인스턴스)는 요청할 때 여러 복사본을 재생하게됩니다. 그래서 내 질문은, 버튼을 누르고 있으면 사운드 파일의 끝까지 기다리는 대신 한 번에 여러 번 (예 : 기관총의 반복 무인 등) 한 번의 사운드 효과가 재생되는 시나리오에서입니다. 루프; 인스턴스를 어떻게 사용 하시겠습니까? 내가 누락되었거나 인스턴스가이 용도로 설계되지 않았다고 가정합니다. 그렇다면 사운드 효과의 기본 옵션과 사운드 이펙트 인스턴스의 기본 옵션 사이의 주요 차이점은 무엇입니까? 미리 감사드립니다.하나의 인스턴스에서 반복되는 사운드

답변

4

SoundEffectInstance은 사운드 재생의 단일 인스턴스입니다. 정의 상으로는 한 번에 하나 이상을 재생할 수 없습니다. 물론 동일한 복수의 인스턴스를 가질 수 있습니다 SoundEffect. 사실, 이것은 기본적으로 SoundEffect.Play()으로 전화하면 발생합니다 : 인스턴스를 생성하고 재생하고 있습니다.

염두에두고, 당신의 접시에 몇 가지 옵션이 있습니다. 버튼을 누르고있을 때 10 억 개의 소리가 완전히 재생되는 것을 막으려한다면 SoundEffect.Play()을 사용해서는 안되며 많은 사용자가 많은 인스턴스를 만들 것입니다 (성능이 저하 될 수 있음). 어쨌든 전반적인 관리). 덜 빈번한 소리는 괜찮은 방법 일 수 있습니다.

그렇다면 어떤 방법으로 SoundEffectInstance을 사용할 수 있습니까? 기본적으로 처음부터 다시 시작할 수 있습니다. 물론 SoundEffectInstance 개의 게임 구성 요소 당 하나 이상 (또는 그 이상)이 여러 개있을 수 있습니다. 이 방법으로 당신의 총 중 하나가 다시 시작될 수 있으며 같은 소리의 다른 총의 인스턴스를 엉망으로 만들 수 없습니다. 또는 성능상의 이유로 사운드 효과 하나당 인스턴스 하나만 선택할 수도 있습니다.

나는 그것에게 "간단한"방법으로 다시 시작하려고 문제를 했어 :

instance.Stop(); 
instance.Play(); 

역사적으로이 나를 위해 일한되지 않았습니다; 그것이 당신을 위해한다면, 다음을 무시하십시오 :

인스턴스 당 내 "재시작"플래그를 설정해야했습니다. 당신이) 업데이트 (전화 모든 Sound에 대한 모든 프레임, 그래서 그들의 컬렉션을 어딘가에 보관하거나 그렇지 않으면 액세스 할 수 있도록해야 할이 방법을

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

: 그래서 지금처럼 내 자신과 SoundEffectInstance 클래스를 감쌌다.

+0

감사합니다. 내 쿼리가 완벽하게 정리되었습니다. – GamersIncoming

관련 문제