PDA

Просмотр полной версии : еще раз про прелоадер(сори)


daniral
18.11.2009, 12:15
Есть вот такой вот код

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 не устроил?

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
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 с анимацией вращения, в нем же можно сделать текстовое поле в котором будут отображаться проценты загрузки

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"
};

а принять во флеш вот так:
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
Как сделать чтобы 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
Можно было вместо


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

в html сделать


stage.align = StageAlign.TOP_LEFT;

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

daniral
23.11.2009, 00:27
Спасибо.
Поменял.

Теперь другая проблема :(
Картинка прелоадера не появляется в середине флэш.
Она упрямо остается в верхнем левом углу и крутится там засранка.
Как ее в середину переташить?

SamFR
23.11.2009, 00:42
img.x = (stage.stageWidth - img.width)/2;
img.y = (stage.stageHeight - img.height)/2;

daniral
23.11.2009, 00:51
Ну я как бы так и делаю.

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 loaderClass:Class;
private var loaderBitmap: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;
loaderBitmap = new loaderClass();
loaderBitmap.x = loaderBitmap.width / 2 * -1;
loaderBitmap.y = loaderBitmap.height / 2 * -1;
sprLoading.addChild(loaderBitmap);
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);
if(stage.contains(sprLoading))
removeChild(sprLoading);
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;
}
}
}
}

Запускаю через WebSpeed Simulator.
Со скоростью 256 кб.
Не хочет гад стремиться к середине.