Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Запись в массив? (http://www.flasher.ru/forum/showthread.php?t=131243)

sy555 15.10.2009 20:17

Запись в массив?
 
Добрый день

Как сделать что бы , загружались картинки (через xml) и загружались в массив, так будто бы они находятся в буффере(Library) ??





Подробнее:
Так сделано,когда подгружает из библиотеке по Linkage:

Код AS1/AS2:

var linksID:Array=["1","2","3","4","5","6","7"];

после парсинга xml, я получаю массив
image[i]

Код AS1/AS2:

for(j=0;j<total;j++)
                {
                trace("j: "+j + " , " + "im: "+image[j]);
 
                }

trace :
Код:


j: 0 , im: src/1.JPG
j: 1 , im: src/2.JPG
j: 2 , im: src/3.JPG
j: 3 , im: src/4.JPG
j: 4 , im: src/5.JPG
j: 5 , im: src/6.JPG
j: 6 , im: src/7.JPG

Соответвенно как мне сразу загрузить в буффер и работать как-будто я импортировал из в Библиотеку вручную ( получить массив ссылок на Linkage/Inditefier):wacko:

mooncar 15.10.2009 20:32

Я делал так - сразу после загрузки отрисовывал мувик с картинкой в BitmapData и добавлял новый полученный экземпляр BitmapData в массив. Исходный загрузочный мувик-контейнер тут же удалялся. При необходимости аттачил картинки из массива. Так реально можно хранить растровые данные в памяти и их использовать.

sy555 15.10.2009 20:45

Спасибо за подсказку попробуем реализовать это)

Добавлено через 24 минуты
Вопрос как добавить ?

Код AS1/AS2:

function bit()
{
 
        var linkageId:String = "pic.jpg";
var myBitmapData:BitmapData = BitmapData.loadBitmap(linkageId);
trace(myBitmapData instanceof BitmapData); // true
 
 
var mc:MovieClip = this.createEmptyMovieClip("mc", this.getNextHighestDepth());
mc.attachBitmap(myBitmapData, this.getNextHighestDepth());
 
 
}

Такой код и не будет работать, т.к.
Код:

public static loadBitmap(id:String) : BitmapData

Возвращает новый экземпляр BitmapData, который содержит растровое изображение символа, определенного в библиотеке под указанным идентификатором (ID).

Xml , дает нам лишь массив путей. , как загрузить в экземпляр BitmapData?

Art_133 15.10.2009 21:17

Mooncar, скажите что вы записывали в массив? Часто сталкивался с подобным, но приходилось решать проблему кустарным способом...
Возможно я плохо знаю Класс BitmapData. Отсюда подобние вопроссы.

mooncar 15.10.2009 22:13

Вот кусок кода.
В проекте есть лента событий. Функция загружает картинку к определенному событию за определенный год. Данный кусок кода работает в этом проекте в составе общего прелоадера для всего ролика (проект большой). Привожу как есть.
Код AS1/AS2:

var EVENTSBITMAP:Array = new Array(); //массив фото событий
......
var mcLoaderEventsFoto:MovieClipLoader = new MovieClipLoader();
var listenerEFoto:Object = new Object();
mcLoaderEventsFoto.addListener(listenerEFoto);
 
function loadEventsSlide (year, n) {
        this.createEmptyMovieClip('eventFoto' + year + n, this.getNextHighestDepth());
        this['eventFoto' + year + n]._alpha = 0; //чтобы в прелоадере  на виду не мелькали загружаемые картинки
 
        listenerEFoto.onLoadInit  = function (target_mc:MovieClip) {
                var myImg:BitmapData = new BitmapData(target_mc._width, target_mc._height, false);       
                myImg.draw(target_mc);
                target_mc.unloadMovie();
 
                EVENTSBITMAP[target_mc._name] = myImg;
 
                if (year >= yearsTotal) {
                        loadEventsStatus = 1; //состояние этого триггера проверяется механизмом общего лоадера
                }
        };       
 
        listenerEFoto.onLoadError = function  (target_mc:MovieClip) {//если нет фото к событию
                if (year >= yearsTotal) {
                loadEventsStatus = 1; //конец
                }
        };       
 
        mcLoaderEventsFoto.loadClip(EventsPath + 'foto/' + year + '.' + n + '.jpg' + suffix, this['eventFoto' + year + n]);
};

