1

ステージ上でドラッグアンドドロップするスプライトを作成しました。スプライトはマスクされており、子としてマスクされているため、スプライトもスプライトと一緒にドラッグされます。スプライトにドロップシャドウフィルターを追加するまで、すべてが正常に機能します。ドロップシャドウが追加された場合、ステージに追加されたときのスプライトの元の場所内でマウスイベントが発生した場合にのみ、マウスダウンでドラッグし、マウスアップでスプライトをドロップできます。

この問題を解決するにはどうすればよいですか?これは10.1の問題でしょうか?そうでなければ、私は何を間違っているのですか?

var thumbMask:Sprite = new Sprite();
thumbMask.graphics.beginFill(0, 1);
thumbMask.graphics.drawRoundRect(0, 0, 100, 75, 25, 25);
thumbMask.graphics.endFill();

var thumb:Sprite = new Sprite();
thumb.graphics.beginFill(0x0000FF, 1);
thumb.graphics.drawRect(0, 0, 100, 75);
thumb.graphics.endFill();

thumb.addEventListener(MouseEvent.MOUSE_DOWN, drag);
thumb.addEventListener(MouseEvent.MOUSE_UP, drop);

thumb.filters = [new DropShadowFilter(0, 0, 0, 1, 20, 20, 1.0, 3)];

thumb.addChild(thumbMask);
thumb.mask = thumbMask;
addChild(thumb)

function drag(evt:MouseEvent):void
    {
    evt.target.startDrag();
    trace("drag");
    }

function drop(evt:MouseEvent):void
    {
    evt.target.stopDrag();
    trace("drop");
    }

----------------更新されたソリューション----------------

バイナリの提案のおかげで、この問題はcacheAsBitmapを使用して解決されます。ただし、すでにドロップシャドウが適用されているマスクされたサムスプライトを収容していたコンテナにcacheAsBitmapを適用すると、マウスイベントが期待どおりに機能しませんでした。ドキュメントを読んだ後、スプライトにフィルターを追加すると、そのスプライトのcacheAsBitmapプロパティが自動的にアクティブ化されることを学びました。

cacheAsBitmapプロパティは、表示オブジェクトにフィルターを適用するたびに(フィルター配列が空でない場合)自動的にtrueに設定され、表示オブジェクトにフィルターが適用されている場合、cacheAsBitmapはその表示オブジェクトに対してtrueとして報告されます。プロパティをfalseに設定した場合。表示オブジェクトのすべてのフィルターをクリアすると、cacheAsBitmap設定が最後に設定されたものに変更されます。1

したがって、エラーは同じコンテナスプライト内に2つのcacheAsBitmapプロパティがあることが原因であると思います。したがって、この状況では、マスクされたサムスプライトではなく、単にフィルターをコンテナーに追加しました。

var thumbMask:Sprite = new Sprite();
thumbMask.graphics.beginFill(0, 1);
thumbMask.graphics.drawRoundRect(0, 0, 100, 75, 25, 25);
thumbMask.graphics.endFill();

var thumb:Sprite = new Sprite();
thumb.graphics.beginFill(0x0000FF, 1);
thumb.graphics.drawRect(0, 0, 100, 75);
thumb.graphics.endFill();

thumb.addChild(thumbMask);
thumb.mask = thumbMask;

var container: Sprite = new Sprite();
container.addChild(thumb);
container.filters = [new DropShadowFilter(0, 0, 0, 1, 20, 20, 1.0, 3)];

//if there is no filters applied or if the filters array is empty, use:
//container.cacheAsBitmap = true;

addChild(container);

container.addEventListener(MouseEvent.MOUSE_DOWN, drag);
container.addEventListener(MouseEvent.MOUSE_UP, drop);

function drag(evt:MouseEvent):void
    {
    evt.target.startDrag();
    trace("drag");
    }

function drop(evt:MouseEvent):void
    {
    evt.target.stopDrag();
    trace("--DROP");
    }
4

1 に答える 1

1

thumbクリップをコンテナにラップすることで、これを回避することもできます。イベント処理に設定cacheAsBitmapして調整します。true

    thumb.filters = [new DropShadowFilter(0, 0, 0, 1, 20, 20, 1.0, 3)];

//  thumb.addEventListener(MouseEvent.MOUSE_DOWN, drag);
//  thumb.addEventListener(MouseEvent.MOUSE_UP, drop);

var cont: Sprite = new Sprite();
    cont.addChild(thumb);
    cont.cacheAsBitmap = true;
    cont.addEventListener(MouseEvent.MOUSE_DOWN, drag);
    cont.addEventListener(MouseEvent.MOUSE_UP, drop);

    addChild(cont);

したがって、ドロップシャドウの2番目のスプライトを処理する必要はないかもしれません。これがお役に立てば幸いです。

于 2010-06-14T21:14:03.690 に答える