こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

フェードイン、フェードアウトの「オバーラップ」について

flash初心者です。
AS2.0です。よろしくお願いいたします。

ボタンでムビークリップを切り替える時、
フェードイン、フェードアウトの「オバーラップ」に
したいのですが。

(A_mcがフェードアウトする同じタイミングで
B_mcがフェードインする)

ムービークリップが大量にあるので
ムービークリップそれぞれに同一のスクリプトで
フェードイン、フェードアウトを設定して効率化
したいと考えています。

フェードインは

onClipEvent (load) {
this._alpha = 0;
}
onClipEvent (enterFrame) {
if (this._alpha<100) {
this._alpha += 2;
}
}

のようなスクリプトで実現できたのですが
フェードアウトがわかりません。
※イメージの関係でフェードアウトがどうしても必要になりました。


onClipEvent (unload) {
}

のようなタイミングで制御できればと
考えているのですが

具体的にアドバイスいただると助かります
よろしくお願いいたします。

投稿日時 - 2009-02-22 04:07:22

QNo.4738478

困ってます

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

> AS2.0です。

ActionScript2.0 は ActionScript1.0 を拡張した Flash MX 2004(通し番号 Flash 7) 以降で使える バージョンですよ。

一方,書かれていらっしゃるスクリプトは
Flash 5 でも使用できる ActionScript1.0 範囲 (ActionScript1.0 の中でも一番最初からある範囲) のものですが,
以下は Flash 5 ではなく MX 2004 以降対応の話でよろしいでしょうか。



> ムービークリップが大量にあるので
> ムービークリップそれぞれに同一のスクリプトで
> フェードイン、フェードアウトを設定して効率化
> したい

それでしたら,
ムービークリップ個々にスクリプトを書くのではなく,フレームに書いて,
1つもしくは1つの関数などで管理する方が良いと思います。


> onClipEvent (unload) {
> }
> のようなタイミングで制御できればと

これは,それより上までの文章と矛盾していますよ。
ご質問の最初に書かれていらっしゃいますが,

> ボタンでムビークリップを切り替える時、
> フェードイン、フェードアウトの「オバーラップ」に
> したい

ということをしたいわけでしょう?
そうでしたら フェードインドアウト するのは,
onClipEvent(unload) のタイミングではなく
ボタンの on(release) のタイミング
もしくは
ボタン.onRelease のタイミングになると思います。
つまり,
普通にボタンをクリックしたタイミングになると思います。



◎ 以下では1つの例を回答します。

MC(ムービークリップ) は仮に 10 個 あって,
その各 MC に対応するボタンも 10 個あるものとします。

各MCやボタンにはインスタンス名を付けます。
10個のMCの方には
「my_mc0」,「my_mc1」,「my_mc2」,…,「my_mc9」
10個のボタンの方には
「my_btn0」,「my_btn1」,「my_btn2」,…,「my_btn9」
というインスタンス名を付けることにしておきます。

それら20個が存在するタイムラインのキーフレームに
次のようなスクリプトを書けば完成です。

----------------------------------------
// MC や ボタン の最終番号を設定
var last:Number = 9;

// 現在表示中のMCを参照する変数を用意
var now_mc:MovieClip;

// my_mc0~last を透明にする
for (var i:Number = 0; i<=last; i++) {
this["my_mc"+i]._alpha = 0;
}

// MCをフェードインさせる関数の定義
function fadeIn(target:MovieClip) {
// ターゲットのMCに毎フレーム実行する関数を定義
target.onEnterFrame = function():Void {
// この MC のアルファを 2 ずつ加算
this._alpha += 2;
// もしアルファが 100 以上になれば
if (this._alpha>=100) {
// アルファを 100 で固定
this._alpha = 100;
// この MC に定義した onEnterFrame を削除
delete this.onEnterFrame;
}
};
}

// MCをフェードアウトさせる関数の定義
function fadeOut(target:MovieClip) {
// ターゲットのMCに毎フレーム実行する関数を定義
target.onEnterFrame = function():Void {
// この MC のアルファを 3 ずつ減算
this._alpha -= 3;
// もしアルファが 0 以下になれば
if (this._alpha<=0) {
// アルファを 0 で固定
this._alpha = 0;
// この MC に定義した onEnterFrame を削除
delete this.onEnterFrame;
}
};
}

// my_btn0~last に関してのループ
for (i=0; i<=last; i++) {
// 各ボタンの変数 my_mc にそのボタンに対応するMCを登録
this["my_btn"+i].my_mc = this["my_mc"+i];
//
// 各ボタンクリック時の動作を定義
this["my_btn"+i].onRelease = function():Void {
// 関数 fadeOut を実行(引数:現在表示中のMC)
fadeOut(now_mc);
// 現在表示中のMCを更新
now_mc = this.my_mc;
// 関数 fadeIn を実行(引数:各ボタン対応MC)
fadeIn(this.my_mc);
};
}
----------------------------------------


ボタン自体にはスクリプトを書きません。
ボタンクリック時の動作も,
すべて上のフレームのスクリプトで指示(定義)します。

ボタンやMCの数が増減する場合は,

  // MC や ボタン の最終番号を設定
  var last:Number = 9;

この数値 9 を編集すれば良いだけです。


フェードインをするスピードはココ↓を替えれば良いですね。

  // この MC のアルファを 2 ずつ加算
  this._alpha += 2;

