16. februar 2005 - 16:52Der er
18 kommentarer og 1 løsning
vedr. brug af funktioner
Hej,
Stadigvæk newbee mht. til actionscript og har nu involveret mig ind i et større projekt, og har derfor brug for lidt hjælp.
Helt generelt er vores site bygget 100% i flash, hvor det er laodet en vektor fil i baggrund som fylder 100% af skærmstørrelsen og som skaleres når brugeren ændre på sin vindues størrelse. Alt tekst/billeder osv. ligger i en hvid som er loadet ind oven på baggrundsbilledet og har en fast størrelse og bliver altså ikke skaleret. Mit spg. går gå de ting som jeg har intention om at ændre på denne hvide boks.
LAd os antage vi står på forsiden, og at i den hvide boks (hvis vi kalder den hovedboksen) er der blot en velkomst tekst og et par nyheder. Når man så trykker på et punkt i menuen skal følgende ske (lad os sige at man trykker på 'kontakt'):
1) Der skal ligge et movieclip som i starten har alpha=0, den skal så scriptes således den går fra alpho=0 til alpha lig 100%, det skal gøres således det ser ud som at indholdet i hovedboksen fader ud. Når dette skridt er færdigt, skal den gå videre til næste skridt
2) Derefter skal hovedboksen trække sig sammen. Dette vil jeg gøre først ved at scalere den på y aksen, således den bliver ca. 1/5 af størrelsen, hvorefter den gør det samme på x aksen bagefter. Resultatet er jo så at jeg har en lille boks. Her har jeg tænkt mig at anvende easing effekterne, så det bliver en fed transition.Funktionen skal så registrere at den har nået den ønskede størrelse og hoppe videre til næste skridt.
3) Her skal der så komme så komme et preloading script, der loader kontakt oplysninger ind (den loader en ekstern .swf ind i et tomt movieclip) Funktionen skal så registrere at den har loadet undersiden 100% og gå videre til næste skridt.
4)Herefter skal boksen udvide sig igen, altså først Scale._x og derefter scale._y, så den når sin oprindelige størrelse. Når den har registeret at dette er sket, skal den udføre det sidste skridt.
5) Herefter skal movieclippet der ligger henover indholdet gå fra alpha=100% til alpha=0%, således at kontakt oplysningerne bliver tilgængeligt
Puuuha, det jeg så sidder tilbage med er en masse spg. tegn til hvordan man laver det.
Jeg har en ide om at jeg vil lave en funktion som indeholde de seks underfunktioner (1) - (6). Det essentiele er at den først skal gå videre til næste skridt, når det forudgående skridt er gennemført.
Jeg spørger ikke til hvordan man skriver hele koden, men til om det overhovedet kan lade sig gøre og hvordan man laver hovedrammen til et sådant script...
Jeg har hurtigt skimtet det igennem og umiddelbart ville heg dele det op i flere små funktioner. Dvs. at når hvert enkelt funktion er "færdig" så kalder den den næste i rækken...
det er easy, du skal bruge setInterval functionen. f.eks
function one(){ trace("function one") nextFunction0 = setInterval(two, 2000) } function two(){ trace("function two") nextFunction1 = setInterval(three, 4000) clearInterval(nextFunction0) } function three(){ trace("function three") clearInterval(nextFunction1) } function one()
Sætter du dette script ind i flash, vil du først kalde funktion 1. 2 sek. efter vil function 2 blive kaldt og 4 sek. efter vil funktion 3 blive kaldt. Håber du kan se mønstret. På denne måde kan du udbygge til så mange funktioner du vil have.
Hey Rune, ok, kan godt følge din hovedtanke. Problemet med at bruge setinterval funktion er vel at den ikke tager højde for brugerens båndbredde.Altså det vil ikke tage den samme tid for en bruger med 56 kbps forbindelse at loade en underside som en med en adsl og ligeledes vil en person med en større computerkraft.
Findes der andre muligheder at løse problemet...
Mht. til animation af boksen som jeg henviser til på engrando.ee er det besværligt at lave?
hvis du brugte en tweening funktion til at animere med, ved du hvor lang tid animationen er om komme fra A til B. Ergo ved du også hvornår en evt. anden tweening funktion skal starte, altså hvor langt intervallet skal være. Derfor ville jeg bruge setInteval til at kalde de forskellige tweening funktioner der animerer outroen indtil den rammer preloader funktionen, når dette sker er det klart at alle intervaller skal være clearet indtil preloaderen har loaded færdig. Når den har loaded færdig kickstarter den så en række af andre intervaller der kalder funktioner delvist som animerer introen. På denne måde sikrer du at der ikke foregår nogle animationer mens den preloader.
jeg har faktsik fundet en funktion som jeg mener er bedre on.functionend tror jeg den hedder og virker forbavsende godt - den eksikveres så snart den tidligere er færdig - har du nogen erfaring med den?
Nå, nu begynder jeg selv at have noget, men jeg har et par små problemer med at loade en ekstern fil vha. af samme syntaks som jeg allerede bruger: Dette er hvad jeg har
import mx.transitions.Tween; import mx.transitions.easing.*; var tween_handlernul:Object = new Tween(menu, "_x", Elastic.easeInOut, 100, 200, 1, true); var tween_handleret:Object = new Tween(meny, "_x", Elastic.easeInOut, 100, 200, 1, true); tween_handleret.onMotionFinished = function() { var tween_handlerto:Object = new Tween(menu, "_alpha", Elastic.easeInOut, 100, 0, 0.2, true); var tween_handlertre:Object = new Tween(meny, "_alpha", Elastic.easeInOut, 100, 0, 0.2, true); tween_handlertre.onMotionFinished = function() { var tween_handler1:Object = new Tween(front, "_xscale", Elastic.easeInOut, 200, 100, 1.5, true); var tween_handler3:Object = new Tween(back, "_xscale", Elastic.easeInOut, 200, 100, 1.5, true); tween_handler1.onMotionFinished = function() { var tween_handler2:Object = new Tween(front, "_yscale", Elastic.easeInOut, 250, 100, 1.5, true); var tween_handler4:Object = new Tween(back, "_yscale", Elastic.easeInOut, 250, 100, 1.5, true); trace("onMotionFinished triggered"); tween_handler4.onMotionFinished = function() { //HER VIL JEG PRELOADE MIN .SWF tween_handler4.onMotionFinished = function() { var tween_handler5:Object = new Tween(front, "_yscale", Elastic.easeInOut, 100, 250, 1.5, true); var tween_handler7:Object = new Tween(back, "_yscale", Elastic.easeInOut, 100, 250, 1.5, true); trace("onMotionFinished triggered"); tween_handler7.onMotionFinished = function() { var tween_handler6:Object = new Tween(front, "_xscale", Elastic.easeInOut, 100, 240, 1.5, true); var tween_handler8:Object = new Tween(back, "_xscale", Elastic.easeInOut, 100, 240, 1.5, true); trace("onMotionFinished triggered"); }; }; }; }; }; };
og det virker fint. Hvor jeg har skrevet //HER VIL JEG PRELOADE MIN .SWF, vil jeg prealode min ekstern underside ind. Hvordan laver man loadmovie med den syntaks som jeg har anvendt, kan man blot lave noget med var loadmovie eller hvordan?
Desuden så er overstående kode lavet sådan at den trigger så snart filmen åbner, hvordan laver jeg den så den trigger når man trykker på en knap??? Kan man evt. kalde hele overstående kode for en bestemt funktion, så når man trykker på en button kalder den funktion som indeholder alle overstående "underfunktioner"?
lad mig omformulere, jeg ved godt hvordan jeg skal kalde loadmovie. Det jeg er i tvivl om er, hvordan sikre jeg mig at min underfilm er 100% loadet før den går videre til næste skridt....??????????
import mx.transitions.Tween; import mx.transitions.easing.*; var tween_handlernul:Object = new Tween(menu, "_x", Elastic.easeInOut, 100, 200, 1, true); var tween_handleret:Object = new Tween(meny, "_x", Elastic.easeInOut, 100, 200, 1, true); tween_handleret.onMotionFinished = function() { var tween_handlerto:Object = new Tween(menu, "_alpha", Elastic.easeInOut, 100, 0, 0.2, true); var tween_handlertre:Object = new Tween(meny, "_alpha", Elastic.easeInOut, 100, 0, 0.2, true); tween_handlertre.onMotionFinished = function() { var tween_handler1:Object = new Tween(front, "_xscale", Elastic.easeInOut, 200, 100, 1.5, true); var tween_handler3:Object = new Tween(back, "_xscale", Elastic.easeInOut, 200, 100, 1.5, true); tween_handler1.onMotionFinished = function() { var tween_handler2:Object = new Tween(front, "_yscale", Elastic.easeInOut, 250, 100, 1.5, true); var tween_handler4:Object = new Tween(back, "_yscale", Elastic.easeInOut, 250, 100, 1.5, true); trace("onMotionFinished triggered"); tween_handler4.onMotionFinished = function() { loadMovie("underside.swf",_root.front.container); //tween.onMotionFinished = function() { var tween_handler5:Object = new Tween(front, "_yscale", Elastic.easeInOut, 100, 250, 1.5, true); var tween_handler7:Object = new Tween(back, "_yscale", Elastic.easeInOut, 100, 250, 1.5, true); trace("onMotionFinished triggered"); tween_handler7.onMotionFinished = function() { var tween_handler6:Object = new Tween(front, "_xscale", Elastic.easeInOut, 100, 240, 1.5, true); var tween_handler8:Object = new Tween(back, "_xscale", Elastic.easeInOut, 100, 240, 1.5, true); trace("onMotionFinished triggered"); tween_handler8.onMotionFinished = function() { var tween_handler6:Object = new Tween(_root.front.cover, "_alpha", Photo.easeIn, 100, 0, 2, true);
Kig på MovieClipLoader klassen - den har en onLoadInit, som bliver kaldt, når din underfilm er helt korrekt loaded. Så kan du først loade den i et ikke-synligt movieclip mens du viser din preloader bar, og ved onLoadInit kalder du den næste ease-funktion, og når den så er easet op i størrelse, så viser du dit indhold igen.
Barklund - nu har jeg erfaring med at du er super skarp til Action Script så hvis du vil hjælpe mig de sidste skridt, skal du nok få point, jeg kan også sagtens oprette et ekstra spg. hvis der er behov for flere point.
Jeg har prøvet at sætte moviecliploader ind:
import mx.transitions.Tween; import mx.transitions.easing.*; var tween_handlernul:Object = new Tween(menu, "_x", Elastic.easeInOut, 100, 200, 1, true); var tween_handleret:Object = new Tween(meny, "_x", Elastic.easeInOut, 100, 200, 1, true); tween_handleret.onMotionFinished = function() { var tween_handlerto:Object = new Tween(menu, "_alpha", Elastic.easeInOut, 100, 0, 0.2, true); var tween_handlertre:Object = new Tween(meny, "_alpha", Elastic.easeInOut, 100, 0, 0.2, true); tween_handlertre.onMotionFinished = function() { var tween_handler1:Object = new Tween(front, "_xscale", Elastic.easeInOut, 200, 100, 1.5, true); var tween_handler3:Object = new Tween(back, "_xscale", Elastic.easeInOut, 200, 100, 1.5, true); tween_handler1.onMotionFinished = function() { var tween_handler2:Object = new Tween(front, "_yscale", Elastic.easeInOut, 250, 100, 1.5, true); var tween_handler4:Object = new Tween(back, "_yscale", Elastic.easeInOut, 250, 100, 1.5, true); trace("onMotionFinished triggered"); tween_handler4.onMotionFinished = function() { var mcl:MovieClipLoader = new MovieClipLoader(); var mclListener:Object = new Object(); mcl.addListener(mclListener); mclListener.onLoadProgress = function(container, bl, bt) { var percentage = Math.round(bl / bt * 100); trace("percentage"); }; mclListener.onLoadComplete = function(container) { // do what you want trace("finished!psychomotherfucker"); }; mcl.loadClip("underside.swf", _root.front.container);
//tween.onMotionFinished = function() { var tween_handler5:Object = new Tween(front, "_yscale", Elastic.easeInOut, 100, 250, 1.5, true); var tween_handler7:Object = new Tween(back, "_yscale", Elastic.easeInOut, 100, 250, 1.5, true); trace("onMotionFinished triggered"); tween_handler7.onMotionFinished = function() { var tween_handler6:Object = new Tween(front, "_xscale", Elastic.easeInOut, 100, 240, 1.5, true); var tween_handler8:Object = new Tween(back, "_xscale", Elastic.easeInOut, 100, 240, 1.5, true); trace("onMotionFinished triggered"); tween_handler8.onMotionFinished = function() { var tween_handler9:Object = new Tween(_root.front.cover, "_alpha", Photo.easeIn, 100, 0, 2, true);
trace("onMotionFinished triggered"); tween_handler9.onMotionFinished = function() { var tween_handler11:Object = new Tween(menu, "_alpha", Elastic.easeInOut, 0, 100, 0.2, true); var tween_handler12:Object = new Tween(meny, "_alpha", Elastic.easeInOut, 0, 100, 0.2, true); trace("onMotionFinished triggered"); tween_handler11.onMotionFinished = function() { var tween_handlernul:Object = new Tween(menu, "_x", Elastic.easeInOut, 200, 70, 1, true); var tween_handleret:Object = new Tween(meny, "_x", Elastic.easeInOut, 200, 70, 1, true); }; }; }; }; }; }; }; }; //};
________________________________________
Jeg har dog lige de sidste ting jeg gerne vil lave.
1) Vil du mene at moviecliploader funktionen er skrevet korrekt, eller er der en bedre metode?? Mit mulige problem ligger "måske"i at mcl.loadClip("underside.swf", _root.front.container); kommer efter linjen mclListener.onLoadComplete = function(container)
Så vidt jeg læser den vil det sige at den først loader filmen ind efter den er "oncomplete" men hvordan ved den så hvilken film der skal være "oncomplete" når den først kalder den vha. loadclip efter...?? 2) Hvordan kan man tilføje en prealoder ? Det der sker er at min hovedboks resizer hvorefter jeg vil displaye en preloader indtil den har detectet at underside.swf er fuld loadet, og så skal den resize ud igen 3)og til sidst, hele den overstående kode ønsker jeg at kalde når man trykker på en knap i menuen... Kan man lave det sådan at når man trykker på en knap, at den kalder overstående funktioner?? Kan man lave en funktion som indeholde alle "under" funktioner som er beskrevet ovenfor???
mit problem så vidt jeg kan se er at den først skal begynde at skalere på y ledet efter den har loadet underside.swf ind (denne linje: var tween_handler5:Object = new Tween(front, "_yscale", Elastic.easeInOut, 100, 250, 1.5, true);)
som koden er nu begynder den at skalere med det samme, hvordan sikre jeg at skaleringen først sker efter at den skal vræe loadet helt færdigt???
Det melder den fejl på - jeg har dog lige fundet en anden vej rundt som faktisk fungerer.. Kan du hjælpe mig med hvordan preloaderen dur..??? Og hvordan jeg kalder alle disse funktioner ved tryk på én knap?
/J
Kode:
import mx.transitions.Tween; import mx.transitions.easing.*; var tween_handlernul:Object = new Tween(menu, "_x", Elastic.easeInOut, 100, 200, 1, true); var tween_handleret:Object = new Tween(meny, "_x", Elastic.easeInOut, 100, 200, 1, true); tween_handleret.onMotionFinished = function() { var tween_handlerto:Object = new Tween(menu, "_alpha", Elastic.easeInOut, 100, 0, 0.2, true); var tween_handlertre:Object = new Tween(meny, "_alpha", Elastic.easeInOut, 100, 0, 0.2, true); tween_handlertre.onMotionFinished = function() { var tween_handler1:Object = new Tween(front, "_xscale", Elastic.easeInOut, 200, 100, 1.5, true); var tween_handler3:Object = new Tween(back, "_xscale", Elastic.easeInOut, 200, 100, 1.5, true); tween_handler1.onMotionFinished = function() { var tween_handler2:Object = new Tween(front, "_yscale", Elastic.easeInOut, 250, 100, 1.5, true); var tween_handler4:Object = new Tween(back, "_yscale", Elastic.easeInOut, 250, 100, 1.5, true); trace("onMotionFinished triggered"); tween_handler4.onMotionFinished = function() {
_root.traceBox.vScrollPolicy ="on"; //trace function function myTrace(msg) { _root.traceBox.text += msg + newline; _root.traceBox.vPosition = _root.traceBox.maxVPosition; } /*********************************************************************/ //init var myMCL = new MovieClipLoader(); /*********************************************************************/ //callbacks myMCL.onLoadStart = function (targetMC) { var loadProgress = myMCL.getProgress(targetMC); myTrace ("The movieclip " + targetMC + " has started loading"); myTrace("Bytes loaded at start=" + loadProgress.bytesLoaded); myTrace("Total bytes loaded at start=" + loadProgress.bytesTotal); myTrace("____________________________________"); } myMCL.onLoadProgress = function (targetMC, loadedBytes, totalBytes) { myTrace ("movie clip: " + targetMC); myTrace("Bytes loaded at progress callback=" + loadedBytes); myTrace("Bytes total at progress callback=" + totalBytes); myTrace("____________________________________"); } myMCL.onLoadComplete = function (targetMC) { myTrace (targetMC + " has finished loading."); var loadProgress = myMCL.getProgress(targetMC); myTrace("Bytes loaded at end=" + loadProgress.bytesLoaded); myTrace("Bytes total at end=" + loadProgress.bytesTotal); myTrace("____________________________________"); } myMCL.onLoadInit = function (targetMC) { myTrace ("Movie clip:" + targetMC + " is now initialized"); targetMC._width = 400; targetMC._height = 500; myTrace("____________________________________"); } myMCL.onLoadError = function (targetMC, errorCode) { myTrace ("ERRORCODE:" + errorCode); myTrace (targetMC + "Failed to load its content"); myTrace("____________________________________"); } /********************************************************************/ //load the files in to their respective targets myMCL.loadClip("underside.swf","_root.container"); //myMCL.loadClip("test2.swf", "_root.myMC2"); //myMCL.loadClip("somepic.jpg", "_level0.myMC3");
//tween.onMotionFinished = function() { var tween_handler5:Object = new Tween(front, "_yscale", Elastic.easeInOut, 100, 250, 1.5, true); var tween_handler7:Object = new Tween(back, "_yscale", Elastic.easeInOut, 100, 250, 1.5, true); trace("onMotionFinished triggered"); tween_handler7.onMotionFinished = function() { var tween_handler6:Object = new Tween(front, "_xscale", Elastic.easeInOut, 100, 240, 1.5, true); var tween_handler8:Object = new Tween(back, "_xscale", Elastic.easeInOut, 100, 240, 1.5, true); trace("onMotionFinished triggered"); tween_handler8.onMotionFinished = function() { var tween_handler9:Object = new Tween(_root.cover, "_alpha", Photo.easeIn, 100, 0, 2, true);
trace("onMotionFinished triggered"); tween_handler9.onMotionFinished = function() { var tween_handler11:Object = new Tween(menu, "_alpha", Elastic.easeInOut, 0, 100, 0.2, true); var tween_handler12:Object = new Tween(meny, "_alpha", Elastic.easeInOut, 0, 100, 0.2, true); trace("onMotionFinished triggered"); tween_handler11.onMotionFinished = function() { var tween_handlernul:Object = new Tween(menu, "_x", Elastic.easeInOut, 200, 70, 1, true); var tween_handleret:Object = new Tween(meny, "_x", Elastic.easeInOut, 200, 70, 1, true); }; }; }; }; }; }; }; }; //};
1( Ja, det gir jeg ret i, men er desværre ikke ret skarp til AS så derfor har jeg ikke så meget struktur endnu.
Det jeg godt kunne tænke mig var at mens den loader underfilmen ind underside.swf at den så viser en prealoder. Enten bare et stykke grafik der viser loader eller et almindeligt load script??? Skal jeg evt. sende .fla filen?
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.