2012-10-31 49 views
0

我正在製作一個工具,使用正方形遮蓋圖像。我想要發生的是有一個彈跳球擊中廣場,使他們消失。但是,removeChild命令不能正常工作。我將它設置爲用空影片剪輯填充圖像並着色它們。然而,當我點擊廣場時,我遇到了父母/孩子的問題。我一直在遇到這個錯誤。 「提供的DisplayObject必須是調用者的孩子。」我想不出一種很好的方法來將eventListeners分配給每個方格。我相信這很明顯。這是我的代碼。提前謝謝你removeChild正在刪除我所有的電影剪輯

編輯:如果我得到它的工作,它刪除廣場的所有實例,而不僅僅是我單擊的一個。

這裏是我的代碼

var mc:MovieClip = bgIMG; 
var bd:BitmapData = new BitmapData(mc.width,mc.height); 
bd.draw(mc); 

var _img:Bitmap = new Bitmap(bd); 
var _imgNodes:Array = []; 
var _tiledImg:MovieClip = container_tiled_img; 

var pad:int = 0; 
var rows:int = 10; 
var cols:int = 10; 
var zero:Point = new Point(); 

createImgNodeGrid(rows, cols, pad); 
pixelateNodes(_imgNodes); 



function removeMC(e:MouseEvent) 
{//removes the movie clip 
trace(e.currentTarget.x); 
stage.removeChild(e.currentTarget.parent.parent); 
} 


function pixelateNodes(nodes:Array = null):void 
{ 
for each (var node:Bitmap in nodes) 
{ 
    node.bitmapData.fillRect(node.bitmapData.rect, avgColor(node.bitmapData)); 

} 
} 

function avgColor(src:BitmapData):uint 
{ 
var A:Number = 0; 
var R:Number = 0; 
var G:Number = 0; 
var B:Number = 0; 

var idx:Number = 0; 
var px:Number; 

for (var x:int = 0; x < src.width; x++) 
{ 
    for (var y:int = 0; y < src.height; y++) 
    { 
     px = src.getPixel32(x,y); 

     A += px >> 24 & 0xFF; 
     R += px >> 16 & 0xFF; 
     G += px >> 8 & 0xFF; 
     B += px & 0xFF; 

     idx++; 
    } 
} 

A /= idx; 
R /= idx; 
G /= idx; 
B /= idx; 

return A << 24 | R << 16 | G << 8 | B; 
} 


function createImgNodeGrid(rows:int = 1, cols:int = 1, pad:Number = 0):void 
{ 
var w:Number = _img.width/rows; 
var h:Number = _img.height/cols; 
var numNodes:int = rows * cols; 

_imgNodes = []; 

var nodeCount:int = 0; 
for (var i:int = 0; i < rows; i++) 
{ 
    for (var j:int = 0; j < cols; j++) 
    { 
     // get area of current image node 
     var sourceRect:Rectangle = new Rectangle(i * w, j * h, w, h); 

     // copy bitmap data of current image node 
     var tempBd:BitmapData = new BitmapData(w,h,true); 
     tempBd.copyPixels(_img.bitmapData, sourceRect, zero); 

     // place image node bitmap data into sprite 
     var imgNode:Bitmap = new Bitmap(tempBd); 
     imgNode.x = i * (w + pad); 
     imgNode.y = j * (h + pad); 

     // store each image node 
     //_imgNodes.push(imgNode); 
     _imgNodes[nodeCount++] = imgNode; 

     // add each image node to the stage 
     _tiledImg.addChild(imgNode); 
     _tiledImg.addEventListener(MouseEvent.CLICK,removeMC); 
    } 
} 
} 

回答

0

你必須是你所添加的事件節點(_tiledImg)的父母的問題。

function createImgNodeGrid(rows:int = 1, cols:int = 1, pad:Number = 0):void 
{ 
    var w:Number = _img.width/rows; 
    var h:Number = _img.height/cols; 
    var numNodes:int = rows * cols; 

    _imgNodes = []; 

    var nodeCount:int = 0; 
    for (var i:int = 0; i < rows; i++) 
    { 
    for (var j:int = 0; j < cols; j++) 
    { 
     // get area of current image node 
     var sourceRect:Rectangle = new Rectangle(i * w, j * h, w, h); 

     // copy bitmap data of current image node 
     var tempBd:BitmapData = new BitmapData(w,h,true); 
     tempBd.copyPixels(_img.bitmapData, sourceRect, zero); 

     // place image node bitmap data into sprite 
     var imgNode:Bitmap = new Bitmap(tempBd); 
     imgNode.x = i * (w + pad); 
     imgNode.y = j * (h + pad); 

     // store each image node 
     //_imgNodes.push(imgNode); 
     _imgNodes[nodeCount++] = imgNode; 


     // you need a container since you can not attach event listeners to a BitMap 
     var sprite:Sprite = new Sprite() 
     sprite.mouseChildren = false; 
     sprite.addEventListener(MouseEvent.CLICK,removeMC); 
     sprite.addChild(imgNode); 


     // add each image node to the stage 
     _tiledImg.addChild(sprite); 
     // _tiledImg.addEventListener(MouseEvent.CLICK,removeMC); 
    } 
    } 
} 

function removeMC(e:MouseEvent) 
{ 
    var target:Sprite = event.currentTarget as Sprite; 
    target.parent.removeChild(target) 
} 
+0

非常感謝!因此,如果我想進行hitTest事件,我會添加它像 sprite.mouseChildren = false; \t \t \t sprite.addEventListener(MouseEvent.CLICK,removeMC); \t \t \t sprite.addEventListener(Event.ENTER_FRAME,checkHits,sprite); –

+0

,但沒有最後一個參數sprite.addEventListener(Event.ENTER_FRAME,checkHits);當然checkHits會被調用的函數名稱。但我也會非常小心地在這樣的循環內使用enter frame事件。我寧願做stage.addEventListener(Event.ENTER_FRAME,checkHits);在checkHits裏面我會在那裏做測試。 –

0

如果我正確之後,您要在鼠標點擊刪除imgNode。如果是這樣的話,你應該改變removeMC功能如下:

function removeMC(e:MouseEvent) 
{ 
    //removes the movie clip 
    trace(e.target); 
    _tiledImg.removeChild(event.currentTarget); 
} 

而且,你不應該內添加監聽for循環,而是將其添加外部for循環(因爲你是剛剛加入_tiledImg的監聽器,並且在for循環中不會更改)。

+0

如果我這樣做,我會被告知「1118:隱式強制將靜態類型爲Object的值轉換爲可能不相關的類型flash.display:DisplayObject」。我嘗試將其更改爲 _tiledImg.removeChild(event.currentTarget); 它告訴我,它不是調用者的孩子。 –

0

一個簡單的方法來總是從右邊父刪除子是做如下

function removeMC(e:MouseEvent) 
{ 
    //removes the movie clip 
    var target:Sprite = event.currentTarget as Sprite; 
    target.parent.removeChild(target) 
} 
+0

問題是它正在刪除所有的正方形。這有效,但它擺脫了所有這些。 –