位置や透明度などを考慮して、ActionScript で別のベクトル オブジェクトの特定の位置に適切に描画するにはどうすればよいですか?
私のアイデア (たとえばここで提案されているようにbeginBitmapFill
) を () と() を使用して、1 つのムービークリップdrawRect
のビットマップ コピー (() を使用して作成) を に描画することでした。他の MovieClip のプロパティですが、主に次の理由から、これは思ったより難しいことがわかりました。BitmapData.draw
graphics
透明度は保持されません: ソース MovieClip が透明な場合、ターゲット Graphics は白になります。を使用してみました問題は、BlendMode
が、役に立ちません。白いピクセルが実際に BitmapData にコピーされているようです。何かが欠けているに違いないのですが、何がわかりません。BitmapData
コンストラクターのドキュメントが間違っていることだったようです: 透明度のデフォルトはtrueではなく、 falseです。したがって、new BitmapData(x, y, true)
透明度を作成すると保持されますが、そうでない場合は保持されません。ポジショニング。ソース MovieClip が中央に配置されている場合 (中心が (0, 0) の場合、BitmapData にコピーするときに Matrix を適用して移動する必要があります。そうしないと、ビットマップにはソース MovieClip の右下のみが含まれます。方法を理解する移動するのは非常に難しく、どうにかして境界を取得する必要があると思います (ソース オブジェクトがキャンバス内で完全に中央に配置されている場合は、もちろん、幅と高さの半分だけオフセットすることができます)。
beginBitmapFill
タイリング。drawRect
() を (0, 0) から開始しないと、ビットマップの塗りつぶしもビットマップ内の (0, 0) から開始されないようです。これは、描画を開始する場所に基づいて、ソース ビットマップをもう一度シフトする必要があることを意味します。
(次に、lineStyle(0,0,0) にする必要があるような他のものがあるため、drawRect() は境界線などを描画しません。)
このトリッキーな問題はすべて、私がこれを間違った方法で行っていると信じさせてくれます。これを行う簡単な方法はありますか?私を助けることができる図書館はどこかにありますか?誰もこれを成功させましたか?おそらく、私の描画キャンバスはスプライトではなくビットマップであるべきですか? lineTo
しかし、 () などを使用して描画する方法がわかりません。
状況は次のとおりです。.graphics を使用して、lineTo() などを使用して描画するスプライトがあります。描画時に MovieClip をブラシとして使用したい (または描画面に別の MovieClip のコピーを配置するだけ)。他のムービークリップを最初のグラフィックの一部にします。addChild
ベクトル グラフィックスが描画されたグラフィックスと相互作用しないため、()はできません。
EDIT : Theoは、Graphics サーフェスに描画される DisplayObject に適用される回転とスケーリングを適用しないという事実を除いて、完全に機能する実用的なソリューションを提供しました。これはテオの解決策です:
private function drawOntoGraphics(source : IBitmapDrawable, target : Graphics, position : Point = null) : void
{
position = position == null ? new Point() : position;
var bounds : Rectangle = DisplayObject(source).getBounds(DisplayObject(source));
var bitmapData : BitmapData = new BitmapData(bounds.width, bounds.height, true, 0x00000000);
bitmapData.draw(source, new Matrix(1, 0, 0, 1, -bounds.x, -bounds.y), null, null, null, true);
target.beginBitmapFill(bitmapData, new Matrix(1, 0, 0, 1, bounds.x + position.x, bounds.y + position.y));
target.drawRect(bounds.x + position.x, bounds.y + position.y, bounds.width, bounds.height);
}
回転とスケーリングをサポートするには、以下を変更する必要があると思います。
- で使用
Matrix
されるdraw()
は、ソースからスケーリングと回転をコピーする必要がありますDisplayObject
か? - で使用
Matrix
される は、beginBitmapFill()
このスケーリングと回転もコピーする必要がありますか? それとも、「二重」のスケーリングと回転が作成されるのでしょうか? - 座標は
drawRect()
、スケーリングおよび回転されたサイズに合わせて変更する必要がありDisplayObject
ますか? どの手段getBounds()
が正確ではないでしょうか?
編集:これは、すべてのフィードバックから作成された、スケーリングと回転をサポートする実用的な実装です:
static function DrawOntoGraphics(source:MovieClip, target:Graphics,
position:Point = null):void {
var sourceClass:Class = getDefinitionByName(getQualifiedClassName(source))
as Class;
var sourceCopy:MovieClip = new sourceClass();
sourceCopy.rotation = source.rotation;
sourceCopy.scaleX = source.scaleX;
sourceCopy.scaleY = source.scaleY;
sourceCopy.graphics.clear();
var placeholder:MovieClip = new MovieClip();
placeholder.addChild(sourceCopy);
if (!position)
position = new Point();
var bounds:Rectangle = placeholder.getBounds(placeholder);
var bitmapData:BitmapData = new BitmapData(bounds.width, bounds.height,
true, 0x00000000);
var drawMatrix:Matrix = new Matrix(1, 0, 0, 1, -bounds.x, -bounds.y);
bitmapData.draw(placeholder, drawMatrix);
placeholder.removeChild(sourceCopy);
var fillMatrix:Matrix = new Matrix(1, 0, 0, 1, bounds.x + position.x,
bounds.y + position.y);
target.beginBitmapFill(bitmapData, fillMatrix);
target.lineStyle(0, 0x00000000, 0);
target.drawRect(bounds.x + position.x, bounds.y + position.y,
bounds.width, bounds.height);
target.endFill();
}
やや関連しているがそれほどホットではない質問: Flex 3 のグラフィックスに画像 (PNG など) を配置する方法は?