いやー、またもや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に描画する、という流れになります。)
とりあえず、対策方法を見つけ出せて一安心!でした。
テストコード
以下に、上記例で使用したコードを二つ載せておきますので、デバッグの際には参考にしてみてください。




