Форум 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)
-   -   Проблема с onLoadInit (http://www.flasher.ru/forum/showthread.php?t=115285)

GreatRash 25.08.2008 17:54

Проблема с onLoadInit
 
Пытаюсь сделать галерею. Есть такой код:

Код:

// создаем загрузчик клипов
var loader:MovieClipLoader = new MovieClipLoader();
// создаем слушатель для загрузчика
var listener:Object = new Object();
// добавляем слушатель к загрузчику
loader.addListener(listener);

var dist:Number = 12;

// создаем объект XML
var my_xml:XML = new XML();
// игнорируем пробелы
my_xml.ignoreWhite = true;

my_xml.onLoad = function(success:Boolean) {
if (success) {
 // узнаем сколько всего картинок
 var total = my_xml.firstChild.childNodes.length;

 // запускаем цикл по XML
 for (var i = 0; i<total; i++) {
  var image:String = my_xml.firstChild.childNodes[i].attributes.small;

  var cont:MovieClip = container_mc.createEmptyMovieClip("cont"+i, i);
  var img:MovieClip = cont.createEmptyMovieClip("img", 1);

  loader.loadClip(image,img);

  // это номер клипа
  cont.count = i;

  listener.onLoadInit = function(target:MovieClip) {
  if (target._parent.count%2 == 0) {
    target._y = (98-target._height/2)-10;
  } else {
    target._y = (98-target._height/2)+10;
  }

  target._x = target._width*target._parent.count;
  trace(target._parent.count);
  };
 }
}
};

// грузим XML
my_xml.load("gallery.xml");

Проблема в том, что картинки в галерее имеют одинаковую высоту, но разную ширину.
И для того, чтобы узнать как расположить картинки я внутри onLoadInit умножаю ширину текущего клипа на счетчик target._parent.count, в котором содержится номер текущего клипа (0, 1, 2, 3, 4, 5, 6).

Но проблема в том, что trace(target._parent.count); выдает номера клипов в обратном порядке, т.е. (6, 5, 4, 3, 2, 1). Из-за чего все картинки расставляются как попало.

Помогите пожалуйста решить проблему и расставить картинки как положено.

Obi 25.08.2008 17:58

Грузите картинки поочереди. Когда первая загрузилась, грузите вторую и так далее.

GreatRash 25.08.2008 18:00

А это как? Подскажите код, буду очень признателен.

Obi 25.08.2008 19:12

Код:

var count:Number = 0;
var total:Number = 10;
var loader:MovieClipLoader = new MovieClipLoader();
var listener:Object = new Object();

loader.addListener(listener);

function loadNextPicture():Void {
  if(count < total) {
      var cont:MovieClip = container_mc.createEmptyMovieClip("cont"+count, count);
      var img:MovieClip = cont.createEmptyMovieClip("img", 1);
      var pathToImg:String = String("pictures/picture"+count);
      count ++;
      loader.loadClip(pathToImg ,img);
      listener.onLoadInit = loadNextPicture;
  }
};

Ну вот что-то в этом роде. Только не помню, можно ли в АС2 вызывать и тела функции эту-же функцию.

Wolsh 25.08.2008 19:19

http://flasher.ru/forum/showthread.php?t=114482
Код лучше смотреть на последней странице

GreatRash 25.08.2008 22:22

Спасибо за ответы, буду разбираться и пробовать.

GreatRash 28.08.2008 14:28

Взял код с последней страницы как вы и сказали

Код:

// создаем загрузчик клипов
var loader:MovieClipLoader = new MovieClipLoader();
// создаем слушатель для загрузчика
var listener:Object = new Object();
// добавляем слушатель к загрузчику
loader.addListener(listener);

var arr:Array = Array();

// создаем объект XML
var my_xml:XML = new XML();
// игнорируем пробелы
my_xml.ignoreWhite = true;

my_xml.onLoad = function(success:Boolean) {
        if (success) {
                // узнаем сколько всего картинок
                var total:Number = my_xml.firstChild.childNodes.length;
                for (var k:Number = 0; k<total; k++) {
                        arr.push(my_xml.firstChild.childNodes[k].attributes.small);
                }
        }
};

var dist:Number = 12;
var imgCounter:Number = 1;

listener.onLoadInit = function(target:MovieClip):Void  {
        target.flagLoaded = true;
        target._x = target._width*imgCounter;
        if (imgCounter == total) {
                loader.removeListener(listener);
                delete listener;
                delete loader;
        }
        imgCounter++;
};

function loadImg():Void {
        for (var i:Number = 0; i<=total-1; i++) {
                container_mc.createEmptyMovieClip(i,container_mc.getNextHighestDepth());
                container_mc[i].flagLoaded = false;
                loader.loadClip(arr[i],container_mc[i]);
        }
}

// грузим XML
my_xml.load("gallery.xml");

loadImg();

После того как нажимаю CTRL+Enter мне выдается сообщение о том, что скрипт выполняется очень медленно, хочу ли я отменить выполнение скрипта.

В чем моя ошибка?

Wolsh 28.08.2008 15:45

Оёёй, чето совсем не так.
Во-первых, loadImg надо вызывать только после загрузки xml (в том примере что я показал не было xml, там адреса картинок известны заранее поэтому сразу начиналась загрузка). А у Вас порядок такой должен быть: Загружаем xml, считываем данные в массив и после этого запускаем последовательную загрузку. Причем последовательную - это значит что только на событие onLoadInit начинаем загрузку следующей картинки. (Собственно, давая ссылку, я подразумевал мой код)))) Обработчик onLoadInit сам разбирается с тем какую грузить, и снова запускает loadImg для следующей картинки. Перед этим он увеличивает значение счетчика и смотрит, пора ли прекращать (ну или просто смотрит по наличию объекта в массиве). Если адреса кончились - чистимся от хлама и конец. Т.е. загрузка по циклу в принципе не то что надо.

