2012-10-31 20 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

问题是它正在删除所有的正方形。这有效,但它摆脱了所有这些。 –