2012-03-14 8 views
2

So。大量のコードを投稿することなく基本的に私がやっていることは、ActionScript3を使用してフラッシュCS5でFLAファイルにいくつかのサウンドをインポートすることです。movieclipをremoveChild経由で削除した後にFlash AS3サウンドが再生される

私は、作成されたサウンドチャンネルと、メインクラスで作成されたサウンドのインスタンスを持っています。

コンストラクタ関数では、最初のシーンはaddChildで作成されています。また、サウンドチャンネルを通じてバックグラウンドミュージックサウンドを初期化します。

問題は、最初のシーンのフレーム40でサウンドエフェクトを再生したいのです。サウンドをタイムラインに挿入するだけですが、シーン2を挿入してシーンを削除しても、そのサウンドエフェクトは引き続き再生されます。また、フレーム40でactionscriptを使ってサウンドを再生しようとしましたが、removeChildの後にもループします。

これを行う正しい方法は何ですか?私はメインクラスのすべてのコードを保持することを望むだろうが、私は個々のシーンにスクリプトを追加する必要がある場合は、私はそれをしています。ちょうど私は音を止めてループを止めることができた!

答えて

0

removeChildはサウンドを停止する必要はなく、子リストからdisplayObjectを削除して視覚的に削除します。

開始したサウンドを停止したい場合は、removeChildを呼び出すときにそのサウンドチャネルへの参照が必要です。次に、SoundChannel.stop()を使用してください。http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/media/SoundChannel.html#stop()

もっと正確な答えを得るためには、より多くの情報が必要です。

あなたが試したオプションの1つは、フレーム40のタイムラインの内側からサウンドを再生することです。問題は、displayObjectが既に削除されていても再生されていることです。私の好きな解決策はありませんが、動作するはずです。この場合では、あなたがこれを行うことができます:それは、ステージの上にまだある場合は、こののDisplayObjectのステージはつまり、子として追加された、(存在する場合を意味し、どの

// on frame 40 
if (this.stage != null) { 
    // play sound here 
} 

をし、まだ削除されていませんでした)、内部のコードが実行されます。突然削除された場合、サウンドは引き続き再生されます。それを止めるには、SoundChannelへの参照が必要です。オブジェクトの内部から、addEventListener(Event.REMOVED_FROM_STAGE, func)を使用してオブジェクトがいつ削除されたかを知り、参照されている関数の中でSoundChannel.stopコードを実行することができます。

- 編集:オブジェクトを作成するときに実際にこれを行うための適切な方法は、実際のタイムライン

の内側ではありません、それにイベントを追加します。

myObjectWithSoundInside.addEventListener(Event.REMOVED_FROM_STAGE, objRemoved) 

function objRemoved (event:Event):void { 
    // This is where you SoundChannel.stop() 
} 

次にあなたがremoveChild(myObjectWithSoundInside)を実行すると、 objRemovedの内部コードが正しく、適切に参照されていると仮定して、サウンドは停止するはずです。

+0

返信いただきありがとうございます!したがって、オブジェクト(scene1)内にREMOVED_FROM_STAGEイベントを使用するように選択した場合は、フレーム40の内部に関数を作成しますか?また、フレーム40にチャンネルとサウンドオブジェクトを作成しますか?私がムービークリップの中からチャンネルにアクセスしようとすると、エラーが出るので、チャンネルとサウンドインスタンスをオブジェクトの中に入れなければなりません。これは恐ろしい方法です。 – nobi

+0

タイムラインの中にそれらを置くことは本当にこれを行う悪い方法です。あなたのプロジェクトの構造を理解しているかどうか分かりません。 とにかく、同じこと - 外部からもイベントREMOVED_FROM_STAGEを引き出すことができます。そこでは、SoundChannelを適切に参照して停止させることができます。更新された回答を確認してください。 – ido

1

SoundChannelのすべてのインスタンスで、SoundChannel.stop()を使用する必要があります。

サウンドをタイムラインに挿入するのではなく、this exampleのようにサウンドを読み込んで再生することをお勧めします。SoundChannelインスタンスにアクセスできます。

1

私は同じ問題を抱えていました。私の親クリップは、クリップにいくつかのフレーム(遅れていました)のサウンドを子にロードしていました。子供を削除すると、表示されたステージのみが削除されましたが、サウンドはループし続けました。子が削除されるたびに

if (this.stage == null) { 
    SoundMixer.stopAll(); 
} 

は今、ループが停止します。私は音が子ムービークリップで遊んでいたし、すべてが固定されたフレームにこのコードを挿入します。私は子供の中で演奏されるサウンドクリップのすべてのキーフレームでこれを行わなければなりませんでした。

+0

オクラシ、アイデアのおかげで、私はこのようなものを使用して終わったと思う。また、これをキーフレームの代わりにクラス定義に入れる方が良いと思います。つまり、すべてのコードを同じ場所に保存して、タイムラインから外すことができます。 – nobi

関連する問題