0

外部に画像(jpg)が読み込まれたMCがあります。

次のレイヤーはマスクされたスプライトで、graphics.lineStyleを使用してさまざまな色や不透明度などで線を描画しています。すべてがうまく機能しているので、画像や図面を見ることができます。今度は消しゴムを作って、既存の線を「消す」ような(透明な)線を作ろうとしています。

たとえば、(マウスで)赤い線を引いてから、色を黄色に切り替えて、前の線とある点で交差すると、問題ありません。黄色が表示されます。今、私は「透明な」色を作る方法がわかりませんか?したがって、マウスを既存の図面の上に移動すると、背景画像の一部が再び表示されます。1色の背景を設定すると、すべて問題ありませんが、画像があり、エンドイレーサーに色が残っているため、透明にする必要があります。ブレンドモードを試し、bmpとしてキャッシュしました。私が見つけたものはすべてありますが、それでも解決策はありません。

4

1 に答える 1

4

画像をオーバーレイするグラフィックスオブジェクトを使用しているようです。何かを消去するには、ブレンドモードとしてBlendMode.ERASEを持つ最上位の形状をスプライトに指定し、色のアルファ成分が0xFFである状態で描画する必要があります。スプライトのblendModeはBlendMode.LAYERである必要があります。試してみるテストは次のとおりです。

public class TestErase extends Sprite 
{
    public function TestErase() {
        var b:Sprite = new Sprite();
        var c:Shape = new Shape();
        b.blendMode = BlendMode.LAYER;
        c.blendMode = flash.display.BlendMode.ERASE;
        c.graphics.beginFill(0, 1);
        c.graphics.drawRect(50, 50, 50, 50);
        c.graphics.endFill();
        b.graphics.beginFill(0xff0000, 1);
        b.graphics.drawRect(0, 0, 150, 150);
        b.graphics.endFill();
        b.addChild(c);
        addChild(b);
        this.graphics.beginFill(0x00c000, 1);
        graphics.drawRect(75, 75, 100, 100);
        graphics.endFill();

    }
}

これにより、「b」スプライトの「c」スプライトで定義される50x50の穴が作成され、「this」スプライトには影響しません。

さて、あなたは例を求めました。ここ。

public class Main extends Sprite 
{
    public var sh:Shape;
    public var drawing:Boolean;
    public var sp:Sprite;
    public var bd:BitmapData;
    public var erasing:Boolean;
    [Embed(source = '../lib/093.jpg')]
    public static const Background:Class;

    public function Main():void 
    {
        if (stage) init();
        else addEventListener(Event.ADDED_TO_STAGE, init);
    }

    private function init(e:Event = null):void 
    {
        removeEventListener(Event.ADDED_TO_STAGE, init);
        // entry point
        var ba:Bitmap = new Background();
        ba.scaleX = 0.5;
        ba.scaleY = 0.5;
        addChild(ba);
        bd = new BitmapData(640, 400, true, 0);
        var bm:Bitmap = new Bitmap(bd);
        sp = new Sprite();
        sp.addChild(bm);
        sp.blendMode = BlendMode.LAYER;
        var tf:TextField = new TextField();
        tf.y = 401;
        tf.background = true;
        tf.backgroundColor = 0x0;
        tf.defaultTextFormat = new TextFormat('Arial', 12, 0xe00000, true, false, false);
        tf.selectable = false;
        tf.text = 'Erase';
        addChild(tf);
        addChild(sp);
        tf.addEventListener(MouseEvent.CLICK, toggleErasing);
        sp.addEventListener(MouseEvent.MOUSE_DOWN, startDrawing);
        sp.addEventListener(MouseEvent.ROLL_OUT, endDrawing);
        sp.addEventListener(MouseEvent.MOUSE_UP, endDrawing);
    }

    private function toggleErasing(e:MouseEvent):void {
        erasing = !erasing;
        if (erasing) (e.currentTarget as TextField).text = 'Erasing...'; else (e.currentTarget as TextField).text = 'Erase';
        e.stopPropagation();
    }
    private function startDrawing(e:MouseEvent):void {
        if (drawing) return;
        sh = new Shape();
        sh.graphics.lineStyle(3, Math.floor(Math.random() * 0x100000), 1,true);
        if (erasing) sh.blendMode = BlendMode.ERASE;
        sh.graphics.moveTo(e.localX, e.localY);
        addEventListener(MouseEvent.MOUSE_MOVE, trackMouse);
        sp.addChild(sh);
        drawing = true;
    }
    private function endDrawing(e:MouseEvent):void {
        if (!drawing) return;
        removeEventListener(MouseEvent.MOUSE_MOVE, trackMouse);
        if (erasing) bd.draw(sh, null, null, BlendMode.ERASE); 
        else  bd.draw(sh);
        sp.removeChild(sh);
        sh = null;
        drawing = false;
    }
    private function trackMouse(e:MouseEvent):void {
        sh.graphics.lineTo(e.localX, e.localY);
    }

}

私がテストしたので、そのまま動作するはずです。背景を変更するだけです:)

于 2012-08-27T14:00:42.720 に答える