2008/07/26: MCをフェードで切り替えるときはBitmapDataを使うといい
ムービークリップのアルファ値を変化させて、フェードインやフェードアウトなどをするときに、そのままやると内包するMCが透けちゃって微妙・・・何てことがあります(下図参照)。
そういうとき、BitmapDataを使ってやるといい感じでした。
主要部分はこんな感じです。
> サンプル
> ソース
それぞれ別のMCを内包している2つのMCをクロスフェードさせます。
「普通のフェード」は、そのままのMCごとクロスフェード。
「コピーしてフェード」は、一旦BitmapDataでコピーしたダミーを使ってクロスフェードし、最後に元のMCと置き換えています。
そういうとき、BitmapDataを使ってやるといい感じでした。
主要部分はこんな感じです。
function fade_bitmap( _old_mc:MovieClip, _new_mc:MovieClip, _frame:Number) :Void
{
var copy_old = copyImage(_old_mc);
var copy_new = copyImage(_new_mc);
copy_old._alpha = 100;
copy_new._alpha = 0;
copy_old.tick = 100/((_frame != undefined) ? _frame : 10);
copy_old.onEnterFrame = function() {
// fade
this._alpha -= this.tick;
copy_new._alpha += this.tick;
if (this._alpha<=0) {
delete this.onEnterFrame;
// delete copies
this.removeMovieClip();
copy_new.removeMovieClip();
// show source
_new_mc._visible = true;
}
};
}
function copyImage( _source:MovieClip ):MovieClip
{
_source._alpha =100;
_source._visible = true;
var copy = _root.createEmptyMovieClip("cover_"+_root.getNextHighestDepth(), _root.getNextHighestDepth());
var screen:BitmapData = new BitmapData( _source._width , _source._height ,true);
screen.draw( _source );
copy.attachBitmap(screen,1);
copy._alpha = 100;
copy._x = _source._x;
copy._y = _source._y;
_source._visible = false;
return copy;
}
> サンプル
> ソース
それぞれ別のMCを内包している2つのMCをクロスフェードさせます。
「普通のフェード」は、そのままのMCごとクロスフェード。
「コピーしてフェード」は、一旦BitmapDataでコピーしたダミーを使ってクロスフェードし、最後に元のMCと置き換えています。