Форум 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=114482)

джонатан 30.07.2008 15:12

Загрузка изображений. Грузит только последнее.
 
Добрый день! Я делаю фотогалерею, которая потгружает в себя внешние изображения. Потгрузив, BitmapData перерисовывает их и Matrix уменьшает, тем самым создавая превью. Но вот почему-то, у меня загружается только последнее изображение!

Код:

import flash.display.BitmapData;
import flash.geom.Matrix;
import mx.transitions.Tween;

var mcl = new MovieClipLoader();
var mclLst = new Object();
var mtrx = new Matrix();
var bmd = new BitmapData(100, 75, true, 0x00000000);

mtrx.scale(0.15625, 0.15625);

mclLst.onLoadInit = function() {
        bmd.draw(photo_mc[imgContPath], mtrx);
        preview_mc[prevContPath].attachBitmap(bmd, this.getNextHighestDepth(), "auto", true);
        trace(prevContPath + " загружен");
}
// Слушатель MovieClipLoader'a
mcl.addListener(mclLst);
//Грузим картинку:
// all это переменная потгружаемая из внешнего TXT в котором задается колл-во изображений, которые надо потгрузить:

for (var q = 0; q < all; q++) {
        var imgPath = "img/img" + q + ".jpg";
        var imgContPath = "photo_cont" + q;
        var backImgContPath = "photo_cont" + (q-1);
        var prevContPath = "preview_cont" + q;
        var backPrevContPath = "preview_cont" + (q-1);
        //Создаю контейнеры для фотографий и превью:
        photo_mc.createEmptyMovieClip(imgContPath, this.getNextHighestDepth());
        preview_mc.createEmptyMovieClip(prevContPath, this.getNextHighestDepth());
        if( q <= 0) {
                photo_mc[imgContPath]._x = 0;
        } else {
                photo_mc[imgContPath]._x = preview_mc[backImgContPath]._x + 108;
        }
        mcl.loadClip(imgPath, photo_mc[imgContPath]);
}

Ткните пожалуйста где я ошибся. Спасибо за внимание.

Molecula 30.07.2008 15:34

1) for()...loop - убрать.
2) Загнать название фоток в массив.
3) В теле функции Инита шагаем по массиву и грузим одну фотку, проверяя не в конце ли массива мы находимся - что бы опять не вызвать loadClip(...).

Т.е. в начале мы loadClip(...), что бы сработал Init.
Сжатый пример:
Код:

...
var counter:Number = 0;// наш счетчик, который показывает, сколько раз мы загрузили фоток из массива.
var arr:Array = [];
...
onLoadInit = function() {
this.counter++;
if(this.counter<this.arr.length){
loadClip(myMc, this.arr[this.counter]);
}
else trace('We finished');
}

loadClip(myMc, this.arr[this.counter]);


Wolsh 30.07.2008 15:37

И чему по-Вашему равен [imgContPath], когда цикл уже отработал (это же доли секунды), а загрузка только началась? Последнему, конечно. Он и отрисовывается в битмапдату.

Alex_beginner 30.07.2008 15:44

Джонатан!

Начнем. Давайте рассмотрим вот эту строчку:

Код:

bmd.draw(photo_mc[imgContPath], mtrx);
Какие мысли она навивает?! Почему, Вы решили, что первым обязательно загрузится картинка, которую первой Вы поставили в loadClip. Первой, скорее всего, загрузится наименьшая по размеру картинка. Поэтому, предлагаю
издеваться над мувами, которые уже на самом деле подгружены, т.е.:

Код:

mclList.onLoadInit = function(target_mc:MovieClip) {}
И вот тогда, target_mc будет реально загруженный клипик. Ну, я так думаю. Мож в этом дело.

джонатан 30.07.2008 16:06

Ну и запутали вы меня, товарищи! Итак:
Molecula, загнать названия фоток в массив я немогу, т.к. я делаю универсальную фотогалерею. Фотки будут часто меняться, и их колличество тоже будет всегда разным. Поэтому я и сделал что-бы пременная all грузилась из блокнота. В нем владелец будет задавать число равное колличеству фоток которые нужно будет загрузить.

Wolsh, да, действительно, это именно так.

Alex_beginner, неа. Не в этом.


