ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

【高度】Flash Action ScriptコミュのBitmapData.draw()について質問です

  • mixiチェック
  • このエントリーをはてなブックマークに追加
初めまして。
今回の質問はタイトルの通りBitmapData.draw()メソッドについてなのですが、
今私がやろうとしているのは、

ビットマップ画像を配置したMCを、BitmapData(以下_bmd)にdrawできるのか、です。

何回かやってみたのですが、BitmapDataコンストラクタで生成した見た目のまま変わらず、と言ったところです。

以下、構造とソースを載せますので
■ビットマップ画像を内包したMCをBitmapData.draw()で描画できるのか

と言う疑問と、もし可能な場合、自分のソースのどこが間違っているのか教えていただけると幸いです。
(drawメソッドは、ベクターデータにできるものしか転写できないのかな、と今は予測しています)

以下詳細--------------------------------------
mc_background(背景をまとめたMC)
├mc_bg1
├mc_bg2
└mc_bg3(アルファチャンネル含むビットマップ画像を配置したMC。mc_bg1,mc_bg2も同じ)

以下ソース(mc_backgroundのフレームに記述)


import flash.display.BitmapData;
import flash.geom.Rectangle;
var _bmd = new BitmapData(788, 492, true, 0xff000000); //黒いBitmapデータを生成
this.createEmptyMovieClip("canvas_mc", 1); //Bitmap配置用MC生成
canvas_mc.attachBitmap(_bmd, 1); //MCにBitmapDataをアタッチ

var bg1_rct:Rectangle =
new Rectangle(mc_bg1._x, mc_bg1._y, mc_bg1._width, mc_bg1._height);
var bg2_rct:Rectangle =
new Rectangle(mc_bg2._x, mc_bg2._y, mc_bg2._width, mc_bg2._height);
var bg3_rct:Rectangle =
new Rectangle(mc_bg3._x, mc_bg3._y, mc_bg3._width, mc_bg3._height);
//位置調整用Rectangle情報宣言

_bmd.draw(mc_bg1, new Color(mc_bg1).getTransform(),
"normal", bg1_rct, false);
_bmd.draw(mc_bg2, new Color(mc_bg2).getTransform(),
"normal", bg2_rct, false);
_bmd.draw(mc_bg3, new Color(mc_bg3).getTransform(),
"normal", bg3_rct, false);
//各子MCをBitmapに転写

mc_bg1._visible = mc_bg2._visible = mc_bg3._visible = false; //各子MCを不可視化

/*結果は、アルファ100%のベタ黒の板があるだけ*/

コメント(10)

追記

_bmd.draw(mc_bg1);

とした場合、x,y位置は0、カラートランスフォームがデフォルト状態ながらも、描画はできることが確認できました。
となると、draw()の引数設定が間違っていることになりますが、、、どこが間違っているのでしょうか。
2個目がMatrix
3個目がColorTransform

では?

public draw(source:Object, [matrix:Matrix], [colorTransform:ColorTransform], [blendMode:Object], [clipRect:Rectangle], [smooth:Boolean]) : Void
>> 2: kohimoto さん

本当ですね。Matrixの要素が抜けて、引数の順番がおかしなことになっていました。

アドバイスを元にリファレンスとにらめっこしながらコードを書いたのですが、やはり単色の板ができるのみ。

やはり引数の型か何かが間違っているのでしょうが、自分にはどこが間違っているかの判断が付きません。(Rectangleクラスの変数にtypeofかけてもObjectが返りますし、、、ってそりゃデータ型を調べるからか?)
お分かりになる方はよろしければアドバイスくださいませ。

以下ソース&構造---------------------------------------

mc_background(ここのフレームにソースを記述)
└mc_bg

import flash.display.BitmapData;
import flash.geom.ColorTransform;
import flash.geom.Matrix;
import flash.geom.Rectangle;
var _bmd:BitmapData = new BitmapData(788, 492, true, 0x00000000);
this.createEmptyMovieClip("canvas_mc", 1);
canvas_mc.attachBitmap(_bmd, 1);
var bg_mtrx:Matrix = new Matrix(0, 0, 0, 0, mc_bg._x, mc_bg._y);
var bg_cot:ColorTransform = new ColorTransform(0.5, 0.5, 0.5, 1, 0, 0, 0, 64);
_bmd.draw(mc_bg, bg_mtrx, bg_cot, "normal", _bmd.rectangle, false);
こんな感じでよいんですかね

