【问题标题】:Multiple sprites added in loop, but only last sprite clickable循环中添加了多个精灵,但只有最后一个精灵可点击
【发布时间】:2014-05-24 12:02:40
【问题描述】:

我在循环中将多个位图图像添加到精灵中(每个图像添加到 1 个精灵中),然后将所有精灵添加到 1 个 _contentHolder(Sprite) 中,然后将其添加到视口中。

问题是,循环内添加的多个精灵,一切都显示没有问题,但只有最后添加的精灵是可点击的。在可点击之前没有添加任何精灵。想知道问题是什么,它们没有重叠,当我将鼠标悬停在所有精灵的顶部时,它变成了鼠标点击器,但它不会点击。

感谢您的宝贵时间!

我的代码:

function onImageLoaded(e:Event):void {

                loadedArray.push(e.target.content as Bitmap);

                for(var i:int = 0; i < loadedArray.length; i++){
                var currentY1:int = 200;
                var image: Sprite= new Sprite;

                e.currentTarget.loader.content.height =200;
                e.currentTarget.loader.content.y += currentY1;


                 image.mouseChildren = true;    // ignore children mouseEvents
                 image.mouseEnabled = true;      // enable mouse on the object - normally set to true by default
                 image.useHandCursor = true;     // add hand cursor on mouse over
                 image.buttonMode = true; 

                  image.addChild(loadedArray[i]);

                    _contentHolder.addChild(image);
                }

            newArray.push(image);
            var viewport:Viewport = new Viewport();

            viewport.y = 0;

            viewport.addChild(_contentHolder);


            var scroller:TouchScroller = new TouchScroller();
            scroller.width = 300;
            scroller.height = 265;
            scroller.x = 10;
            scroller.y = 100;
            scroller.viewport = viewport;
            addChild(scroller);


             image.addEventListener(MouseEvent.CLICK, gotoscene);

                    }
loadImage();

编辑:

 function gotoscene(e: MouseEvent):void{




        var index:Number;

        index = newArray.indexOf(e.target);

         trace(index);


        blackBox.graphics.beginFill(0x000000);
        blackBox.graphics.drawRect( -1, -1, stage.width, stage.height);
        blackBox.alpha = 0.7;
        addChild(blackBox);








        var originalBitmap : BitmapData = loadedArray[index].bitmapData;
                var duplicate:Bitmap = new Bitmap(originalBitmap);
                duplicate.width = stage.width;


                 _contentHolder1.addChild(duplicate);



  // Use counter here to only add _contentHolder1 once


  //Assuming that `samedata` is a class member (I can't see the rest of your code)

      addChild(_contentHolder1);







           }

编辑2:

     private var image:Array = new Array;


    //In the For loop 

    image[i] = new Sprite();
           image[i].addChild(loadedArray[i]);
                    image[i].addEventListener(MouseEvent.CLICK, gotoscene);


function gotoscene(e:MouseEvent):void{


 index = image.indexOf(e.target);
         trace(index);

}

【问题讨论】:

  • 也许这会给你一些想法:stackoverflow.com/questions/19739366/…
  • 我查看了那个链接,但我仍然不太确定为什么我的精灵不会点击。至于只有最后一个精灵点击而不是任何其他的原因是什么

标签: actionscript-3 actionscript


【解决方案1】:

您应该将image.addEventListener(MouseEvent.CLICK, gotoscene); 语句移动到添加子精灵的循环中。完成后,侦听器将被添加到所有精灵中,而不仅仅是当前存储在 image 变量中的最后一个精灵,并且是唯一响应您的点击的精灵。

        for(var i:int = 0; i < loadedArray.length; i++){
            var currentY1:int = 200;
            var image: Sprite= new Sprite;
            e.currentTarget.loader.content.height =200;
            e.currentTarget.loader.content.y += currentY1;


            image.mouseChildren = true;    // ignore children mouseEvents
            image.mouseEnabled = true;      // enable mouse on the object - normally set to true by default
            image.useHandCursor = true;     // add hand cursor on mouse over
            image.buttonMode = true; 
            image.addEventListener(MouseEvent.CLICK, gotoscene); // <-- THIS
            image.addChild(loadedArray[i]);

            _contentHolder.addChild(image);
        }

尽管如此,学习缩进你的代码,这样你就可以直观地找到循环的开始和结束,并查看某个语句是否在循环内。

【讨论】:

  • 我无法做到这一点,当我在循环内移动 image.addEventListener 行时,然后在 EventListener 的 gotoscene 的编辑部分中,我有一个错误 #1010: A term is undefined并且前 2 个图像没有属性,最后一个图像仍然可以(可点击),但现在前 2 个图像不会单击并给出该错误,并且索引变为 -1。就行了, var originalBitmap : BitmapData = loadedArray[index].bitmapData;
  • 我尝试从 var originalBitmap 切换索引:BitmapData = loadedArray[index].bitmapData;到 [0] 就像你说的那样,所有的精灵都变成了可点击的。但不知道为什么当我尝试查找索引时,前 2 个变为 -1,最后一个精灵跟踪索引正确。
【解决方案2】:

我在 AS3 工作了几年,这是一个奇怪的常见问题。我曾经使用将事件添加到每个剪辑的函数来解决它:

function someFunction():void {
   for (...) {
      var image:Sprite = new Sprite();

      addSceneListener(image);
   }
}

function addSceneListener(mc:Sprite):void {
   mc.addEventListener(MouseEvent.CLICK, gogoscene);
}

【讨论】:

    猜你喜欢
    • 2016-03-16
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多