Добавление нескольких экземпляров Sprite? - PullRequest
0 голосов
/ 03 июня 2011

Я создаю Custom Image Picker, который показывает 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 ]

3 голосов
/ 03 июня 2011

Хммм, он показывает только одну фотографию на 6-м элементе, потому что вы запускаете цикл for 6 раз и добавляете выбранную фотографию к каждому новому спрайту подряд.Вы видите, когда вы добавляете экранный объект к другому экранному объекту, а затем добавляете этот же экранный объект к чему-то другому, исходный элемент извлекается из первого экранного объекта и добавляется к следующему.Я знаю, что это может быть трудно понять, когда вы пишете таким образом, поэтому давайте разберемся так:

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], вы добавляете уникальную картинку к каждому6 новых спрайтов контейнеров, которые вы создаете в цикле for, потому что в каждый контейнер добавляются уникальные элементы.Вы получаете доступ к этим уникальным элементам, используя индекс массива (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);
    }
}

Теперь имейте в виду, что это всего лишь один метод, и я написал это на макушке.Итак, я не уверен, но вы МОЖЕТЕ дублировать данные pictureBytes внутри цикла for, но я в это не верю.Если бы вам пришлось, вот как вы это сделаете:

var bytesCopy:ByteArray = new ByteArray();
pictureBytes.position = 0;
bytesCopy.writeBytes(pictureBytes);
2 голосов
/ 03 июня 2011

Я не уверен, что полностью понимаю ваш код, но одно можно сказать наверняка;DisplayObject (в вашем случае Sprite) не может иметь более одного родителя, поэтому, если вы попытаетесь добавить его в другое место, он потерпит неудачу.Это, вероятно, ваша проблема.

...