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

daniral 18.11.2009 12:15

еще раз про прелоадер(сори)
 
Есть вот такой вот код
Код AS1/AS2:

package 
{
        import flash.display.Bitmap;
        import flash.display.Sprite;
        import flash.events.Event;
 
        public class Main extends Sprite
        {
                private var imageArr:Array = new Array();
                private var iterator:int = 1;
                private var decr:Number = 0.015;
                [Embed(source = 'Riviera_pic1.png')]
                private var Image1:Class;
                private var i1:Bitmap;
                [Embed(source = 'Riviera_pic2.png')]
                private var Image2:Class;
                private var i2:Bitmap;
                [Embed(source = 'Riviera_pic3.png')]
                private var Image3:Class;
                private var i3:Bitmap;
 
                public function Main():void
                {
                        i1 = new Image1();
                        i1.alpha = 1;
                        imageArr.push(i1);
                        i2 = new Image2();
                        i2.alpha = 0;
                        imageArr.push(i2);
                        i3 = new Image3();
                        i3.alpha = 0;
                        imageArr.push(i3);
                        for each(var im:Bitmap in imageArr)
                                addChild(im);
                        addEventListener(Event.ENTER_FRAME, enterFR);
                }
                private function enterFR(e:Event):void
                {
                        imageArr[iterator].alpha += decr;
                        if (imageArr[iterator].alpha >= 1)
                        {
                                imageArr[iterator].alpha = 1;
                                if (iterator>0)
                                        imageArr[iterator - 1].alpha = 0;
                                if (iterator==0)
                                        imageArr[imageArr.length-1].alpha = 0;
                                setChildIndex(imageArr[iterator], 0);
                                iterator++;
                                if (iterator >= imageArr.length)
                                        iterator = 0;
                        }
                }
        }
}

as только начал учить.
Работаю в ФД.
Adobe CS не знаю вообще.

Как мне сделать прелоадер?

Jewelz 18.11.2009 12:35

а чем встроенный во FD класс Preloader не устроил?

Код AS3:

package 
{
        import flash.display.DisplayObject;
        import flash.display.MovieClip;
        import flash.events.Event;
        import flash.events.ProgressEvent;
        import flash.utils.getDefinitionByName;
 
        /**
        * ...
        * @author
        */

        public class Preloader extends MovieClip
        {
 
                public function Preloader()
                {
                        addEventListener(Event.ENTER_FRAME, checkFrame);
                        loaderInfo.addEventListener(ProgressEvent.PROGRESS, progress);
                        // show loader
                }
 
                private function progress(e:ProgressEvent):void
                {
                        // update loader
                }
 
                private function checkFrame(e:Event):void
                {
                        if (currentFrame == totalFrames)
                        {
                                removeEventListener(Event.ENTER_FRAME, checkFrame);
                                startup();
                        }
                }
 
                private function startup():void
                {
                        // hide loader
                        stop();
                        loaderInfo.removeEventListener(ProgressEvent.PROGRESS, progress);
                        var mainClass:Class = getDefinitionByName("Main") as Class;
                        addChild(new mainClass() as DisplayObject);
                }
 
        }
 
}


daniral 19.11.2009 11:29

Код AS1/AS2:

package 
{
        import flash.display.Bitmap;
        import flash.display.Loader;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.ProgressEvent;
        import flash.net.URLRequest;
        import flash.display.StageAlign;
        import flash.display.StageScaleMode;
 
        public class Main extends Sprite
        {
                [Embed(source = '../bin/loaderW.png')]
                private var f:Class;
                private var ff:Bitmap;
                private var sprLoading:Sprite = new Sprite();
                private var imageArr:Array = new Array();
                private var iterator:int = 0;
                private var decr:Number = 0.015;
                private var imgLoader:Loader;
                private var first:Boolean = true;
                public function Main():void
                {
                        stage.scaleMode = StageScaleMode.NO_SCALE;
                        stage.align = StageAlign.TOP_LEFT;
                        ff = new f();
                        ff.x = ff.width / 2 * -1;
                        ff.y = ff.height / 2 * -1;
                        sprLoading.addChild(ff);
                        sprLoading.x = stage.stageWidth / 2;
                        sprLoading.y = stage.stageHeight / 2;
                        addChild(sprLoading);
                        for each (var d:* in root.loaderInfo.parameters)
                        {
                                imgLoader = new Loader();
                                imgLoader.load(new URLRequest(d));
                                if (first)
                                {
                                        first = false;
                                        imgLoader.contentLoaderInfo.addEventListener(Event.OPEN, prog);
                                }
                                imgLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, comp);
                        }
                }
                private function prog(e:Event):void
                {
                        addEventListener(Event.ENTER_FRAME, rott);
                }
                private function rott(e:Event):void
                {
                        sprLoading.rotation += 15;
                }
                private function comp(e:Event):void
                {
                        e.target.content.width = stage.stageWidth;
                        e.target.content.height = stage.stageHeight;
                        imageArr.push(e.target.content);
                        addChild(e.target.content);
                        sprLoading.visible = false;
                        removeEventListener(Event.ENTER_FRAME, rott);
                        if (imageArr.length > 1)
                        {
                                e.target.content.alpha = 0;
                                if (!stage.hasEventListener(Event.ENTER_FRAME))
                                        addEventListener(Event.ENTER_FRAME, enterFR);
                        }
                }
                private function enterFR(e:Event):void
                {
                        imageArr[iterator].alpha += decr;
                        if (imageArr[iterator].alpha >= 1)
                        {
                                imageArr[iterator].alpha = 1;
                                if (iterator>0)
                                        imageArr[iterator - 1].alpha = 0;
                                if (iterator==0)
                                        imageArr[imageArr.length-1].alpha = 0;
                                setChildIndex(imageArr[iterator], 0);
                                iterator++;
                                if (iterator >= imageArr.length)
                                        iterator = 0;
                        }
                }
        }
}

