actionscript 3 AS3: ¿Cómo elimino los gráficos en un píxel/área específica?




actionscript-3 graphics (3)

Sé que utiliza graphics.clear para borrar todos los gráficos, pero eso borra los gráficos del escenario, me gustaría borrar los gráficos en un píxel (s) específico o entre un valor xy ¿cómo puedo hacer eso?


Desbordamiento de pila abierta para responder algunas preguntas, piense por la próxima hora sobre cómo se colocan los agujeros en el queso ... :)

También puede establecer la propiedad blendMode de su objeto hole en BlendMode.ERASE en combinación con cacheAsBitmap . Esto funciona de manera similar a las máscaras, excepto que en realidad estarás dibujando todos los detalles y no el área que está fuera de ellos. Aquí hay un ejemplo:

//make cheese
var cheese:Sprite = new Sprite();
cheese.cacheAsBitmap = true;
stage.addChild(cheese);
cheese.x = cheese.y = 10;

//define holes 
var holes:Shape = new Shape();
holes.blendMode = BlendMode.ERASE;
cheese.addChild(holes);

//draw cheese
var g = cheese.graphics;
g.beginFill(0xFFCC00);
g.drawRect(0,0,200,150);

//**Attack chees with mices.
g = holes.graphics;
for (var i:int = 0; i < 10; i++){
    g.beginFill(0xFF00FF);
    var hx = Math.random()*(cheese.width-7)+7;
    var hy = Math.random()*(cheese.height-7)+7;
    var s = Math.random()*15;
    g.drawCircle(hx, hy, s);
    g.endFill();
}

El resultado sería algo así:

editar:

Resulta que no necesita usar cacheAsBitmap si establece el modo de fusión del objeto primario en LAYER (el documento dice que debe establecerse automáticamente ...) Para que pueda usar cheese.blendMode = BlendMode.LAYER; en lugar de cheese.cacheAsBitmap = true; . Y si cahceAsBitmap no recuerdo, las máscaras tampoco requieren cahceAsBitmap , incluso con el modo de fusión NORMAL .


No hay forma de hacer eso con gráficos. Lo intenté, dibujar formas transparentes no crea agujeros, ¡ay!

Debe convertir los gráficos que tiene en la instancia de Bitmap y trabajar con píxeles:

package
{
    import flash.geom.Matrix;
    import flash.geom.Rectangle;

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

    public class Holey extends Sprite
    {
        public function Holey() 
        {
            super();

            // Lets create some example graphics.
            graphics.beginFill(0x990000);
            graphics.drawCircle(200, 200, 100);
            graphics.endFill();

            // Convert into raster and make 1 pixel transparent.
            var aBit:Bitmap = rasterize(this);
            aBit.bitmapData.setPixel32(50, 50, 0x00000000);

            graphics.clear();
            addChild(aBit);
        }

        private function rasterize(source:DisplayObject):Bitmap
        {
            // Obtain bounds of the graphics.
            var aBounds:Rectangle = source.getBounds(source);

            // Create raster of appropriate size.
            var aRaster:BitmapData = new BitmapData(aBounds.width, aBounds.height, true, 0x00000000);

            // Make an offset to capture all the graphics.
            var aMatrix:Matrix = new Matrix;
            aMatrix.translate(-aBounds.left, -aBounds.top);

            aRaster.draw(source, aMatrix);
            return new Bitmap(aRaster);
        }
    }
}

La forma de hacer esto sería con una mask . Usando una máscara alfa (tanto máscara como maskee usan cacheAsBitmap=true ) puede dibujar píxeles transparentes en la máscara para borrar partes. El enfoque básico sería:

  1. Coloque todos los gráficos que desea que se apliquen con la máscara en un contenedor común (si quiere decir que todo se cortará, entonces ya están en un contenedor común: la línea de tiempo de la stage o root ).

  2. Dibuje un objeto de datos de mapa de bits que tenga un "agujero" transparente en el área que desea borrar. Por ejemplo:

    // fill the stage with a solid rectangle
    var maskBitmapData:BitmapData = new BitmapData(stage.stageWidth, stage.stageHeight, true, 0xff000000);
    // erase part of it by drawing transparent pixels
    maskBitmapData.fillRect(new Rectangle(20, 20, 200, 100), 0);
    
    // create the mask object
    var maskBitmap:Bitmap = new Bitmap(maskBitmapData);
    maskBitmap.cacheAsBitmap = true; // this makes the mask an alpha mask
    addChild(maskBitmap);
  3. Establezca la propiedad .mask del contenedor. Por ejemplo, para enmascarar toda la línea de tiempo principal:

    root.cacheAsBitmap = true; // this makes the mask an alpha mask
    root.mask = maskBitmap;