import flash.display.BitmapData;
import flash.geom.ColorTransform;
import flash.geom.Matrix;
import flash.geom.Rectangle;
var _bmd:BitmapData = new BitmapData(788, 492, true, 0xff000000);
this.createEmptyMovieClip("canvas_mc", 1);
canvas_mc.attachBitmap(_bmd, 1);
var bg_mtrx:Matrix = new Matrix();
bg_mtrx.translate(mc_bg._x, mc_bg._y)
var bg_cot:ColorTransform = new ColorTransform(0.5, 0.5, 0.5, 1, 0, 0, 0, 64);
_bmd.draw(mc_bg, bg_mtrx, bg_cot, "normal", new Rectangle(mc_bg._x, mc_bg._y, mc_bg._width, mc_bg._height), false);
> ビットマップ画像を配置したMCを、BitmapData(以下_bmd)にdrawできるのか、です。
_____
スクリプトは、もっと単純化されたらいかがですか?

// mc_background(ここのフレームにソースを記述)
// └mc_bg
import flash.display.BitmapData;
import flash.geom.ColorTransform;
import flash.geom.Matrix;
import flash.geom.Rectangle;
var mc_bg:MovieClip;
var _bmd:BitmapData = new BitmapData(788, 492, true, 0x00000000);
this.createEmptyMovieClip("canvas_mc", 1);
canvas_mc.attachBitmap(_bmd, 1);
// var bg_mtrx:Matrix = new Matrix(0, 0, 0, 0, mc_bg._x, mc_bg._y);
// var bg_cot:ColorTransform = new ColorTransform(0.5, 0.5, 0.5, 1, 0, 0, 0, 64);
_bmd.draw(mc_bg); //, bg_mtrx, bg_cot, "normal", _bmd.rectangle, false);

私の環境では、画像イメージは、コピーできているようですけど。

参考: FLASH-japan
「loadMovieで読み込んだ画像をキャプチャーする方法について」
http://www.flash-jp.com/modules/newbb/viewtopic.php?viewmode=flat&topic_id=4781&forum=8
「FLVPlybkとBitmapData.draw」
http://www.flash-jp.com/modules/newbb/viewtopic.php?viewmode=flat&topic_id=4856&forum=6
>> 4: Kazutaka さん
アドバイスありがとうございます。頂いたソースで試したところ、うまく転写することができました。
しかし疑問なのは

var bg_mtrx:Matrix = new Matrix(0, 0, 0, 0, mc_bg._x, mc_bg._y);

と

var bg_mtrx:Matrix = new Matrix();
bg_mtrx.translate(mc_bg._x, mc_bg._y);

同じプロパティのオブジェクトになるはずなのに結果が違う(前者はどこかにすっとぶのかちゃんとフィールド上に転写されない)というのは、どういうことなんでしょうか、、、?


>> 5: Fumio さん

アドバイスありがとうございます。2番の自己レスにもあるように、省略可能なパラメータを全部省いたところ、転写できることは確認できました。

今回、マトリクスやカラー情報を持たせようとしているのは、mc_bgが親のmc_background内で移動していると同時に、高度な色設定で見た目を変更しているからです。

しかも大きい画像の上、アルファが複雑なものなので、背景アニメーションが止まったときにアルファの重ね合わせ処理による無駄な負荷を減らそうと思い、今回のような方法をとろうとしている、と言うわけです。
>> 5: Fumio さん

×:2番の自己レスにもあるように
○:1番の自己レスにもあるように

ですね。すみません。
6: ウィスキーを たくさん
>同じプロパティのオブジェクト

同じではないです。
traceすると違いがわかりますよ。
>> 8: Kazutaka

言われてみて初めてaとdの値が違っていることに気づきました。
お恥ずかしい、、、。上のレスは消しておきますorz
自分のためも含めて、まとめておきます。

今回の場合、Matrixの値をコンストラクタで宣言する際、
aとdの値を0で宣言することにより、画像の大きさが0になってしまい、転写ができない(してるはしてるけど意味がない)というものでした。

頭の悪いドツボのはまり方、ということで。一笑に付してやってください。

アドバイスくださった皆様、ありがとうございます。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

【高度】Flash Action Script 更新情報

【高度】Flash Action Scriptのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。