2009-07-02 15 views
1

のFlash CS4で変換を扱うとき、私は問題を抱えているを使用して....変換MovieClip.transform.matrix問題

私は私のムービークリップを回転させ、出力をトレースすると、私のムービークリップの幅も変更....

答えて

0

なぜこれが問題なのか分かりません。予想通りの動作です。クリップの幅は、左端から右端までの実際のピクセル数です。クリップが回転すると変化します。クリップ内にサブクリップがある場合、そのクリップの幅は変更されません。おそらく、回転は変化していないからです。

+0

これはFlashのバグです。 BoundingBox(記述する)は変更する必要がありますが、幅はコンテンツの実際の幅を返します。サイズは変更せず、サイズを変更しません。 – Virusescu

+0

バグは、この動作が何らかの形で誤りであることを暗示します。そうではありません。 Flashの幅と高さの意味は、スケーリング、回転などの前ではなく、実際の表示の時点を意味しています。その情報を無視するには、コンテンツを内部にスタックし、内部クリップを測定する必要があります。 –

+0

私の反応を見て、この行動が誤りだと思う理由の例を見てください。あなたが言うことから、スプライトの元のサイズを取得することはかなりの作業になります。 – Virusescu

1

これはフラッシュプレーヤーのバグです。


オプション1(おそらく最良の方法):あなたができることがいくつかあります

のMovieClipのサブクラスを作成し、幅と高さのためのgetおよびsetメソッドをオーバーライドします。 setterにsuperを呼び出してプライベート変数として値を格納させます(たとえば、_width/_height)。 getが呼び出されたら、プライベート変数を返します。 行列を使用しているので、getおよびset行列関数をオーバーライドし、新しい関数で倍率を設定し、superを呼び出す前に倍率を設定しないでください。 この動作の理由:セッターはこのバグの影響を受けません。


オプション2:

使用scaleXプロパティ/代わりに、幅/高さを取得するためとscaleY、および0回転、1.0スケールの幅と高さの値を掛け。 この動作の理由: scaleX/scaleYはこのバグの影響を受けません。


ハッピーコーディング!

+1

これはバグではありません。フラッシュプレーヤーは常にこのように働いています。 – grapefrukt

+0

http://www.gskinner.com/blog/archives/2007/08/annoying_as3_bu.html – bgw

+1

これはFlashのバグです。私が正しく思い出すと、Flash PlayerはFP8のように動作します。あるいは、それをバグと名づけたくなければ、大した混乱の変化になります。 – Virusescu

0

クリップを回転させると、幅と高さが変化します。この動作が必要ない場合は、scaleX/scaleYプロパティを代わりに使用してください。

1

OK .. MY BAD ..最終的に私のエラーを見ました:)。 これは前にバグだったと私は確信していました。 Brandenは正しかったが、私はまだかなり混乱していると思う。これは、最終的に、ブランデンが正しいことを示し、最後の2つの値の間に矛盾がないことを示す例です。

var box = new Sprite(); 
box.graphics.beginFill(0xFF0000); 
box.graphics.drawRect(0, 0, 100, 100); 
this.addChild(box); 

trace(box.width); 
box.rotation = 45; 
trace(box.width); 
box.width = 141.4; 
trace(box.width); 

編集: あなたはまだ(フラッシュCS3に - AS3) - successuly私は上記を証明したかったようなものを記述するPiPeepのリンクフォームgrantskinnerを確認したいかもしれませんが、思いhttp://www.gskinner.com/blog/archives/2007/08/annoying_as3_bu.html

1

を、私はこれが実現かなり古くなった投稿、私の謝罪は、これがフォーラムの礼儀作法を踏み台にしているのか、これまでに何かを破っているのでしょうか。しかし、これはかなり簡単な問題のためのGoogleの検索の最初の結果であり、実際に表示されていない幅や高さの表示オブジェクトを検索するためのまともな方法を提供していないようです。

問題は、幅と高さを尋ねることによって、オブジェクトのグローバル境界を取得しているように見えます。ローカル境界が必要なときに、これを行う方法です。(全体をコピー&ペーストするだけです私が何を意味するかを見るためにコンパイルしてください)。

import flash.display.Sprite; 

var spr=new Sprite() 
spr.graphics.beginFill(0xff0000); 
spr.graphics.drawRect(-25,-100,50,200); 
addChild(spr); 

spr.y=150 
spr.x=300 
function myOEF(e) 
{ 
    spr.rotation++ 
    trace(spr.width,spr.height); 
    var bounds=spr.getBounds(this) 
    trace("A: Global bounds: "+bounds); 
    var bounds=spr.getBounds(spr) 
    trace("B: Local bounds: "+bounds); 
} 

addEventListener("enterFrame",myOEF); 
+0

良い回答はいつでも歓迎します –