0

四角で画像を隠すツールを作っています。私がしたいのは、正方形に当たって消えるボールを跳ね返らせることです。ただし、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);
    }
}
 }
4

3 に答える 3

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)
}
于 2012-10-31T18:40:49.640 に答える
0

常に正しい親から子を削除する簡単な方法は、次のようにすることです

function removeMC(e:MouseEvent)
{
    //removes the movie clip
    var target:Sprite = event.currentTarget as Sprite;
    target.parent.removeChild(target)
}
于 2012-10-31T17:58:44.580 に答える
0

私が正しくフォローしている場合、MouseClick で imgNode を削除しようとしています。その場合は、removeMC 関数を次のように変更する必要があります。

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

また、for ループ内にリスナーを追加するのではなく、for ループの外に追加する必要があります (リスナーを _tiledImg に追加するだけで、for ループでは変更されないため)。

于 2012-10-31T17:05:05.087 に答える