Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Вывод процента загрузки (http://www.flasher.ru/forum/showthread.php?t=158507)

DarkKnight2009 20.06.2011 15:21

Вывод процента загрузки
 
Здравсвуйте
Есть код
Код AS3:

package 
{
        import flash.display.*;
        import flash.net.URLRequest;
        import flash.events.*;
        import flash.text.*;
        import flash.text.TextFormat;
        import flash.text.Font;
 
        public class Main extends Sprite
        {
                //---------------------------------------
                // CLASS CONSTANTS
                //---------------------------------------
 
                public static const APP_VERSION:String = "Loadin 0.1 - June 20, 2011";
 
                //---------------------------------------
                // PRIVATE VARIABLES
                //---------------------------------------
 
                private var loader:Loader;               
                private var progressOutput:TextField;       
                private var progressOutputFormat = new TextFormat();               
                private var load_mc:MovieClip;
 
                //---------------------------------------
                // CONSTRUCTOR
                //---------------------------------------
 
                public function Main()
                {               
                        trace(APP_VERSION);
 
                        createLoader();
                        createProgressIndicator();
 
                        load( new URLRequest("Module.swf") );                       
                }
 
                //---------------------------------------
                // PRIVATE METHODS
                //---------------------------------------
 
                private function createLoader():void
                {
                        loader = new Loader();
 
                        loader.contentLoaderInfo.addEventListener( ProgressEvent.PROGRESS, progressListener );
                        loader.contentLoaderInfo.addEventListener( Event.COMPLETE, completeListener );
                        loader.contentLoaderInfo.addEventListener( Event.INIT, initListener );
 
                        loader.contentLoaderInfo.addEventListener( IOErrorEvent.IO_ERROR, ioErrorListener );
                }
 
                private function createProgressIndicator():void
                {                       
                        progressOutputFormat.size = 18;
                        progressOutputFormat.color = 0x00334D;
                        progressOutputFormat.font = "Arial";
 
                        progressOutput = new TextField();                                       
                        //progressOutput.text = "LOADING ...";
                        progressOutput.defaultTextFormat = progressOutputFormat;
                        progressOutput.x = stage.stageWidth / 2 - 80;
                        progressOutput.y = stage.stageHeight / 2 - 40;
                        progressOutput.width = 200;
 
                        var bytes_Loaded:Number = stage.loaderInfo.bytesLoaded;
            // перемнная, хранящая число загруженых байт нашего мувика
            var bytes_Total:Number = stage.loaderInfo.bytesTotal;
            // переменная, хранящая обьём фильма (в байтах)
            var s:String = "";
            var percent:Number = 0;
 
                        if ( bytes_Total > 0 )
                        {
                                // проверяем, узнал ли фильм о своём молном размере, чтобы мы не делили на ноль
                                percent = Math.floor( bytes_Loaded / bytes_Total * 100 );
                                //Считаем сколько процентов уже загрузилось, округляем до целых
 
                                s = percent+"%"
 
                                trace(s)
                        }
 
                        load_mc = new Load_mc();
                        load_mc.x = stage.stageWidth / 2;
                        load_mc.y = stage.stageHeight / 2;
                        addChild(load_mc);                       
 
                }
 
                private function load( urlRequest:URLRequest ):void
                {
                        loader.load(urlRequest);
 
                        if( !contains(progressOutput) )
                        {
                                addChild(progressOutput)
                        }
                }
 
                private function progressListener(e:ProgressEvent):void
                {
                        progressOutput.text = "LOADING: " + Math.floor(e.bytesLoaded / 1024) + "/" + Math.floor(e.bytesTotal / 1024) + "KB";                                               
                }
 
 
                private function initListener(e:Event):void
                {                       
                        MovieClip(loader.content).stop();
                }
 
                private function completeListener(e:Event):void
                {
 
                        addChild(loader.content);
                        MovieClip(loader.content).play();
                        removeChild(progressOutput);
                        removeChild(load_mc);
                }
 
                private function ioErrorListener(e:IOErrorEvent):void
                {
                        progressOutput.text = "LOAD ERROR";
                }       
 
        }  // end class       
}  //  end package

Проблема в том, что переменная s в trace(s) должна выводить процент загрузки , а она выводит сразу 100% почему так ?
Вот с ф-ей все ок
Код AS3:

private function progressListener(e:ProgressEvent):void
                {
                        progressOutput.text = "LOADING: " + Math.floor(e.bytesLoaded / 1024) + "/" + Math.floor(e.bytesTotal / 1024) + "KB";                                               
                }

Выводит как положено, а проценты не хочет :(

kackbip 20.06.2011 15:28

Есть особенность одна. Если Main это Document class, то конструктор Main у вас будет вызван только после полной загрузки первого кадра флэшки. Вполне возможно, все что у вас есть - находится в первом кадре :) Тогда естественно слушатель прогресса вызывается после всего.

Прелоадер и Main должны быть реализованы отдельно. На пример так:
Прелоадер лежит на первом кадре, а основная часть флэшки лежит на кадрах начиная со второго.

DarkKnight2009 20.06.2011 15:33

Цитата:

Сообщение от kackbip (Сообщение 1005067)
Есть особенность одна. Если Main это Document class, то конструктор Main у вас будет вызван только после полной загрузки первого кадра флэшки. Вполне возможно, все что у вас есть - находится в первом кадре :) Тогда естественно слушатель прогресса вызывается после всего.

