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




actionscript-3 graphics (2)

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 .

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?


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;