Actionscript 3 removeChild正在删除我的所有电影剪辑
我正在制作一个工具,用方块遮住图像。我想要的是有一个弹跳的球,它击中方块并使它们消失。但是,removeChild命令不能正常工作。我将其设置为使用空电影剪辑填充图像并对其着色。但是,当我单击正方形时,我遇到了与父/子对象有关的问题。我一直遇到这个错误。“提供的DisplayObject必须是调用者的子对象。”我想不出一个好方法将eventListeners分配给每个方块。我相信这是显而易见的。这是我的密码。先谢谢你 编辑:如果我让它工作,它会删除正方形的所有实例,而不仅仅是我单击的那个实例 这是我的密码Actionscript 3 removeChild正在删除我的所有电影剪辑,actionscript-3,flash,bitmapdata,removechild,addchild,Actionscript 3,Flash,Bitmapdata,Removechild,Addchild,我正在制作一个工具,用方块遮住图像。我想要的是有一个弹跳的球,它击中方块并使它们消失。但是,removeChild命令不能正常工作。我将其设置为使用空电影剪辑填充图像并对其着色。但是,当我单击正方形时,我遇到了与父/子对象有关的问题。我一直遇到这个错误。“提供的DisplayObject必须是调用者的子对象。”我想不出一个好方法将eventListeners分配给每个方块。我相信这是显而易见的。这是我的密码。先谢谢你 编辑:如果我让它工作,它会删除正方形的所有实例,而不仅仅是我单击的那个实例 这
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);
}
}
}
var-mc:MovieClip=bgIMG;
var bd:BitmapData=新的BitmapData(mc.width,mc.height);
bd.draw(mc);
var_img:Bitmap=新位图(bd);
变量_imgNodes:Array=[];
var _tiledImg:MovieClip=container_tiled_img;
变量pad:int=0;
变量行:int=10;
var-cols:int=10;
变量零:点=新点();
创建IMGNODEGRID(行、列、垫);
像素节点(_imgNodes);
函数removeMC(e:MouseEvent)
{//删除电影剪辑
跟踪(e.currentTarget.x);
stage.removeChild(e.currentTarget.parent.parent);
}
函数pixelateNodes(节点:数组=null):无效
{
对于每个(变量节点:节点中的位图)
{
node.bitmapData.fillRect(node.bitmapData.rect,avgColor(node.bitmapData));
}
}
函数avgColor(src:BitmapData):uint
{
变量A:数值=0;
变量R:数值=0;
变量G:数值=0;
变量B:数值=0;
变量idx:Number=0;
var-px:数值;
对于(变量x:int=0;x>24&0xFF;
R+=px>>16&0xFF;
G+=px>>8&0xFF;
B+=px&0xFF;
idx++;
}
}
A/=idx;
R/=idx;
G/=idx;
B/=idx;
返回一个如果我正确地跟踪,则表示您正在尝试删除鼠标单击上的imgNode。如果是这种情况,则应将removeMC函数更改为:
function removeMC(e:MouseEvent)
{
//removes the movie clip
trace(e.target);
_tiledImg.removeChild(event.currentTarget);
}
另外,您不应该在for循环中添加侦听器,而应该将其添加到for循环之外(因为您只是将侦听器添加到_tiledImg中,而在for循环中这不会改变)。始终从正确的父循环中删除子循环的简单方法如下所示
function removeMC(e:MouseEvent)
{
//removes the movie clip
var target:Sprite = event.currentTarget as Sprite;
target.parent.removeChild(target)
}
您遇到的问题是正在将事件添加到节点的父节点(_tiledImg)
函数createImgNodeGrid(行:int=1,列:int=1,填充:Number=0):void
{
变量w:Number=_img.width/行;
变量h:数值=_img.height/cols;
变量numNodes:int=行*列;
_imgNodes=[];
变量nodeCount:int=0;
对于(变量i:int=0;i
问题是它删除了所有的方块。这是可行的,但它会删除所有方块。如果我这样做,我会被告知“1118:将静态类型对象的值隐式强制为可能不相关的类型flash.display:DisplayObject。”我尝试将其更改为_tiledImg.removeChild(event.currentTarget);它告诉我它不是调用者的孩子。非常感谢!因此,如果我想制作一个hitTest事件,我会像sprite.mouseChildren=false;sprite.addEventListener(MouseEvent.CLICK,removeMC);sprite.addEventListener(event.ENTER\u FRAME,checkHits,sprite)那样添加它,但没有最后一个参数sprite.addEventListener(Event.ENTER_FRAME,checkHits);当然,checkHits将是被调用的函数名。但我也会非常小心地在这样的循环中使用ENTER FRAME事件。我宁愿使用stage.addEventListener(Event.ENTER_FRAME,checkHits);在checkHits中,我将在那里进行测试。
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)
}