Прелоадер и Main должны быть реализованы отдельно. На пример так:
Прелоадер лежит на первом кадре, а основная часть флэшки лежит на кадрах начиная со второго.

ТАк и есть, прелоадер в классе Майн, а сама флешка подгружается отдельно

Добавлено через 4 минуты
я ф-юю изменил на
Код AS3:

private function progressListener(e:ProgressEvent):void
                {
                        progressOutput.text = "LOADING: " + Math.floor(e.bytesLoaded / e.bytesTotal) * 100 + "%";
 
                }

флеш выводит 0 , но ролик грузится и при загрузке начинает воспроизводиться, а проценты все равно не считаются, на нуле остаются и при воспроизведении ролика , как и положенно убираются

kackbip 20.06.2011 15:40

Ой, ё-моё. :)
Надо же сначала на 100 умножать, а потом делать Math.floor

DarkKnight2009 20.06.2011 15:44

Цитата:

Сообщение от kackbip (Сообщение 1005071)
Ой, ё-моё. :)
Надо же сначала на 100 умножать, а потом делать Math.floor

Rакая разница, у меня умножение происходит за скобками и к Math.floor не имеет отношения

kackbip 20.06.2011 15:47

Ну конечно никакой разницы :)
Код AS3:

Math.floor(e.bytesLoaded / e.bytesTotal)

это выражение у вас всегда равно нулю, кроме момента полной загрузки.

DarkKnight2009 20.06.2011 15:49

Цитата:

Сообщение от kackbip (Сообщение 1005076)
Ну конечно никакой разницы :)
Код AS3:

Math.floor(e.bytesLoaded / e.bytesTotal)

это выражение у вас всегда равно нулю, кроме момента полной загрузки.

я понял код, как вы и сказали
Код AS3:

progressOutput.text = "LOADING: " + 100 * Math.floor( e.bytesLoaded / e.bytesTotal ) + "%";

Только ничего не изменилось, как было 0 так и осталось

kackbip 20.06.2011 15:50

Ну детский сад :)
Код AS3:

progressOutput.text = "LOADING: " + Math.floor( 100 * e.bytesLoaded / e.bytesTotal ) + "%";


DarkKnight2009 20.06.2011 15:51

Цитата:

Сообщение от kackbip (Сообщение 1005080)
Ну детский сад :)
Код AS3:

progressOutput.text = "LOADING: " + Math.floor( 100 * e.bytesLoaded / e.bytesTotal ) + "%";


Ну я ДЕБИЛ ! Спасибо большое ! :)

S-ed 20.06.2011 19:21

Тред порадовал. =)

DarkKnight2009
Без обид, у всех бывает. =Р


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

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