Если кому не трудно, посмотрите код и укажите на ошибки.
Или может что-то вобще по другому нужно было сделать.
И вообще будет ли ето работать.

Jewelz 19.11.2009 12:48

Цитата:

Код AS1/AS2:
-наверно все-таки AS3

-постарайтесь не использовать имена переменных типа f, ff, и функций типа prog, rott, comp, enterFR

- немного сложновато реализован прелоадер, думаю правильнее было бы сделать отдельный класс для preloader bar в котором будет MovieClip с анимацией вращения, в нем же можно сделать текстовое поле в котором будут отображаться проценты загрузки

Код AS3:

private function enterFR(e:Event):void 
{...
}

- а вот этот хендлер что должен делать? плавно увеличивать alpha картинок?

daniral 19.11.2009 14:35

Цитата:

- а вот этот хендлер что должен делать? плавно увеличивать alpha картинок?
Да.
Из html засылаются картинки и они меняются между собой прозрачностью.

Еще 1 вопрос.

Как можно узнать установлен ли флэш плеер на ком. пользователя?
Если нет то отображать гиф.Если да то флэш.

а название переменных просто писал быстро.

И если не трудно обьясните как пользоваться swfobject.
Как вставить в html и отправить параметры в флэш.
И главное как принять их в флэш.
Спасибо за ранее.

Jewelz 19.11.2009 17:43

опять же если вы используете FD, он сам делает вставку флеша в html через swfObject, выглядит это примерно так:

Код:

<html>
<head>
        <title>site</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <meta name="language" content="en" />
        <meta name="description" content="" />
        <meta name="keywords" content="" />
       
        <script src="js/swfobject.js" type="text/javascript"></script>
        <script type="text/javascript">
                var flashvars = {
                        userid: "13123"
                };
                var params = {
                        menu: "false",
                        scale: "noScale",
                        allowFullscreen: "true",
                        allowScriptAccess: "always",
                        bgcolor: "#FFFFFF"
                };
                var attributes = {
                        id:"site"
                };
                swfobject.embedSWF("site.swf", "altContent", "100%", "100%", "9.0.0", "expressInstall.swf", flashvars, params, attributes);
        </script>
        <style>
                html, body { height:100%; }
                body { margin:0; }
        </style>
</head>
<body>
        <div id="altContent">
                <h1>site</h1>
                <p>Alternative content</p>
                <p><a href="http://www.adobe.com/go/getflashplayer"><img
                        src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif"
                        alt="Get Adobe Flash player" /></a></p>
        </div>
</body>
</html>

в див <div id="altContent"> можно вставить гифку если не установлен флеш плеер

передать параметры через блок flashvars:
Код:

var flashvars = {
                        userid: "13123"
                };

а принять во флеш вот так:
Код AS3:

var uid:String = stage.loaderInfo.parameters["userid"];


daniral 20.11.2009 00:12

Спасибо огромное за помощ.
Очень помогло.
Вот как я сделал:
Код:

<head>
<title>SWFObject</title>
<script type="text/javascript" src="swfobject.js"></script>
</head>
<body>
          <div id="flashcontent">
                <img src="1257313205161.gif" width="215" height="131" alt="" />
          </div>
          <script type="text/javascript">
                var so = new SWFObject("qwe.swf", "sotester", "215", "131", "8", "#000000");
        so.addVariable("variable", "image.jpg");
        so.addVariable("variable0", "image0.jpg");
                so.write("flashcontent");
    </script>
</body>
</html>

Теперь плин другая проблема.
При создании swf разрешение 215х131.
И теперь если я засылаю в swf картинку намного большего разрешения то видно только уголок картинки.
Как сделать чтобы swf был немного динамичнее с разрешениями картинок?

SamFR 20.11.2009 04:26

Цитата:

Сообщение от daniral (Сообщение 866910)
Как сделать чтобы swf был немного динамичнее с разрешениями картинок?

Stage.stageWidth,
Stage.stageHeight;

Bitmap.width,
Bitmap.height.

daniral 21.11.2009 15:57

После загрузки картинки делаю ее размер равный размеру stage:
e.target.content.width = stage.stageWidth;
e.target.content.height = stage.stageHeight;

то что нужно картинка равна размеру флэш.

а как изменить размер флэш из html?
он задается при компиляции swf.
Если меняю размер тут:
var so = new SWFObject("preloader.swf", "sotester", "215", "131", "8", "#000000");
то картинка куда-то убегает.
нужно сделать так чтобы какого бы размера картинку не заслали в swf она бы стала во весь размер флэш-Это сделал.
А теперь из html нужно задать размер самого флэш-Это не выходит.

Добавлено через 30 минут
Ура все получилось.
В флэш вставил:
stage.scaleMode = StageScaleMode.NO_SCALE;
а в html:
so.addParam("salign", "tl");

и все заработало как нужно.

Спасибо всем за помощ.

SamFR 21.11.2009 21:09

Можно было вместо

Код AS3:

so.addParam("salign", "tl");

в html сделать

Код AS3:

stage.align = StageAlign.TOP_LEFT;

во флэше. Это на случай, если вы вдруг флешку захотите не встраивая в html запустить)


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

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