【问题标题】:removeChild is removing all my Movie clipsremoveChild 正在删除我所有的电影剪辑
【发布时间】:2012-11-01 02:40:49
【问题描述】:

我正在制作一个工具,它可以用正方形遮挡图像。我想要发生的是有一个弹跳球,它击中方块并使它们消失。但是,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);
    }
}
 }

【问题讨论】:

    标签: actionscript-3 flash bitmapdata removechild addchild


    【解决方案1】:

    您遇到的问题是您正在将事件添加到节点的父节点(_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)
    }
    

    【讨论】:

    • 非常感谢!所以如果我想做一个 hitTest 事件,我会像 sprite.mouseChildren = false; 这样添加它。 sprite.addEventListener(MouseEvent.CLICK,removeMC); sprite.addEventListener(Event.ENTER_FRAME,checkHits,sprite);
    • 完全正确但没有最后一个参数 sprite.addEventListener(Event.ENTER_FRAME,checkHits);当然 checkHits 将是被调用的函数名。但我也会非常小心在这样的循环中使用输入帧事件。我宁愿做 stage.addEventListener(Event.ENTER_FRAME,checkHits);在 checkHits 里面我会在那里进行测试。
    【解决方案2】:

    如果我的操作正确,您正在尝试删除 MouseClick 上的 imgNode。如果是这种情况,您应该将 removeMC 函数更改为:

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

    此外,您不应在 for 循环中添加侦听器,而应将其添加到 for 循环之外(因为您只是将侦听器添加到 _tiledImg 并且在 for 循环中不会改变)。

    【讨论】:

    • 如果我这样做,我会被告知“1118:将静态类型 Object 的值隐式强制转换为可能不相关的类型 flash.display:DisplayObject。”我尝试将其更改为 _tiledImg.removeChild(event.currentTarget);它告诉我它不是调用者的孩子。
    【解决方案3】:

    始终从正确的父母中删除孩子的简单方法是按照以下方式进行

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

    【讨论】:

    • 问题是它正在删除所有的方块。这行得通,但它摆脱了所有这些。
    猜你喜欢
    • 2014-06-30
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 2013-04-21
    • 2017-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多