2012-01-24 13 views
1

私は、サウンドをC#XNAゲームにプログラミングするさまざまな方法について読んできました。私は音量コントロールのサウンドインスタンスを使用することに決めましたが、.wavを再生している間は、サウンドエフェクト.Play()を使用してインスタンス)は、それが要求されるべきであれば、自分自身の複数のコピーを再生させます。ですから、私の質問は、ボタンを押し続けると、サウンドファイルの終わりまで待つのではなく、一度に複数回(例えば、マシンガンの無人機など)複数回再生するというシナリオですループする。どのようにインスタンスを使用しますか?私は、欠落しているものがあるか、インスタンスがこの用途のために設計されていないと想定しています。そうであれば、サウンドエフェクトの基本オプションとサウンドエフェクトインスタンスの基本オプションの主な違いは何ですか?前もって感謝します。1つのインスタンスからサウンドを繰り返します。

答えて

4

SoundEffectInstanceは、サウンド再生の1つのインスタンスです。定義上、一度に複数を再生することはできません。もちろん、あなたは同じものの複数のインスタンスを持つことができますSoundEffect。実際には、これは基本的にSoundEffect.Play()と呼ぶときに起きていることです。インスタンスを作成して再生しているということです。

これを念頭に置いて、プレートにはいくつかのオプションがあります。あなたがボタンを押したときに何十億もの音が完全に再生されないようにしたいのであれば、確かにSoundEffect.Play()を使ってはいけません。発見したように多くのインスタンスが作成されます(これは、とにかく全体的な管理)。それほど頻繁でない音については、大丈夫でしょう。

これは、どのようにしてSoundEffectInstanceを使用できますか?基本的には、最初から再起動することができます。もちろん、SoundEffectInstanceの複数のゲームコンポーネントを1つ(または複数)持つこともできます。このようにして、あなたの銃の1つが再始動し、同じ音の別の銃のインスタンスを混乱させることはありません。また、パフォーマンス上の理由から、サウンドエフェクトごとに1つのインスタンスしか持たないようにすることもできます。私はそれを「シンプル」な方法再起動しようとすると問題がありました

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

関連する問題