29. oktober 2002 - 00:10Der er
42 kommentarer og 1 løsning
Variabler/parametre i attached Component-clip
Jeg har en simpel Flash-film (MX), med en enkel frame med et action-script, der kører i 4x4 rækker og hiver et movieclip (component) ind. MC'et henter JPGs ind, og skal med tiden køre dynamisk også. For nu vil jeg være tilfreds med bare at få vist billedet :)
Actionscript i frame 1: loadMovie(thumbnail,_root);
Component'en er så defineret med en jpg (cover.jpg) som standard, men det virker ikke. Sætter jeg derimod cover direkte ind på thumbnailens plads i componentens loadmovie, virker alt fint.
Burde standard-værdierne ikke virke? Og hvordan kan jeg få dem ind i mit loop, så de defineres runtime?
Thumbframe er en lille animation, der ikke spiller nogen rolle i denne her sammenhæng. Mit problem er nu dels rent faktisk at få hevet variblerne fra filen ind på een gang (i selve hovedfilmen forestiller jeg mig), og derefter at finde den korrekte syntaks i mit MC.
Kan man overhovedet det? Og kan jeg godt have flere filnvne i den samme fil, altså filen vars.txt noget i retning af:
Jeg tror ikke helt, jeg forstår hvad du vil... men lad mig gætte:
Du vil lave en standard billede-holder komponent, som du kan instantiere på din scene via actionscript og for hver komponent angiver du et billede, som denne komponent skal læse ind?
Du laver her efter i din film et loop, der laver 4*4 komponenter og beder dem loade et billede efter indholdet fra en ekstern fil... Har jeg ret sofar?
Dit ovenstående script er rimeligt mærkeligt, da du laver en løkke til at danne 16 komponenter og i hver komponent loader du de 16 billede-filers navne ind (du har loadVariables i din løkke) og i hver komponenthar du endnu en løkke til at lave 16 billeder. Der skal vel kun være ET billede i hver komponent? Derfor skal du vel kun loade variablerne ind EN gang?
Både mht. forståelsen af projektet - og i det mærkelige i mit 16x-loop. Sidstnævnte er dog mest noget forsøgsværk, men jeg mangler som du er inde på, at skille tingene ordentligt ad. Jeg forestiller mig en opdeling i stil med:
- Hovedfilm, der vha. actionscripting hiver et billedloader clip (component?!) ind i 4x4 rækker.
- Clip/component, der foruden en mindre animation, kan acceptere en parameter på en eller anden måde, til at angive hvilket jpg-billede det konkret skal hive ind.
- Denne variabel skal desuden stamme fra en .asp-fil (bruger bare en .txt-fil i eksemplet), og variablerne (billednavnene) skal altså hentes een gang for alle og dernæst 'smides' efter clippet.
Forlag til forbedringer/løsninger vil blive modtget med kyshånd!
Teknisk er jeg ret interesseret i, hvordan man loader variablerne fra filen korrekt, og om man (eller rettere hvordan) kan attache movieclips løbende, men holde filnavnet 'åbent' som en variabel.
Din "komponent" (det er vist ikke en rigtig komponent, men bare et exportable movieclip) skal have to movieclips.
Det ene skal vise status for komponenten: Enten er den kun sat ind, men endnu ikke ved at loade et billede, eller også loader den et billede eller billedet er loaded (det mc er derfor tomt, så det loadede kan ses)
Det andet movieclip er der hvor billedet skal loades ind.
Navnene er "loader" og "picture_holder" for de to ovenstående.
Desuden skal den have noget funktionalitet til at loade billedet, derfor følgende action i første frame af dit mc:
Dette movieclip indeholdende ovenstående to under-movieclips samt koden skal i dit library sættes til exportable med navnet "thumbclip" (som du selv har lavet det)
I din hovedfilm laver du så følgende kode:
fileLoader = new LoadVars(); fileLoader.onLoad = function(succes) { if (succes) { _root.pictures = new Array(); for (i = 0; i < this.rows; i++) { _root.pictures[i] = new Array(); for (j = 0; j < this.cols; j++) { var m = _root.pictures[i][j] = _root.attachMovie("thumbclip", "tf_"+i+"_"+j, 200+i+j); m._x = i*105; m._y = j*120; m.load(this["image_"+i+"_"+j]; } } } } fileLoader.load(vars.txt);
Jeg har prøvet at nærlæse scriptet, og tror jeg har fanget hovedideen i opbygningen. Når jeg kører det, sker der dog ikke det store. Kan det passe, at den sidste kodelinje(fileoder(vars.txt)) skal køres til sidst?
Og så er jeg ikke sikker på, jeg forstår opbygningen af thumbclip-clippet. Jeg har lavet 2 under-clips, men hvad bør de indeholde? Og hvordan er de indbyrdes forbundet?
Hjælp vil blive påskønnet. Flere point eller anden modydelse naturligvis på vej...
fileLoader.load() skal køres til sidst. Først skal man nemlig specificere funktionen, der skal modtage data før man kan bede om dem.
Prøv i din fileLoader.onLoad at tilføje nogle traces:
fileLoader.onLoad = function(succes) { trace("loaded..."); if (succes) { trace("...with succes"); _root.pictures = new Array(); for (i = 0; i < this.rows; i++) { _root.pictures[i] = new Array(); for (j = 0; j < this.cols; j++) { var m = _root.pictures[i][j] = _root.attachMovie("thumbclip", "tf_"+i+"_"+j, 200+i+j); m._x = i*105; m._y = j*120; m.load(this["image_"+i+"_"+j]; trace("picture["+i+"]["+j+"] instantiated to "+m+", load: "+typeof n.load); } } } }
Og fortæl outputtet (så vi kan se, om data overhovedet bliver loaded)
Mht. opbygningen af dit "thumbclip", så skal det (blot mit forslag til opbygning) have tre layers. I det øverste ligger kun kode (den tidligere nævnte). I andet layer ligger dit "loader" subclip som du har givet instance-navn "loader". I nederste layer ligger dit "picture_holder" subclip med netop dette instance-navn...
Men outputtet fra ovenstående traces er interessante... Et problem kan være, at clippet ikke er færdigloaded, før funktionerne kaldes. Hvis det er problemet, så må vi jo hellere lave det om til en "rigtig" komponent!
loaded... ...with succes movieclip: movieclip again: picture[0][0] instantiated to , load: undefined movieclip again: picture[0][1] instantiated to , load: undefined movieclip: movieclip again: picture[1][0] instantiated to , load: undefined movieclip again: picture[1][1] instantiated to , load: undefined
Jeg tilføjede traces og kørte den, inden jeg ændrede mc-komponent-koden, og tracet bliver det samme både før og efter.
Jeg er efterhånden ude på halvdybt vand, så jeg laver lige et kort recap - bare for alle tilfældes skyld :)
Min film består af følgende i frame 1 - og kun det:
fileLoader = new LoadVars(); fileLoader.onLoad = function(succes) { trace("loaded..."); if (succes) { trace("...with succes"); _root.pictures = new Array(); for (i = 0; i < this.rows; i++) { _root.pictures[i] = new Array(); trace("movieclip: "+_root.pictures[i][j]); for (j = 0; j < this.cols; j++) { var m = _root.pictures[i][j] = _root.attachMovie("thumbclip", "tf_"+i+"_"+j, 200+i+j); trace("movieclip again: "+m); m._x = i*105; m._y = j*120; m.load(this["image_"+i+"_"+j]); trace("picture["+i+"]["+j+"] instantiated to "+m+", load: "+typeof n.load); } } } } fileLoader.load("vars.txt");
I mit library har jeg hhv. thumbclip, loader og pictureholder, de to sidstnævnte (indeholdende blot et rektangel i hver sin farve) instantieres med samme navne i hhv. layer 2 og 3 af thumbclip, der i layer 1 har følgende i frame1:
Din onLoad er gal... brug PRÆCIS den jeg beskrev i mit sidst eksempel...
gotoAndPlay("loading") refererer til dit "loader" movieclip, som får besked på at gå hen og afspille din vilkårlige "loading..." animation, som du selv kan definere i dit "loader" movieclip...
Av, der ramte du da vist noget :-/ (min fejl, selvfølgelig...)
thumbclip'en havde stadig Symbol3 som identifier. Jeg ændrede dette til thumbclip, og så skete der pludselig noget. Ellers er Export for actionscript/in forst frame slået til. (den har stadig symbol3 som symbol name, men sådan er det vel?!)
Når jeg kører den får jeg nu fint mit (pink) rektangel fra loader i felt 1, 2 og 4 (felt 1 er øverst til venstre), og de rigtige billeder i felt 1 og 2 - altså ingen billeder i 2 linje (felt 3 og 4), og heller ingen loader i felt 3.
_level0.tf_0_0 initialized load called in _level0.tf_0_0 _level0.tf_0_1 initialized load called in _level0.tf_0_1 _level0.tf_1_0 initialized load called in _level0.tf_1_0 _level0.tf_1_1 initialized load called in _level0.tf_1_1 Error opening URL "file:///D|/FlashDev/IMG_0879.jpg
Woops - update: Jeg nærlæste traacet, og bemærkede den sidste " Der var luft i slutningen af vars.txt, det er nu fjernet, og der er billede på felt 4 nu også. Så loader+billede i 1, 2 og 4 - og en helt tom 3'er (hvilket næsten må være en loop/attach-fejl - eller hvad?)
_level0.tf_0_0 initialized load called in _level0.tf_0_0 _level0.tf_0_1 initialized load called in _level0.tf_0_1 _level0.tf_1_0 initialized load called in _level0.tf_1_0 _level0.tf_1_1 initialized load called in _level0.tf_1_1
_level0.tf_0_0 initialized load called in _level0.tf_0_0, to load: IMG_0876.jpg _level0.tf_0_1 initialized load called in _level0.tf_0_1, to load: IMG_0878.jpg _level0.tf_1_0 initialized load called in _level0.tf_1_0, to load: IMG_0877.jpg _level0.tf_1_1 initialized load called in _level0.tf_1_1, to load: IMG_0879.jpg
Problemet er nok bare, at du ikke har defineret en frame-label i dit "loader" movieclip som er helt tomt og som man derfor kan "se" igennem ned til billedet nedenunder...
Så dit "loader" movieclip skal have to layers. Et til labels, som er:
empty, loading, loaded
I "empty" har du et billede, som vises før noget som helst er begyndt at blive loaded. I "loading" har du en animation over et par frames, der vises mens billedet loader og til sidst har du en "loaded" frame som er helt tom... Sidste frame i din "loading" animation skal selvfølgelig loope via en gotoAndPlay("loading")
Burde det ikke gælde de andre 3 også så? Har uden tvivl formuleret mig semi-ufroståeligt, så lige for en sikkerheds skyld:
I mit loader-clip har jeg smidt en pink firkant ind (lidt forskudt - kan godt ses, når billedet er loadet), så jeg kan se, om den er der eller ej; picture-holderen er grøn, omend den gerne skulle blive erstattet med et billede runtime.
Som færdigt output, når jeg kører filmen, får jeg 3 komplette 'sæt' med hhv. pink baggrund og det konkrete billede, men felt 3, altså nederst i venstre hjørne er helt tomt, hveken min pink loader-firkant eller billedet er der.
Lavede en (meget grim :) loader animation, der dog ikke ændrede så meget. Til gengæld forstod jeg bedre mit eget tidligere spørgsmål ang. gotoandplay("loading") :)
_level0.tf_0_0 initialized, position (0,0) load called in _level0.tf_0_0, to load: IMG_0876.jpg _level0.tf_0_1 initialized, position (0,0) load called in _level0.tf_0_1, to load: IMG_0878.jpg _level0.tf_1_0 initialized, position (0,0) load called in _level0.tf_1_0, to load: IMG_0877.jpg _level0.tf_1_1 initialized, position (0,0) load called in _level0.tf_1_1, to load: IMG_0879.jpg _root.j = 2, type: number _root.i = i, type: string _root.pictures = _level0.tf_0_0,,_level0.tf_1_0,_level0.tf_1_1, type: object _root.fileLoader = image%5F1%5F1=IMG%5F0879%2Ejpg&image%5F0%5F1=IMG%5F0878%2Ejpg&image%5F1%5F0=IMG%5F0877%2Ejpg&image%5F0%5F0=IMG%5F0876%2Ejpg&cols=2&rows=2&onLoad=%5Btype%20Function%5D, type: object _root.ThumbClass = [type Function], type: function _root.$version = WIN 6,0,21,0, type: string _root.tf_1_1 = _level0.tf_1_1, type: movieclip _root.tf_1_0 = _level0.tf_1_0, type: movieclip _root.tf_0_0 = _level0.tf_0_0, type: movieclip
Sad og nærlæste selve loopstrukturen, og kunne ikke se der skulle være noget galt, men det var jo heller ikke her den lå :)
Det virker perfekt nu - og jeg taster vist heller ikke helt efter bogen...
Jeg takker mange gange for en lærerig session - hvis jeg kan gøre noget til gengæld, så sig endelig til!
Tilbage er blot at bakse det over i det rette design, få sat .asp-filen op, og springe ud i næste lille job; at få lagt dynamiske links til forstørrelserne ind...skal nok gå galt :)
Så vidt jeg ved er det vist nok den første rigtige komponent, der er udviklet via eksperten... Så tillykke med det til os begge to... :o)
/Barklund
PS: Det er faktisk også min første komponent, da jeg aldrig har tid til at lege i MX, da jeg på arbejdet stadig er nødt til at bruge Flash5 grundet MX's relativt ringe udbredelse...
Well, nu fik jeg rettet til, fikset asp og lagt i et reelt design. Nu skal jeg så til at tilføje links til thumbnails'ne, og lurede på, hvordan det gøres smartest? I praksis hedder de store billeder det samme, de ligger blot i et andet bibliotek - for dynamikkens skyld kunne man dog overveje at hente dem fra vars.txt (der jo i virkeligheden er en asp-fil, så lidt mere autogenerering er ok) - med mindre det går ud over performance.
Men spørgsmålet er egentlig: Laves det smartest som et parameter-clip som fjerde lag i thumbclip'en, eller skal man ud i noget helt fjerde? Jeg forestiller mig, at forstørrelsen blot skal loades ind oven på thumbnails'ne, evt. med et halvgennemsigtigt lag imellem, så det er vel blot noget loadmovie igen jeg er ude i?
Tja... Det er sådan set helt op til dig. Men hvis du vil loade forstørrelserne ind i flash også, så vil jeg foreslå, at du tilføje et fjerde lag i dit thumbclip og laver en usynlig knap her. Denne har et script, der er defineret i din initclip som en prototype-funktion...
Ude i din scene har du et layer med et helt femte clip. Dette har to frames, en tom (til når ingen forstørrelse vises) og en med et tomt clip i midten til at holde forstørrelsen og en halvgennemsigtig baggrund samt en luk knap...
Knappen og dens tilhørende action kan eventuelt scriptes ind istedet for at placeres manuelt - det vil være lidt smartere...!
Synes godt om
Ny brugerNybegynder
Din løsning...
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.