トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   迷える子羊の部屋【初心者専用】
     サウンドのフェードアウト
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
TOMIYASU
Åê¹ÆNo.39479
投稿日時: 2008-7-9 14:32
常連
居住地:
投稿: 93
使用環境:
Windows7Pro, CS5Pro
サウンドのフェードアウト
WindowsXP SP2 MX Pro v.7.0.1
メインのタイムラインのあるフレームで以下のようにロードしたサウンドを
一定のフレームに来たときにフェードアウトさせようと以下のようにしました。
実際フェードアウトはするのですが、消音後も一定間隔でこのフレームアクションの処理は呼び続けられるわけで
今回のような軽い処理ならまだ良いですが重い処理になったら
全体への影響も相当でるのではと思いました。
根本的な理解として、その心配は正しいでしょうか?
またもしもっと効率の良いスクリプト等をお教え願いたいのですが・・・


ロードするフレームアクション:
var mySound:Sound = new Sound(this);
mySound.loadSound("hogehoge.mp3", true);
mySound.setVolume(61);

フェードアウトするフレームアクション:
this.onEnterFrame = function() {
V = mySound.getVolume();
if (V > 0) {
V = V - 0.1;
mySound.setVolume(V);
}else{
mySound.stop();
}
};
ひろゆき
Åê¹ÆNo.39480
投稿日時: 2008-7-9 14:35
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: サウンドのフェードアウト
引用:
TOMIYASUさんは書きました:
消音後も一定間隔でこのフレームアクションの処理は呼び続けられるわけで

必要がなくなったのであれば、止めれば良いのでは?

this.onEnterFrame = function() {
	V = mySound.getVolume();
	if (V > 0) {
		V = V - 0.1;
		mySound.setVolume(V);
	}else{
		mySound.stop();
		delete this.onEnterFrame;
	}
};

F-site | イベントハンドラメソッドはdeleteで消せ!


----------------
質問する際は、回答者に具体的な情報を与えてください。

TOMIYASU
Åê¹ÆNo.39482
投稿日時: 2008-7-9 15:15
常連
居住地:
投稿: 93
使用環境:
Windows7Pro, CS5Pro
Re: サウンドのフェードアウト
ひろゆきさん、ありがとうございます。

このスクリプトを加えて検証しようとこのフレームアクション内に
trace();を入れて実行するとボリュームがゼロになった後もずっと呼ばれ続けていることが分かります。
そもそも、この"delete this.onEnterFrame;をここで(自関数で)
呼ぶこと自体にシンタックスや実行時のエラーが発生しないことが
私にとってActionScriptを難しく感じさせます。どうかよろしくお願います・・・・


this.onEnterFrame = function() {
V = mySound.getVolume();
trace(V);
if (V > 0) {
V = V - 0.1;
mySound.setVolume(V);
}else{
mySound.stop();
delete this.onEnterFrame;
}
};
あにぃ
Åê¹ÆNo.39483
投稿日時: 2008-7-9 15:34
職人
居住地: 北海道
投稿: 250
使用環境:
Flash8
FlashCS3
WinXP
FlashLite1.1 / 2.0
Re: サウンドのフェードアウト
Volumeの値に設定できるのは整数値のみだった気がします。
なので、

cnt=0;
this.onEnterFrame = function() {
    cnt++;
    if(cnt>=10){
        cnt=0;
        V = mySound.getVolume();
        trace(V);
        V--;
        mySound.setVolume(V);
        if(V<1){
            mySound.stop();
            delete this.onEnterFrame;
        }
    }
}

にしたほうがいいかと思います。

引用:
このスクリプトを加えて検証しようとこのフレームアクション内に
trace();を入れて実行するとボリュームがゼロになった後もずっと呼ばれ続けていることが分かります。

そんなわけないと思い、検証しましたがなりません。
なったのであれば、他の部分に問題があるように思われます。


----------------
質問する際には、ご自分でできる限り調べてから投稿して下さい

P・S 職人おめでとう。(08/10/09)

TOMIYASU
Åê¹ÆNo.39486
投稿日時: 2008-7-9 21:53
常連
居住地:
投稿: 93
使用環境:
Windows7Pro, CS5Pro
Re: サウンドのフェードアウト
towardさん、ありがとうござあます。
引用:
Volumeの値に設定できるのは整数値

修正しました。ありがとうございます。

引用:
検証しましたがなりません。

デクリメントを整数単位で設定すると出力ウィンドウへの
音量数値の出力がゼロの時点で止まりました。
少数にすると延々と呼ばれて、ゼロの出力が止まりませんでした。
そこが問題でした。解決しました。ありがとうございます。

参考のためお教えください。
イベントハンドラのonEnterFrame = function()を消すことですが
それを自分自身の関数内で消すことが驚きなのですが、
このようなことは一般的なユーザ定義関数では無理ですね?
タイムラインというオブジェクトにおいてフレームから
そのイベントハンドラを取り除くケースだけできるようになっているのでしょうか?
ほかにもこのような例はあるのでしょうか?
不勉強で申し訳ありませんが教えてください。
野中文雄
Åê¹ÆNo.39487
投稿日時: 2008-7-9 23:07
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: サウンドのフェードアウト
消せるのであれば、関数内であろうが外であろうが、関係ありません。ActionScript 1.0/2.0では、一般的に可能です。
function xTest() {
	trace("called");
	delete xTest;
}
trace(xTest);
xTest();
trace(xTest);
xTest();

引用:
TOMIYASUさんは書きました:
イベントハンドラのonEnterFrame = function()を消すことですが
それを自分自身の関数内で消すことが驚きなのですが、
このようなことは一般的なユーザ定義関数では無理ですね?


----------------
 

TOMIYASU
Åê¹ÆNo.39488
投稿日時: 2008-7-9 23:21
常連
居住地:
投稿: 93
使用環境:
Windows7Pro, CS5Pro
Re: サウンドのフェードアウト
野中様ありがとうございます。

一定の条件で自分を消して大丈夫で、その後たとえ
呼ばれたとしてもエラーが発生しないということですね。
(なければ無いで済んでいくという・・・)
このことを今の初心の時点で知ることができ良かったと思います。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops