Форум 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)
-   -   вопрос про preloader (http://www.flasher.ru/forum/showthread.php?t=122204)

Korobok 04.03.2009 19:17

вопрос про preloader
 
Здравствуйте.
Обычно я делал прелоадеры стандартно через _root.getBytesLoaded(); и _root.getBytesTotal(); Сейчас у меня есть ролик, в котором большое количество фотографий подгружается динамически. Мне нужно, чтобы ролик начинался только когда все фото загрузятся, и соответственно, показывался процент загрузки всего объёма данных — и ролика и фоток. Будет ли этот способ работать или он коснётся только загрузки самого swf, который весит пару десятков КБ? Если нет, то как сделать правильно?

nOobCrafter 05.03.2009 12:44

Фотки грузим последовательно, одна за одной и прелоадер это отображает, и пока все фотки не загрузятся ничего не будет. Присутствуют прилоадеры для хмл и фоток.
Код AS1/AS2:

var img:Array = new Array();  // делаем пустые массивы для работы с ними
var title_pic:Array = new Array();  // в них будем вносить разную информацию из хмл листа
var des:Array = new Array();  // например название фотки, путь к ней, различные коментарии..
var i:Number = 0; // вводим переменную для подсчета чего-либо
var total:Number;// вводим переменную для подсчета записей в хмл
var stage_width:Number = Stage.width;              // переменная для определения размеров сцены
var stage_height:Number = Stage.height;            // переменная для определения размеров сцены
// эти 2 переменные я использовал для дальнейшей работы с приложением, вы можете их просто заменить на размеры сцены, кому что удобнее.
//Подключаемся к XML
myXML = new XML();
myXML.ignoreWhite = true;
myXML.load("myPics.xml");
 
function createNewMc(i)  // функция создания пустых мувиков для картинок
{
mc = hmc.createEmptyMovieClip('loader_'+ i, i);          //создаем в мувике контейнере превьюшек мувики для каждой фотографии
mc._x = stage_width * i;// ставим их в порядке один за другим, умножаем на размер фотки
//З.Ы. у меня получилась 1 большая фотка размеров со "сцену", вы можете поставить свой размер
  pic = mc.createEmptyMovieClip('pic', i); // в принципе что бы центрировать фотку, мы делаем еще один клип контейнер и его уже центрируем %)
}                                       
 
///////////-------------------- Прелоадер для хмл-----------------------///////////
xml_progressBar_mc = _root.createEmptyMovieClip("xml_progressBar_mc", _root.getNextHighestDepth());
 xml_progressBar_mc.createEmptyMovieClip("bar_mc", _root.xml_progressBar_mc.getNextHighestDepth());
 xml_progressBar_mc.createEmptyMovieClip("stroke_mc", _root.xml_progressBar_mc.getNextHighestDepth());
 with (xml_progressBar_mc.stroke_mc) {
  lineStyle(0, 0xFFFFFF, 70);
  moveTo(0, 0);
  lineTo(100, 0);
  lineTo(100, 5);
  lineTo(0, 5);
  lineTo(0, 0);
 }
 with (xml_progressBar_mc.bar_mc) {
  beginFill(0x99FF00, 100);
  moveTo(0, 2);
  lineTo(100, 2);
  lineTo(100, 4);
  lineTo(0, 4);
  lineTo(0, 2);
  endFill();
  _xscale = 0;
 }
 xml_progressBar_mc._visible = false;                                  // рисуем прогресс-бар для хмл
xml_load_tf = _root.createTextField('xml_load_tf', _root.getNextHighestDepth(), 0, 0, 100, 22);
 xml_load_tf.selectable = false;
 xml_load_tf._x = (stage_width - xml_load_tf._width) / 2;
 xml_load_tf._y = (stage_height - xml_load_tf._height) / 2;
 
 var my_fmt:TextFormat = new TextFormat();
 my_fmt.color = 0xFFFFFF;
 my_fmt.size = 12;
 my_fmt.font = "Trebuchet MS";                                  // создаем тектовое поле прогресс-бара
 
onEnterFrame = function()
{
var loaded = myXML.getBytesLoaded() + _root.getBytesLoaded();
var total = myXML.getBytesTotal() + _root.getBytesTotal();
var percent = Math.round( loaded / total * 100);
 
if( !isNaN(percent))
{
 xml_load_tf.text = "Загрузка XML";//"Загружено " + percent + "%";
 xml_load_tf.autoSize = true;
 xml_load_tf.setTextFormat(my_fmt);
 xml_load_tf._x = (stage_width - xml_load_tf._width) / 2;
  //trace(percent)
 xml_progressBar_mc._visible = true;
 xml_progressBar_mc._x = (stage_width - 100) / 2;
 xml_progressBar_mc._y = xml_load_tf._y + xml_load_tf._height + xml_progressBar_mc._height;
 xml_progressBar_mc.bar_mc._xscale = percent;
} else {
 xml_load_tf.text = "Загрузка XML";
 xml_load_tf.autoSize = true;
 xml_load_tf.setTextFormat(my_fmt);
}
 
if ( loaded == total) // когда все загружено
{
 delete onEnterFrame;
 xml_progressBar_mc.removeMovieClip();                              // удаляем что не нужно
 xml_load_tf.removeTextField();
}
}                                  // прелоадер
myXML.onLoad = function(success) // когда хмл лист загружен проверяем
{
if (success)  // если он загружен то выполняем что нам надо, если нет то выводим сообщение об ошибке, но это ниже
{
 var nodes = this.firstChild.childNodes;
 total = nodes.length;                      // узнаем количество записей (картинок)
 
 for (i = 0; i < total; i++)
 {
  title_pic[i] = nodes[i].attributes.title; // пробегаемся по хмл-файлу, считываем что нам нужно
  img[i] = nodes[i].attributes.img;        // и заносим все данные в соответствующие массивы,
  des[i] = nodes[i].attributes.description; // для дальнейшей работы с ними
 }
 ///////////------------------- Грузим фотки -----------------------///////////
 hmc = createEmptyMovieClip('holder_mc', 1);  // создаем мувик, который будет содержать все картинки нашей галлереи
 /// Создаем столько мувиков с картинками, сколько собственно картинок в XML
 
 for (i = 0; i < total; i++)
 {
  createNewMc(i);                          // функция создания пустых мувиков для картинок
 }
 
 progressBar_mc = _root.createEmptyMovieClip("progressBar_mc", _root.getNextHighestDepth()); // тут будем делать прилоадер для загрузки картинок
 progressBar_mc.createEmptyMovieClip("bar_mc", _root.progressBar_mc.getNextHighestDepth());  // в силу того что прелоадер должен быть маленьким - просто
 progressBar_mc.createEmptyMovieClip("stroke_mc", _root.progressBar_mc.getNextHighestDepth());  // рисуем его, пример их хелпа)
 with (progressBar_mc.stroke_mc) {  // рисуем рамку
  lineStyle(0, 0xFFFFFF, 70);
  moveTo(0, 0);
  lineTo(100, 0);
  lineTo(100, 5);
  lineTo(0, 5);
  lineTo(0, 0);
 }
 with (progressBar_mc.bar_mc) {  // рисуем сам прогрессбар
  beginFill(0xFF0000, 100);
  moveTo(0, 2);
  lineTo(100, 2);
  lineTo(100, 4);
  lineTo(0, 4);
  lineTo(0, 2);
  endFill();
  _xscale = 0;
 }
 progressBar_mc._visible = false;                                 
 load_tf = _root.createTextField('load_tf', _root.getNextHighestDepth(), 0, 0, 100, 22); // создаем тектовое поле прогресс-бара
 load_tf.selectable = false;
 load_tf._x = (stage_width - load_tf._width) / 2;
 load_tf._y = (stage_height - load_tf._height) / 2;
 
 var my_fmt:TextFormat = new TextFormat();
 my_fmt.color = 0xFFFFFF;
 my_fmt.size = 12;
 my_fmt.font = "Trebuchet MS";                                 
 
 // Создаем слушатель чтоб наблюдать за загрузкой превьюх
 var loaderListener:Object = new Object();
 loaderListener.onLoadStart = function(holderClip:MovieClip) {}; // тут перечисляются события загрузки
 // все их описывать небуду, просто приведу что начинается со старта, и использую что нам надо, остальное можно взять в хелпе
 loaderListener.onLoadProgress = function(holderClip:MovieClip, loadedBytes:Number, totalBytes:Number):Void // в момент загрузки картинок...
 {
  var percent:Number = Math.round((i + loadedBytes / totalBytes) * 100 / total);  // вычисляем количество загруженых байт превьюхи
 
  load_tf.text = "Загрузка изображений";//"Загружено " + percent + "%"; // если хотим что бы отображалось попроцентно то вместо надписи пишем то что в коментарии
  load_tf.autoSize = true; // применяем расширение к тексту
  load_tf.setTextFormat(my_fmt); // применяем текстформат
  load_tf._x = (stage_width - load_tf._width) / 2;  // расоплогаем по оси х (центрируем)
 
  progressBar_mc._visible = true; // выводим прогрессбар
  progressBar_mc._x = (stage_width - 100) / 2; // центрируем его
  progressBar_mc._y = load_tf._y + load_tf._height + progressBar_mc._height;
  progressBar_mc.bar_mc._xscale = percent; // чем больше процент загрузки тем больше полоска
 };
 
 loaderListener.onLoadInit = function(mc:MovieClip)                      // когда загрузка завершена
 {
  i++                      // вот тут, уже i = 1 и дальше его увеличиваем
  imageLoader.loadClip(img[i], hmc['loader_' + i].pic);              // берем нужную превью из массива и загружаем в нужный мувик
 
  if ( i == total)                                                    // когда загружены ВСЕ картинки
  {
  progressBar_mc.removeMovieClip();                              // удаляем что не нужно
  load_tf.removeTextField();
// тут же уже можно писать что будет после того как фотки загрузятся, допустим переход на второй кадр или что то такое.
  }
  mc.img_width = mc._width;                                              // получаем размеры фоток;)
  mc.img_height = mc._height;                                            // получаем размеры фоток;)                        // так же тут уже можно центрировать нашу картинку, или выровнять по другому
 };     
 
 ////// Загружем картинки в мувик контейнер
 var imageLoader:MovieClipLoader = new MovieClipLoader();
 imageLoader.addListener(loaderListener);
 
 imageLoader.loadClip(img[0], hmc['loader_' + 0].pic);                  // берем первую картинку из массива и загружаем в нужный мувик
 i = 0;                                                                  // тут ставим число картинок в 0, потому что при загрузке мы будем их считать опять.
} else {              // если же загрузки хмл небыло то
 createTextField("error", this.getNextHighestDepth(), 0, 0, 120, 20); // делаем текстовое поле с ошибкой
 error.selectable = false;
 
 var my_fmt:TextFormat = new TextFormat();
 my_fmt.color = 0xFF0000;
 my_fmt.size = 12;
 my_fmt.font = "Trebuchet MS";                                 
 
 error.text = "Sorry, but XML-file is not loaded!";
 error.autoSize = true;
 error.setTextFormat(my_fmt);
 error._x = (stage_width - error._width) / 2;
 error._y = (stage_height - error._height) / 2;
}

по хорошему надо грузить так. Это пример загрузки с использованием хмл листа.

nOobCrafter 05.03.2009 12:44

извиняюсь но в один пост не влезло(
---------------------- продолженние
хмл выглядит так:
Цитата:

<?xml version="1.0" encoding="utf-8" ?>
<items>
<item img="myPics/IMGP1622.jpg"
title = "Фотка - 1"
description="" />

<item img="myPics/IMGP1155.jpg"
title = "Фотка - 2"
description="Фотка - 9." />

<item img="myPics/IMGP1343.jpg"
title = "Фотка - 6"
description="Фотка - 9." />

<item img="myPics/IMGP1609.jpg"
title = "Фотка - 8"
description="Фотка - 8." />

</items>
Файл сохраняется В КОДИРОВКЕ UTF-8 (ФАЙЛ-СОХРАНИТЬ КАК.. И там выбраем) иначе русские буквы отображены небудут.
Прошу обратить внимание на запись атрибутов - img, title, description - именно их мы считываем во флеше и заносим эти данные в массив используя *.attributes.title(img, description)


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

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