2017-03-06 57 views
4

我知道您使用graphics.clear清除了所有图形,但清除了舞台上的图形,我想清除特定像素中的图形或xy值之间我该怎么做?AS3:如何清除特定像素/区域中的图形

+0

图形只是数字(矢量/形状点)。您只能清除位图中的像素。使用图形(矢量)的容器(sprite/MC)上的'draw'来获得位图快照,然后你可以简单地使用'setPixel'来设置一个“清除”彩色像素。 –

回答

7

有没有办法做到这一点与图形。我只是尝试,绘制透明的形状不会造成漏洞,唉。

你应该有你的图形转换成位图实例和工作与像素:

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); 
     } 
    } 
} 
5

做到这将是with a mask的方式。使用alpha蒙版(蒙版和maskee使用cacheAsBitmap=true),您可以在蒙版上绘制透明像素以擦除零件。其基本做法是:

  1. 将要在一个共同的容器(掩码来实现你所有的图形,如果你的意思是为一切被削减,那么他们已经在一个共同的容器:stageroot时间轴。)

  2. 绘制一个位图数据对象,该对象在要擦除的区域中有一个透明的“孔”。例如:

    // 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. 将容器的.mask property。例如,为了掩盖整个主时间轴:

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

开放堆栈溢出来回答一些问题,认为明年每小时约孔的放置在奶酪... :)

你可以还设置blendMode孔对象的属性为BlendMode.ERASEcacheAsBitmap的组合。这与面具类似,除非你实际上是画整体而不是外面的区域。 下面是一个例子:

//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(); 
} 

结果会是这样的事情:

enter image description here

编辑:

原来你并不需要,如果你使用cacheAsBitmap设置父对象的混合模式为LAYER(doc说它应该被自动设置...) 所以你可以使用cheese.blendMode = BlendMode.LAYER;而不是cheese.cacheAsBitmap = true;。如果我没有记错,面具也不需要cahceAsBitmap,即使是NORMAL混合模式。

+0

这个想法是惊人的伟大!唯一让我担心的是,它是否会在同一个DisplayObjectContainer中将空洞切割到舞台上或者仅在底层的兄弟姐妹中? – Organis

+1

它只能切割容器中的孔。另外请注意,你的'hole'对象必须是这个容器中的最后一个孩子 –

+0

不错的选择,我忘了'ERASE' blendmode ... – Aaron