рисовать спрайт в растровые данные со странной маской

Я столкнулся со странным поведением при рисовании спрайта в BitmapData. Этот спрайт отлично выглядит, когда он отрисовывается прямо на экране. Но когда этот спрайт рисуется в BitmapData, спрайт маскируется... но к этому спрайту не применяется такая маска!

Эту «плохую маску» можно включать и выключать... применяя/не применяя другую маску к спрайту, который я рисую. Эта маска не имеет той же формы или расположения, что и «плохая маска».

замещающий текст http://img5.imageshack.us/img5/8310/masked.png< /а>

Интересно, я что-то не так делаю или это баг? Я добавляю маски способом, описанным в документации< /а>. Похоже, что «плохая маска» получает свои координаты из положения спрайта, который я рисую (drawingSprite), относительно его родителей.


package
{

import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;

import mx.core.UIComponent;

public class tmpa extends UIComponent
{

    public function tmpa( ):void
    {   var topSprite:Sprite = new Sprite();
        topSprite.x = 0;
        topSprite.y = 0;
        addChild( topSprite );

        var canvasSprite:Sprite = new Sprite();
        canvasSprite.x = 5;
        canvasSprite.y = 35;
        topSprite.addChild( canvasSprite );

        var drawingSprite:Sprite = new Sprite();
        canvasSprite.addChild( drawingSprite );

        var maskSp:Sprite = new Sprite();
        maskSp.graphics.beginFill( 0xFFFFFF, 1 );
        maskSp.graphics.drawRect( 0, 0, 200, 200 );
        maskSp.graphics.endFill();

        //toggle these two lines of code
        canvasSprite.addChild( maskSp );
        drawingSprite.mask = maskSp;

        drawingSprite.graphics.beginFill( 0xFF0000, 1 );
        drawingSprite.graphics.drawRect( 0, 0, 200, 200 );
        drawingSprite.graphics.endFill();

        drawingSprite.graphics.beginFill( 0x00FF00, 1 );
        drawingSprite.graphics.drawCircle( 0, 0, 100 );
        drawingSprite.graphics.endFill();


        //a snapshot with default blue background
        var bmd:BitmapData = new BitmapData( 100, 100, false, 0x0000FF );
        bmd.draw( drawingSprite );
        var bm:Bitmap = new Bitmap( bmd );
        bm.x = 300;
        bm.y = 35;
        addChild( bm );
    }

}
}

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:a="*" width="100%" height="100%">
    <a:tmpa id="t" width="100%" height="100%" x="0" y="0" left="0" top="0"/>
</mx:Application>

person jedierikb    schedule 14.04.2009    source источник


Ответы (1)


Изменение маски добавления строк на:

canvasSprite.addChild( maskSp );
canvasSprite.mask = maskSp;

Решает проблему, поэтому, вероятно, есть некоторая путаница с относительными координатными пространствами клипов. Я думаю, вы должны держать свою маску на том же уровне, что и ваш замаскированный DisplayObject в вашем списке отображения, чтобы избежать путаницы.

person grapefrukt    schedule 14.04.2009
comment
Спасибо! Я смоделировал свой код по образцу маски в API, который выглядит немного глючным при изменении, как в моем примере. - person jedierikb; 15.04.2009