2013-08-02 5 views
1

Как и каждый программист, я сталкиваюсь с сложной задачей, и я надеюсь, что кто-то может поделиться со мной некоторыми знаниями. Я создаю игру, и для каждого игрового компонента (например, аудио, видео, картинки) я создал swf-файл (библиотеку). В основном файле я пытаюсь загрузить мои swf-файлы с помощью класса Loader. Я хотел бы сделать preloader, и я хочу рассчитать процент байтов, загруженных из всех моих swf-файлов. Я понял, что загрузка 3 погрузчиков в одно и то же время замедляет игру. Я пытался загрузить один файл за раз, но я не знаю, как поймать байты, загруженные из моих файлов, без использования ProgressEvent (здесь я могу получить доступ к переменной bytesTotal). Кто-нибудь сталкивался с подобной проблемой и мог поделиться советом или ссылкой? С уважением и Страстная пятница!Загрузка нескольких файлов swf

+0

Вам нужно получить общее количество байтов swf загружено? –

ответ

0

I сильно рекомендовать вы GreenSock's LoaderMax библиотека. Это упрощает и улучшает весь процесс. Он легко настраивается и мал.

import com.greensock.*; 
import com.greensock.loading.*; 
import com.greensock.events.LoaderEvent; 
import com.greensock.loading.display.*; 

// Create a LoaderMax named "gameQueue" and bind onProgress, onComplete and onError listeners 
var queue:LoaderMax = new LoaderMax({name:"gameQueue", onProgress:progressHandler, onComplete:completeHandler, onError:errorHandler}); 

// Append several loaders 
queue.append(new XMLLoader("xml/data.xml", {name:"xmlDoc"})); 
queue.append(new ImageLoader("img/photo1.jpg", {name:"photo1", estimatedBytes:2400, container:this, alpha:0, width:250, height:150, scaleMode:"proportionalInside"})); 
queue.append(new SWFLoader("swf/child.swf", {name:"childClip", estimatedBytes:3000, container:this, x:250, autoPlay:false})); 
queue.append(new MP3Loader("mp3/audio.mp3", {name:"audio", repeat:2, autoPlay:true})); 

// Run 
queue.load(); 

function progressHandler(event:LoaderEvent):void { 
    trace("progress: " + event.target.progress); 
} 

function completeHandler(event:LoaderEvent):void { 
    var image:ContentDisplay = LoaderMax.getContent("photo1"); 
    TweenLite.to(image, 1, {alpha:1, y:100}); 
    trace(event.target + " is complete!"); 
} 

function errorHandler(event:LoaderEvent):void { 
    trace("error occured with " + event.target + ": " + event.text); 
} 

Вы можете отобразить прогресс отдельных погрузчиков или групп погрузчиков.

Для того, чтобы точно вычислить общий прогресс из группы грузчиков, это важно знать, общий размер файла (bytesTotal) каждый ребенок погрузчика. Но если некоторые файлы еще не загрузились, как мог ваш загрузчик узнать их размеры?

Нет TCP packet, который сообщит вам об окончательном размере при прогрессе.

Запомните: - как поток. Вы никогда не узнаете окончательный размер, пока файл не будет готов!

new ImageLoader("1.jpg", {estimatedBytes:26000}); 

Простое решение:

  1. Сформировать или список, который содержит URL и общий размер каждого preloadable элемента. Вы можете сделать это с некоторой автоматизацией в (например), проверьте это SO answer.

  2. Предварительно загрузите файл xml/json с помощью LoaderMax и проанализируйте его в AS3.

  3. Загрузите все файлы из xml и добавьте правильный размер файла. Вот и все.

Вы можете найти полную документацию по AS3 here.

+0

Я проверил это вчера, cept0. Но когда он загружает несколько файлов, он не знает, какой размер у всех моих загрузчиков. Он загружает первый файл, пока он не достигнет 100%, следующий, второй файл и т. Д. Я видел это с помощью debuger. Есть ли способ LoaderMax загружать все файлы без перезапуска «progress value» в методе ProgressEvent? Извините, мой плохой английский. – rennanreis

+0

Я отредактировал свой ответ. Надеюсь, они вам помогут. – mate64

+0

Я попробую. Спасибо за помощь. – rennanreis

-1

Начните загрузку файлов, получите размер файла и закройте поток сразу после получения информации о размере.

А затем загрузите файлы по одному, как вы хотели.

Или скомпилируйте свой основной swf с объединением в библиотеки кода (если это подходит вам).

+0

Как скомпилировать мои основные файлы swf, объединенные в библиотеки кода user1875642? – rennanreis

+0

Если ваши библиотеки содержат только активы (я думаю, это ваш случай), вы можете включить их в свой основной swf с вложением (http://actionscriptexamples.com/2008/10/26/embedding-images-into-a-flash -document-помощью-на-встраивать-метаданные /). Если в ваших библиотеках содержится какой-то код, который вы используете, тогда есть опция компилятора для объединения libs в код (http://help.adobe.com/en_US/flash/cs/using/WS3e7c64e37a1d85e1e229110db38dec34-7fa4a.html). – user1875642

Смежные вопросы