2017-03-06 51 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