またフェードアウトをするスピードはココ↓を替えれば良いです。

  // この MC のアルファを 3 ずつ減算
  this._alpha -= 3;

その他を触る必要は全くないので,
> フェードイン、フェードアウトを設定して効率化
の効率化が図れていると思います。
見たり変えたりするのは上のスクリプトだけで,それもごく一部のみです。


ちなみに私は,
下の図↓のようなものを作成して動作検証などをしてみました。

MCの座標はすべて縦並びにしていますが,
同じ座標で重ねても良いと思いますし,
同じ座標で重ねる場合は編集しやすいようにレイヤーを分けても良いと思います。


※ ActionScript2.0 でしたら上に書いた
  fadeIn や fadeOut のようなカスタム関数ではなく
  fadeInクラス や fadeOutクラス または fadeInOutクラス など
  カスタムクラスを作成しても良いかもしれません。
  そうすれば複数ファイルあるときなどに
  もっと効率化が図れる可能性があります。
  ここでは書きませんが,
  もし興味などありましたら研究されても良いかもしれません。




=== 補足 ========================

AS2.0 と書かれていらっしゃるのが AS1.0 の書き間違いである可能性も考えられるので,
Flash MX (通し番号 Flash 6 のこと) 対応の ActionScript1.0 まで落としたものも書いておきます。

と言いましても,
上のスクリプトの変数や関数の型指定を取っただけですが。

---------------------------------------
// MC や ボタン の最終番号を設定
var last = 9;

// my_mc0~last を透明にする
for (var i = 0; i<=last; i++) {
this["my_mc"+i]._alpha = 0;
}

// MCをフェードインさせる関数の定義
function fadeIn(target) {
// ターゲットのMCに毎フレーム実行する関数を定義
target.onEnterFrame = function() {
// この MC のアルファを 2 ずつ加算
this._alpha += 2;
// もしアルファが 100 以上になれば
if (this._alpha>=100) {
// アルファを 100 で固定
this._alpha = 100;
// この MC に定義した onEnterFrame を削除
delete this.onEnterFrame;
}
};
}

// MCをフェードアウトさせる関数の定義
function fadeOut(target) {
// ターゲットのMCに毎フレーム実行する関数を定義
target.onEnterFrame = function() {
// この MC のアルファを 3 ずつ減算
this._alpha -= 3;
// もしアルファが 0 以下になれば
if (this._alpha<=0) {
// アルファを 0 で固定
this._alpha = 0;
// この MC に定義した onEnterFrame を削除
delete this.onEnterFrame;
}
};
}

// my_btn0~last に関してのループ
for (i=0; i<=last; i++) {
// 各ボタンの変数 my_mc にそのボタンに対応するMCを登録
this["my_btn"+i].my_mc = this["my_mc"+i];
//
// 各ボタンクリック時の動作を定義
this["my_btn"+i].onRelease = function() {
// 関数 fadeOut を実行(引数:現在表示中のMC)
fadeOut(now_mc);
// 現在表示中のMCを更新
now_mc = this.my_mc;
// 関数 fadeIn を実行(引数:各ボタン対応MC)
fadeIn(this.my_mc);
};
}
---------------------------------------


同じ ActionScript1.0 でも,
Flash 5 に対応させるにはスクリプトの変更みたいな単純なものだけでは全く対応できません。

Flash 5 でしたら,
ボタンにインスタンス名を付けることができませんし,
各ムービークリップに書く onClipEvent (enterFrame) などをなんとか変えていくしかありませんから,
ムービー全体の作り方や考え方などの根本から考えなおさなければならないということになります。
(つまり,あまり効率化が図れないということになります。)
また
MovieClip.onEnterFrame は delete で削除できますが
onClipEvent(enterFrame) はスクリプトでは削除できないため
CPU や メモリ の無駄づかいにつながる場合が多いです。
※ onClipEvent(enterFrame) の場合,
  それを書いたムービークリップ自体を削除(アンロード)
  すれば消えることは消えます。
  しかしムービークリップを削除しなければ消せません。
 

投稿日時 - 2009-02-23 18:38:56

補足

情報不足などころ、詳細なアドバイス恐縮です。
環境はCS3でスクリプトの切替がありましたので、AS3.0ではないということでAS2.0と表記したのですが
1.0、2.0でもこれだけちがうのかと、唖然とした次第です。

htmlなどと比べた場合、画像の切替などなめらかに表現できるのがFLASHの一つの特徴だと思っています。
私も含め初心者にはお宝のような情報です。

これから実際に勉強も含め設定していきます、改めて報告いたします。
ありがとうございます。

投稿日時 - 2009-02-25 00:04:11

ANo.1

this._alpha += 2;
の 2 を定数ではなく変数に書き換え、
this._alpha += da;
フェードインの場合は2(onclipevent(load)で定義)、
フェードアウトの場合は-2、というようにスクリプトで書き換えを行えばできます。

ちなみにこのとき
if (this._alpha<100)
の条件式もda=-2のときは(0<・・・)となる条件式に書き換えなければいけません。




うまく説明できたか分かりませんが、
enterFrameの処理内容を変数一つで変えれるようにしておく、ということです。

投稿日時 - 2009-02-23 17:59:13

お礼

アドバイスありがとうございました。
初心者の私には、まだ敷居が高そうですが
考え方は参考になりました。
まず具体的なBlurFiltan様の方法を先にトライしてみます。
ありがとうございました。

投稿日時 - 2009-02-25 00:03:53

あなたにオススメの質問