添加Sprite的多个实例?

时间:2011-06-03 10:09:00

标签: actionscript-3 instance sprite

我正在构建一个自定义图像选择器,它显示了6个替代版本。但是照片只显示在第6个项目上。

_model.selectedPhoto会返回一个Sprite,并且不会让该应用正常运行。

但是,当我使用_model.photos[ii]时,每张照片都会添加一张照片 - 为什么会这样?我需要为每个_model.selectedPhoto

添加s:Sprite
        for (var ii:int; ii < 6; ii++)
        {
            //Create BG
            var s:Sprite = new Sprite();
            s.graphics.beginFill(Math.random() * 0xffffff, 0.4);
            s.graphics.drawRect(0, 0, 291, 184);
            //add Photo
            var p:Sprite = new Sprite();
            p.addChild(_model.selectedPhoto);
            p.scaleX = p.scaleY = 0.2;
            p.x = 0;
            p.y = 0;
            s.addChild(p);
            cards.push(s);
        }

2 个答案:

答案 0 :(得分:3)

嗯,它只显示第6个项目上的一张照片,因为你正在运行6次for循环并连续将所选照片添加到每个新的精灵中。您会看到将显示对象添加到另一个显示对象,然后将该显示对象添加到其他显示对象时,将从第一个显示对象中提取原始项并将其添加到下一个显示对象。我知道在写这种方式时可能很难理解,所以让我们这样打破:

var photo:Sprite = new Sprite();

var container1:Sprite = new Sprite();

var container2:Sprite = new Sprite();

//Add to the first container
container1.addChild(photo);

//At this point when you add to the next container, the object is removed from container1 and placed inside container 2
container2.addChild(photo);

这就是为什么当你使用_model.photos [ii]时,你为你的for循环中的6个新容器精灵中的每一个添加了一个独特的图片,因为每个容器都有独特的项目。您正在使用数组索引(ii var)访问这些唯一项目,该索引随每个循环递增。

如果要为每六个项目添加相同的图片,那么您将需要复制原始图片的数据6次。一种方法是使用URLLoader对象并重新加载构成原始图片的二进制数据。你这样做是这样的:

var originalPictureLoader:URLLoader = new URLLoader();

originalPictureLoader.addEventListener(Event.COMPLETE, originalPictureLoaded);

originalPictureLoader.dataFormat = URLLoaderDataFormat.BINARY;

originalPicture.load(new URLRequest("http://www.mysite.com/picture.jpg"));

private function originalPictureLoaded(e:Event):void
{
    var pictureBytes:ByteArray = URLLoader(e.currentTarget).data as ByteArray;

    var imageDiplicateLoader:Loader;

    for (var ii:int; ii < 6; ii++)
    {
        //Create BG
        var s:Sprite = new Sprite();
        s.graphics.beginFill(Math.random() * 0xffffff, 0.4);
        s.graphics.drawRect(0, 0, 291, 184);
        //add Photo
        var p:Sprite = new Sprite();

        imageDiplicateLoader = new Loader();
        imageDiplicateLoader.loadBytes(pictureBytes);

        p.addChild(imageDiplicateLoader);
        p.scaleX = p.scaleY = 0.2;
        p.x = 0;
        p.y = 0;
        s.addChild(p);
        cards.push(s);
    }
}

现在请记住,这只是一种方法而且我已经把它写在了我的头顶。所以,我不确定你可能需要复制for循环中的pictureBytes数据,但我不相信。如果你必须这样做,你就是这样做的:

var bytesCopy:ByteArray = new ByteArray();
pictureBytes.position = 0;
bytesCopy.writeBytes(pictureBytes);

答案 1 :(得分:2)

我不确定我是否完全理解你的代码,但有一件事是肯定的;一个DisplayObject(在你的情况下是一个Sprite)不能有多个父级,因此,如果你尝试addChild它在第二个位置它将失败。这可能是你的问题。

相关问题