0

addChild(movieclip)を実行した場合とまったく同じように見えるように、MovieClipをBitmapDataに描画しようとしています。

アニメーションを原点の周りに配置するために使用する必要のある魔法の公式がわからないようです。

これは関連するコードです。

private function update(e:Event):void
{
    var bounds:Rectangle = movieClip.getBounds(movieClip);
    bitmapData = new BitmapData(maxMCwidth, maxMCheight, true, 0x0);
    bitmapData.draw(movieClip, new Matrix(1, 0, 0, 1, maxMCwidth - (bounds.x + bounds.width), maxMCheight - (bounds.y + bounds.height)));
    bitmap.bitmapData = bitmapData;
}

ここに完全なコード:http://pastebin.com/KyU5FPeJ

そして、これは結果がどのように見えるかです:

http://www.swfcabin.com/open/1339173476

一番上のアニメーションはaddChild(mc)を使用して行われます。下のアニメーションはbitmapData.drawを使用して行われます。下のバージョンでは、右側の剣が水平方向に移動しないことに注意してください。まるでアニメーション全体が右揃えになっているようです。

誰かがそれをいじりたい場合に備えて、完全なコードを含む私のflashdevelopプロジェクトへのリンクもあります:https ://www.dropbox.com/s/gvt4scknqdian2a/bitmapdatadrawing.zip

両方のバージョンを同じように見せたいだけです。これを実現するには、bitmapData描画コードに何を変更する必要がありますか?

4

2 に答える 2

1

わかりました!

問題の原因は、maxMCwidthまたはmaxMCheightを正しく計算していないことでした。ムービークリップを調べて、最も幅の広い/最も高いシングルフレームを探していました。ただし、フレーム間の境界の位置が変更されることは考慮されていません。アニメーション全体の実際の最大幅/高さを取得するために、次のコードを使用しました。

maxBounds = new Rectangle();
for (var i:uint = 0; i < movieClip.totalFrames; i++)
{
    var tempBounds:Rectangle = movieClip.getBounds(movieClip);
    maxBounds = maxBounds.union(tempBounds); 
    movieClip.nextFrame();
}

次に、これにより、変換行列を修正できました。

bitmapData.draw(movieClip, new Matrix(1, 0, 0, 1, -maxBounds.x, -maxBounds.y));

そして、このように、私がテストしたすべてのアニメーションで機能します。

于 2012-06-08T19:34:34.393 に答える
0

メインのmxmlを指定しなかったため、プロジェクトを実行できません。
しかし、私はあなたの問題を見つけたと思います。
getBoundsがあなたが思っている値を返しているとは思いません。
スケルトンswcを調べることはできませんが、画面の上部または下部からオブジェクトがあり、コーディング方法によって縮小してフィットするように感じます。
getBoundsはおそらくそれを高さに追加しています。

bitmapData = new BitmapData(movieClip.width, movieClip.height, true, 0x0);
bitmapData.draw(movieClip, new Matrix(1, 0, 0, 1, movieClip.width/2, movieClip.height/2 )); 
bitmap = new Bitmap(bitmapData);
bitmap.x = 70;
bitmap.y = 200;

ここでテストされていないコードを覚えておいてください。:(

于 2012-06-08T18:57:30.073 に答える