Тут у меня:
n - это номер события у конкретного года.
EventsPath - путь на сервере к директории с данными шкалы событий
suffix - зависит от способа загрузки - важен для отладки - в начале определяется: если загрузка с web-сервера, то suffix - рандомная приставка для предотвращения кэширования, если локально - то suffix = пусто.
Функция вызывается из другой по определенному алгоритму загрузки общих данных шкалы событий.
В нужный момент, когда юзер проходит по ленте событий года, из массива картинки приаттачиваются в мувик-контейнер:
Код AS1/AS2:

...
mc.createEmptyMovieClip('image', 0);
mc.image.attachBitmap(_root.EVENTSBITMAP['eventFoto' + year + n], 0);

mc - это объектная ссылка для некого контейнера для иллюстрации...

Art_133 15.10.2009 22:21

А за тем как массив набит:
Код AS1/AS2:

clip.attachBitmap(EVENTSBITMAP[номер], this.getNextHighestDepth());

?

mooncar 15.10.2009 22:32

Совершенно верно, в нужный момент в нужной функции аттачим картинку а контейнер.
Только у меня были не номерные элементы массива, а именованные.
Такой алгоритм в том же проекте работает еще в паре мест для загрузки других наборов изображений.
Ресурсоемко, конечно в битмапу загонять, но заказчик очень хотел - сперва чтобы загрузилось все-все-все, потом работала презентация.
Если проект не очень большой, то так можно. Тем более у меня это не для инета было, а для инфомата в вестибюле.

Art_133 15.10.2009 22:49

Возьму этот метод на заметку. Спасибо!

mooncar 15.10.2009 22:51

Как там пишут - Enjoy it! :)

sy555 15.10.2009 23:18

Не совсем я понял как это работает, если можно подсобить..

добавил своих комментов,где ошибся?
Код AS1/AS2:

 
import flash.display.BitmapData;
var EVENTSBITMAP:Array = new Array(); //массив фото событий
 
//......
var mcLoaderEventsFoto:MovieClipLoader = new MovieClipLoader();
var listenerEFoto:Object = new Object();
mcLoaderEventsFoto.addListener(listenerEFoto);
 loadEventsSlide(1999,5);
function loadEventsSlide (year, n) {
        //создание пустого мувиклипа
        this.createEmptyMovieClip('eventFoto' + year + n, this.getNextHighestDepth());
        this['eventFoto' + year + n]._alpha = 100; //чтобы в прелоадере не мелькали загружаемые картинки
 //когда объект загружен ,создаем функции с входным аргументом - муви,клип
        listenerEFoto.onLoadInit  = function (target_mc:MovieClip) {
                //создаем объект типа BitmapData, под подгружаемый mc
                var myImg:BitmapData = new BitmapData(target_mc._width, target_mc._height, false);       
                //отборжение эффекта
                myImg.draw(target_mc);
                //выгрузка мувиклипа из контейнера
                //target_mc.unloadMovie();
 //Массив муикльипа ,с имееными индексами заполнеяеться конкретной картикой
                EVENTSBITMAP[target_mc._name] = myImg;
 
                if (year >= yearsTotal) {
                        loadEventsStatus = 1; //состояние этого триггера проверяется механизмом общего лоадера
                }
        };       
 
        listenerEFoto.onLoadError = function  (target_mc:MovieClip) {//если нет фото к событию
                if (year >= yearsTotal) {
                        trace("ERROR, can't find file");
                loadEventsStatus = 1; //конец
                }
        };       
 trace("ROUTE!::"+EventsPath + "foto/" + year + "." + n + ".jpg" + suffix );
        mcLoaderEventsFoto.loadClip("fon.JPG", 1);
 
        //p1.loadClip("fon.JPG",1);
 
};
 
p1.attachBitmap(EVENTSBITMAP[target_mc._name], this.getNextHighestDepth());
for(j=0;j<4;j++)
{
        trace(" " + EVENTSBITMAP[j]);
 
}

откуда берется target_mc?
что делает listenerEFoto.onLoadInit?


и правильно ли я понял, что это массив EVENTSBITMAP
будет выглядеть так EVENTSBITMAP=["ссылка на fon.jpg , загруженный динамически в библиотеку"]


Часовой пояс GMT +4, время: 14:35.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.