webForumDet fria alternativet

Ladda ned restrerande scener

Flash

4 svar · 594 visningar · startad av ejick

Medlem sedan mars 2001895 inlägg
Frågan#1

Hej,

jag håller på med en, i dagsläget, enklare flashanimation. Huvudfilen består av en fil, som i sin tur innehåller totalt sex scener. Fyra av dessa scener imorterar andra swf-filer.

Jag håller på att försöka göra en preloader, alltså ladda hem all information innan någonting, förutom förstascenen visas. (jag vet att det i detta fall är onödigt med flera olika swf-filer, men på sikt känns det som en smidig lösning och underlättar fraför allt arbetet i dagsläget eftersom informationen blir uppdelad)

I alla fall, tanken är att movieklipp (innehållande texten "laddar") animeras genom att "darra" när filerna laddas. När allt är inladdat ska man gå vidare till nästa frame i första scenen för att där efter få ett litet intor av ett movieklipp och sedan vid frame 20 ungeför gå vidare till nästa scen.

Hur som helst, jag har gjort följande lösning (som inte funkar så bra)

i första framen, första scenen:

_root.createEmptyMovieClip("preloader",1);
             // samtliga extrafiler
   	preloader.loadMovie("a.swf");
	preloader.loadMovie("b.swf");
	preloader.loadMovie("c.swf");
	preloader.loadMovie("d.swf");

utöver detta startar även movieklippet. Kanske att man behöver skapa en preloader för varje loadMovie?

i alla fall, nästa frame i scenen innehåller:

onEnterFrame = function () {
	preloader._visible = false;
	if(preloader.getBytesLoaded() == preloader.getBytesTotal()) {
		preloader.removeMovieClip();
	}
	if (_root.getBytesLoaded() == _root.getBytesTotal()) {
		gotoAndStop(nextFrame);
	}
}

här är det tänkt att den ska ladda ned först alla extrafiler, sedan den resten av huvudfilen, alltså de restrerande 5 scenerna. Detta verkar inte funka när jag minskar ned anslutningshastigheten i kontrollrutan och har ingen aning om hur jag ska gå vidare. Skulle vara väldigt tacksam om någon kunde komma med tips och idéer eller kanske en lösning.

God fortsättning :)

Medlem sedan nov. 2004149 inlägg
#2

Hej,
Jag har kanske inte till fullo förstått vad det är du försöker göra, men spontant vill jag ändå ge dig följande råd:

1. Använd ALDRIG scener. Dessa orsakar oftast bara svår huvudvärk och borde tas bort i nästa version av Flash. Alla som jobbat med Flash en längre tid torde instämma i detta...

2. Använd istället movieClips som kan aktiveras t.ex. när spelhuvudet passerar en viss frame.

3. Eller: Ladda in nya swf:er (movieclips) först när de verkligen behövs - dvs, försök inte att "preloada" hela rasket... Då kan du ju lika gärna lägga allt i en och samma swf från början...

4. Lägg en enkel liten preloader i början av varje swf. Jag använder numera alltid något i den här stilen:

totalbytes = getBytesTotal();
loadedbytes = getBytesLoaded();
percentdone = Math.round((loadedbytes/totalbytes)*100);
if (percentdone>=100) {
gotoAndPlay("loadexit");
} else {
gotoAndPlay("loader");
}

Frame 1 heter alltså "loader".
På frame 2 ligger ovanstående script.
Frame 3 heter "loadexit" och därmed knallar spelhuvudet vidare till det egentliga innehållet.

Detta lilla script har aldrig någonsin krånglat.

Ibland, när jag vet att laddningen kan ta mer än ca två sekunder lägger jag för tydlighetens skull till lite grafik i form av t.ex. ett snurrande hjul för att indikera att datorn "jobbar".

Principen är alltså att ladda in nya animationer (movieClips), ny data, ny text, ny grafik (and whatsoever) först när behovet uppstår.

Resultatet blir att användaren/besökaren upplever att laddningen går blixtsnabbt och att allt är "seamless".

/Alar

Medlem sedan mars 2001895 inlägg
#3

Tack för hjälpen och tipsen!

Problemet är att jag kanske uttryckte mig lite luddigt. Det är så att jag redan har en flashfilm och ogärna vill ändra i den som det är nu.

Jag undrar om det finns ett sätt att ladda in nästkommande scener samt att ladda in flera swf-filer i början. Att det är smidigare att ladda in allt efterhand köper jag, men i detta fallet är det alltså en annan metod jag efterfrågar.

Medlem sedan maj 2003750 inlägg
#4

Du kan bara ladda in en film åt gången i ett filmklipp så om du anropar loadMovie fem gånger på raken i samma kodsnutt så kommer enbart den sista filmen att laddas. Så antingen måste du ladda dessa en åt gången i samma filmklipp eller så parallellt i fem olika filmklipp.

Dessutom så i onEnterframe skriptet så kollar den enbart efter när huvudfilmen är klar. If-satsen som kollar om filmen i preloader laddat klart påverkar inte if-satsen som kollar om huvudfilmen laddat.

Så jag skulle tro att det du eftersöker är någonting liknande detta:

Första bildrutan:

var movies = ["a", "b", "c", "d"]

this.createEmptyMovieClip("preloader",1);

for(i = 0; i < movies.length; i++)
{
    this.preloader.createEmptyMovieClip("movie" + i , i);
    this.preloader["movie" + i].loadMovie(movies[i] + ".swf");
}

this.preloader._visible = false;

Nästa bildruta:


this.onEnterFrame = function()
{
     var t = 0;
     var l = 0;
     var tmp = null;
     var finnished = 0;

     for(i = 0; i < movies.length; i++)
     {
           tmp = this.preloader["movie" + i];
            l = tmp.getBytesLoaded();
            t = tmp.getBytesTotal();
            if(l == t && t > 4)
                finnished++;
     }

     if(finnished == movies.length)
     {
          if(this.getBytesLoaded() == this.getBytesTotal())
          {
              this.nextFrame();
              delete this.onEnterFrame;
          }
     }
}

/Mirandir

Medlem sedan mars 2001895 inlägg
#5

Tack för hjälpen!

Det var precis vad jag var ute efter. Lade till gotoAndPlay så nu kommer man vidare också ;)

Var inne på att de preloader olika namn i mitt första script, detta motsvaras ju av din arrayfunktion som dock är 100ggr smidigare :)

274 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
131 ms — deklarationer (db)
0 ms — hämta statistik (cache)
140 ms — hämta tråd, inlägg och bilagor (db)
128 ms — ändringar (db)