いやー、またもやFlashのコーディングでハマりました!ということで、ハマった原因と対策をトラブルシューティングとしてまとめてみました。
Flash Player 9で落ちる
BitmapDataのdrawメソッドを使っている箇所で、特定の条件を満たすとFlashPlayerがおちることがある問題にぶつかりました。
特定条件とは、以下の4点です。
- 描画ターゲット(drawメソッドの第1引数に渡すオブジェクト)内にTextFieldがある
- FlashPlayerのバージョンが9である
- drawメソッドでBlendModeをnull以外に指定する
- drawメソッドを2回以上呼び出す
Flash Player 10以降では落ちないので、ユーザー環境のターゲットが10以降の場合には問題になりません。Flash Player 10の普及率も8割以上らしいので、もうあんまり問題にならないような気もしますが、苦闘メモとして残しておきます。
また、4点目に書いていますが、一回drawしただけでは落ちないけど、毎フレームdrawすると2フレーム目のdrawで落ちるので、これもプロジェクト次第ですね。
検証してみた
症状を再現するためにテストファイルを作ってみました。以下のようにして再現させることができます。
- TextFieldを作成し、_textFieldと名付ける。
- そのTextFieldを含むMovieClip(TextFieldMC)を作成し、_mcと名付ける。
- TextFieldMCの基本クラスをTextSpriteとし、後述するコード(TextSprite.as)を作成。
- root上にBitmapインスタンスを_targetとして作成し、そのBitmapData上に_mcを描画するコードを書きます。

このようにして作成したflaファイルと一緒に、エントリ末に示すコードを記述・準備・リンケージ設定すると、再現できます。
対応策
対応策ですが、TextFieldを含む描画オブジェクト(上記例で言うところの_mc)のcacheAsBitmapをtrueにすると落ちなくなります。
また、この対策と同様の対策として、間にもう一つBitmapDataを挟む方法もあります。試してみましたが、うまく動作しました。(上記例で言うと、_mcを一度別のBitmapDataにBlendMode抜きで描画し、そのBitmapDataをBlendModeをつけて_targetに描画する、という流れになります。)
とりあえず、対策方法を見つけ出せて一安心!でした。
テストコード
以下に、上記例で使用したコードを二つ載せておきますので、デバッグの際には参考にしてみてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | // TestBmpdDrawRoot.as package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.BlendMode; import flash.display.Sprite; import flash.events.Event; public class TestBmpdDrawRoot extends Sprite { public var _mc:TextSprite; public var _target:Bitmap; public var _targetData:BitmapData; // コンストラクタ. public function TestBmpdDrawRoot(){ _targetData = new BitmapData( _mc.width, _mc.height ); _target = new Bitmap( _targetData ); addChild( _target ); _target.x = 5; _target.y = 5; addEventListener( Event.ENTER_FRAME, process, false, 0, true ); } private function process(e:Event):void { _targetData.draw( _mc, null, null, BlendMode.LAYER ); // NG. } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | // TextSprite.as package { import flash.display.Sprite; import flash.text.TextField; public class TextSprite extends Sprite { public var _textField:TextField; // コンストラクタ. public function TextSprite() { //cacheAsBitmap = true; // OK. } } } |
[AD]
著者/訳者:Colin Moock
出版社:オライリージャパン( 2008-11-22 )
定価:¥ 6,090
Amazon価格:¥ 6,090
大型本 ( 1044 ページ )
ISBN-10 : 4873113873
ISBN-13 : 9784873113876