А если я for заменю onEnterFrame и вставлю флаг, чтобы загрузка юыла строго последовательной, будет работать?

Molecula 30.07.2008 16:42

Честно говоря как-то не разумно, что клиент будет сливать ТХТ файл, менять там цифру, потом заливать.
А исходя из этой срочки:
Код:

var imgPath = "img/img" + q + ".jpg";
Ещё и переименовывать их численно.

Лечге было показать, как в ХМЛь забивать названия файлов да и всё - ну это уже дело хозяйское.

onEnterFrame - вообще загубит дело.

Ну, раз у Вас есть общее кол-во фоток то:
Код:

...
var counter:Number = 0;// наш счетчик, который показывает, сколько раз мы загрузили фоток из массива.
var globalAmountOfPhotos:Number = 144; // например
...
onLoadInit = function() {
this.counter++;
if(this.counter < globalAmountOfPhotos){
loadClip(myMc, this.counter);
}
else trace('We finished');
}

loadClip(myMc, 'your_path'+this.counter+'extension');


джонатан 30.07.2008 17:07

А какая разница? Перезаливать TXT или XML

Так а bmd.draw будет перерисовывать загруженное изображение где?

И что такое 'extension' ???

iNils 30.07.2008 17:33

Цитата:

Сообщение от джонатан (Сообщение 755357)
А какая разница? Перезаливать TXT или XML

Ну, захочет человек вставить между картинками 3 и 4 другую (всего их скажем 100) и придется ему переименовывать с 4-ой по 100-ю на единицу.

Alex_beginner 30.07.2008 17:55

Вложений: 1
Цитата:

Alex_beginner, неа. Не в этом.
Да ну!!

Цитата:

Код:

bmd.draw(photo_mc[imgContPath], mtrx);

imgContPath у Вас определяется в циклике:

Цитата:

Код:

for (var q = 0; q < all; q++) {
        var imgPath = "img/img" + q + ".jpg";
        var imgContPath = "photo_cont" + q;
        var backImgContPath = "photo_cont" + (q-1);
        var prevContPath = "preview_cont" + q;
        var backPrevContPath = "preview_cont" + (q-1);
        //Создаю контейнеры для фотографий и превью:
        photo_mc.createEmptyMovieClip(imgContPath, this.getNextHighestDepth());
        preview_mc.createEmptyMovieClip(prevContPath, this.getNextHighestDepth());
        if( q <= 0) {
                photo_mc[imgContPath]._x = 0;
        } else {
                photo_mc[imgContPath]._x = preview_mc[backImgContPath]._x + 108;
        }
        mcl.loadClip(imgPath, photo_mc[imgContPath]);
}


Циклик проходит, и переменная imgContPath принмает последнее значение, а картиночки то еще грузятся. И вот это перестает работать:


Цитата:

Код:

mclLst.onLoadInit = function() {
        bmd.draw(photo_mc[imgContPath], mtrx);
        preview_mc[prevContPath].attachBitmap(bmd, this.getNextHighestDepth(), "auto", true);
        trace(prevContPath + " загружен");
}


Так вот решение, предложенное мною Выше, исключает асинхронность обращения к подгружаемому клипу (изображению) и Вы получаете контроль над подгруженным изображением в нужный момент, т.е когда такой контроль уместен.

Правда проблему с prevContPath это не снимает.

Теперь, вероятно привьюшки у Вас все одинаковые, т.е тоже какбы видна последняя картинка? Если так (а это так), создавайте битмапдату каждый раз, когда хотите отрендерить в нее подгруженное в мувиклип изображение.

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

Попробовал исправить некторые ошибки до работоспособности кода, втиснув свои исправления в созданную Вами структуру (см.вложение). Получилось отвратительно.

джонатан 30.07.2008 18:04

Alex_beginner, вы как-то раз нетак давно выкладывали исходник, на похожую тему. Назывался файл "Последовательная загрузка изображений (created_by_Alex_beginner)" Так вот я сейчас решил по нему сделать свою задачу. Все получилось, но с загрузкой каждой новой фотки, битмапа тоже перерисовывается в неё, как вы и описали выше. Сейчас гляну что Вы прикрепили на этот раз...


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

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