GreatRash 28.08.2008 17:12

Что-то у меня ничего не получается:
Код:

var arr:Array = Array();
var imgCounter:Number = 0;
var dist:Number = 12;

// создаем загрузчик клипов
var loader:MovieClipLoader = new MovieClipLoader();
// создаем слушатель для загрузчика
var listener:Object = new Object();
// добавляем слушатель к загрузчику
loader.addListener(listener);

// создаем объект XML
var my_xml:XML = new XML();
// игнорируем пробелы
my_xml.ignoreWhite = true;

my_xml.onLoad = function(success:Boolean) {
        if (success) {
                // узнаем сколько всего картинок
                var total:Number = my_xml.firstChild.childNodes.length;
                for (var k:Number = 0; k<total; k++) {
                        arr.push(my_xml.firstChild.childNodes[k].attributes.small);
                }
               
                listener.onLoadInit = function(target:MovieClip):Void  {
                        target._x = 0;
                        if (imgCounter<total) {
                                loadImg(imgCounter);
                        } else {
                                loader.removeListener(listener);
                                delete listener;
                                delete loader;
                        }
                        imgCounter++;
                };
               
                function loadImg(counter:Number) {
                        container_mc.createEmptyMovieClip(counter, container_mc.getNextHighestDepth());
                        loader.loadClip(arr[counter], container_mc[counter]);
                }
               
                loadImg(0);
        }
};

// грузим XML
my_xml.load("gallery.xml");

Картинки не появляются. Вроде все сделал как вы написали, после загрузки xml гружу картинку.

Wolsh 28.08.2008 21:42

А, нет, не так конечно. Вы же засунули обработчик в обработчик. У Вас onLoadInit находится внутри XML.onLoad. А надо было просто вызвать из XML.onLoad начало загрузки, т.е. loadImg(0). Сам же код лоадера и листенера оставить снаружи)
Ну вот так
Код:

var arr:Array = new Array();
var imgCounter:Number = 0;
var dist:Number = 12;
// создаем загрузчик клипов
var loader:MovieClipLoader = new MovieClipLoader();
// создаем слушатель для загрузчика
var listener:Object = new Object();
// добавляем слушатель к загрузчику
loader.addListener(listener);
var total:Number = null;
// сoздаем контейнер
var container_mc:MovieClip = _root.createEmptyMovieClip("container_mc", _root.getNextHighestDepth());
// создаем объект XML
var my_xml:XML = new XML();
my_xml.ignoreWhite = true;
my_xml.onLoad = function(success:Boolean) {
        if (success) {
                // узнаем сколько всего картинок
                total = my_xml.firstChild.childNodes.length;
                for (var k:Number = 0; k<total; k++) {
                        arr.push(my_xml.firstChild.childNodes[k].attributes.small);
                }
                trace("XML loaded!\n--------------\nTotal : "+total+" images in List")
                loadImg(0);
        }
};
////
listener.onLoadInit = function(target:MovieClip):Void  {
        trace("--------------\nImage "+imgCounter+" loaded!")
        imgCounter++;
        target._x = dist*imgCounter;
        if (imgCounter<total) {
                loadImg(imgCounter);
        } else {
                loader.removeListener(listener);
                delete listener;
                delete loader;
        }
       
};
               
function loadImg(imgCounter:Number) {
        var pic:MovieClip = container_mc.createEmptyMovieClip("mc"+imgCounter, imgCounter);
        loader.loadClip(arr[imgCounter], pic);
}
// грузим XML
my_xml.load("gallery.xml");



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

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