MovieClip Rekonstruksjon med SharedObject Class

Under denne opplæringen lærer vi hvordan du implementerer SharedObject-klassen. Vi lagrer alle de essensielle dataene til en MovieClip lokalt, og laster det opp neste gang programmet åpnes!

Vi fant denne fantastiske forfatteren takket være FlashGameLicense.com, stedet å kjøpe og selge Flash-spill.

Takk til manicho for harddiskikonet.


Endelig resultatforhåndsvisning

La oss se på det endelige resultatet vi vil jobbe for:

Doodle et bilde i boksen med musen, og klikk på Lagre-knappen. Oppdater denne siden i nettleseren din, og klikk Last inn. Du får se din doodle dukker opp igjen, har blitt lastet fra harddisken din; bakgrunns animasjonen vil til og med være på samme ramme som det var før!


Trinn 1: Sette opp vår dokumentklasse

La oss begynne med å opprette en ny .fla. Lagre det og åpne egenskapspanelet i Flash. Jeg bruker Flash CS5, men denne opplæringen skal fungere med alle Flash CS-versjoner. I egenskapspanelet trykker du på Redigere knappen og kontroller at innstillingene dine er identiske med bildet nedenfor:


Trinn 2: Dokumentklasseoppsett

Nå som vi har satt opp vår .fla, la oss starte vår Dokumentklasse. Å starte, åpne din favoritt ActionScript-kodeditor og lagre en .as-fil som heter "Main.as" i samme katalog som din .fla. Deretter går du inn i "Publiser" -panelet av Flash. Sett "Class" -feltet til "Main". Åpne nå Main.as, og kopier og lim inn følgende kode for å lage vår hoveddokumentklasse.

 pakke import flash.display.Bitmap; importer flash.display.BitmapData; importer flash.display.Graphics; importer flash.display.Shape; importer flash.display.Sprite; importere fl.controls.ComboBox import flash.events.Event; importer flash.events.MouseEvent; importer flash.geom.Matrix; importer flash.geom.Rectangle; importer flash.net.SharedObject; offentlig klasse Hoved utvider Sprite offentlig funksjon Main (): void 

Trinn 3: Vårt hovedobjekt

Nå skal vi lage vår viktigste MovieClip. Det vil inneholde 3 rammer. Hver med en farget form. Tegn et rødt rektangel, sett det inn i en MovieClip med F8 og sett navnet på MovieClip til "myObject". Pass på at registreringspunktet er øverst til venstre. Deretter oppretter du to nye tomme rammer innenfor MovieClip. Fyll en opp med en grønn trekant og den andre med en blå sirkel.

Det endelige resultatet skal se litt ut som dette:


Trinn 4: Bruke ComboBox

Nå skal vi bruke en ComboBox, som egentlig er en rullegardinliste. Pass på at forekomsten av myObject på scenen også er merket myObject. Åpne deretter: Vindu> Komponenter og dra "ComboBox" -elementet til biblioteket. Hvis du ikke bruker Flash IDE, må du Høyreklikk> Eksporter til SWC ComboBox i biblioteket.

Nå kan vi lage variabelen "myComboBox", plassert over konstruktørfunksjonen.

 private var myComboBox: ComboBox = ny ComboBox ()

Deretter legger du til følgende kode i hovedkonstruenten din ():

 // Stopper myObject MovieClip på den første rammen minObject.gotoAndStop (1) // Legger til følgende objekter i ComboBox og gir dem hver unike etiketter myComboBox.addItem (label: "Rectangle") myComboBox.addItem (label: "Sirkel") myComboBox.addItem (label: "Triangle") // Legger til ComboBox addChild (myComboBox) // Flytter den til de riktige koordinatene myComboBox.move (280.150)

Her er et øyeblikksbilde av hva søknaden din skal se ut når du kjører:


Trinn 5: Endring myObject rammer

Vi vil at vår MovieClip skal endre rammer når vi velger et annet element!

La oss begynne med å legge til en EventListener til vår konstruktør - Event.CHANGE-hendelseslytteren - som sjekker for å se når det valgte objektet i ComboBox endres. Dette er akkurat når brukeren velger et nytt ComboBox-element.

 myComboBox.addEventListener (Event.CHANGE, changeObjectFrame)

Neste skal vi opprette funksjonen changeObjectFrame (). Denne funksjonen kontrollerer for å se hva den nåværende etiketten på ComboBox er, hvilket er navnet på objektet brukeren har valgt. Det vil da gå til riktig ramme av myObject for å vise den valgte objekttypen.

 privat funksjon changeObjectFrame (e: Event): void //myComboBox.selectedLabel er navnet på det nåværende objektet som vi definerte tidligere ... hvis (myComboBox.selectedLabel == "Rectangle") myObject.gotoAndStop (1) hvis myComboBox.selectedLabel == "Triangle") myObject.gotoAndStop (2) hvis (myComboBox.selectedLabel == "Circle") myObject.gotoAndStop (3)

Du kan nå gå videre og kompilere søknaden. Du bør kunne bytte til et annet objekt ved å velge det fra rullegardinmenyen.


Trinn 6: Legge til animasjon

Deretter la vi legge til litt animasjon til vårt program. Gå inn i myObject MovieClip på den første rammen. Velg alt det røde rektangelet og trykk F8 for å slå det inn i en MovieClip. Pass på at registreringspunktet er øverst til venstre. Gjør dette med hver form inni myObject Filmklipp

Deretter må vi gi hver MovieClip en animasjon. Gå inn i rektangelformen MovieClip og Høyreklikk> Opprett Form Tween på den røde formen fylling.

Velg deretter den 60. rammen av MovieClip på tidslinjen, og trykk F6 for å opprette en ny keyframe. Gjør dette med den 30. rammen også. Nå kan du bare gå til den 30. rammen og endre fargen på formfyllingen. Jeg har valgt å bytte fargen til en gylden oransje. Nå, hvis du spiller animasjonen, skal fargen endres fra Rød> Oransje> Rød.

Gå videre og gjør dette for hver form i myObject Filmklipp. Nå kan du gå videre og kompilere søknaden; Hver valgt form vil endre farger.

Gjeldende søknad skal fungere slik:


Trinn 7: Doodle Canvas

La oss nå tillate brukeren å tegne en liten tilpasset doodle på MovieClip. Dette ligner på min siste opplæring der vi tillot brukeren å tegne en tilpasset design på spilleren. Vi vil imidlertid ta det et skritt videre i denne opplæringen ved å la brukeren lagre sin melding. Men la oss lagre det for senere!

La oss begynne med å sette opp en forekomst av Shape-klassen. Legg til denne koden over konstruktøren din:

 private var myCanvas: Shape = new Shape ()

Deretter skal vi legge til variabelen myCanvas til scenen ... Legg denne koden til bunnen av konstruktøren vår.

 addChild (myCanvas))

Trinn 8: Doodles

Vi gjør det veldig fort. Hvis du vil ha mer forklaring på hvordan du bruker Form-klassen til tegning, vennligst sjekk min andre veiledning.

Begynn med å opprette en mouseIsDown-variabel ...

 // Sjekk for å se om musen er nede privat var mouseIsDown: Boolean = false

Nå fortsett og legg til følgende hendelseslyttere:

 stage.addEventListener (MouseEvent.MOUSE_MOVE, drawDoodle) stage.addEventListener (MouseEvent.MOUSE_DOWN, mouseDown) stage.addEventListener (MouseEvent.MOUSE_UP, mouseUp)

Og her er de 3 funksjonene som er knyttet til EventListeners:

 privat funksjon mouseUp (e: MouseEvent): void mouseIsDown = false privat funksjon mouseDown (e: MouseEvent): void mouseIsDown = true // Flytter musepekeren til musen minCanvas.graphics.moveTo (myCanvas.mouseX, myCanvas.mouseY) ;  Private funksjon drawDoodle (e: MouseEvent): void // Hvis musen klikkes om (mouseIsDown) // Gjør tegneinnstillinger rett myCanvas.graphics.lineStyle (5, 0, 1) // Tegner dræplinjen myCanvas. graphics.lineTo (myCanvas.mouseX, myCanvas.mouseY); 

Nå kan du teste programmet og det skal tegne seg fint. Imidlertid har vi fortsatt ikke begrenset tegningens plass på lerretet vårt, så tegninger utenfor myObject-grensen viser fortsatt. I neste trinn vil vi løse alt dette!


Trinn 9: Maskering

I min tidligere opplæring var maskeringsprosessen veldig enkelt fordi hvert maskerte objekt forblir det samme gjennom hele applikasjonen. Denne gangen må vi ha en maske som tilpasser seg hver MovieClip.

La oss gå videre og Høyreklikk> Kopier vår myObject på scenen. Nå må vi Høyreklikk> Lim inn Plasser objektet slik at det er akkurat der vår myObject var. Bytt nå forekomstnavnet til "myObjectAsMask." Bytt til hovedklassen og legg til følgende linjer til konstruktøren:

 // Dette burde alle være selvforklarende! myCanvas.mask = myObjectAsMask myObjectAsMask.gotoAndStop (1)

Hittil må masken bare fungere for det første objektet. Vi må justere funksjonen changeObjectFrame for å endre masken vår for å møte den nye formen til myObject. Legg den merkede koden til funksjonen changeObjectFrame:

 privat funksjon changeObjectFrame (e: Event): void if (myComboBox.selectedLabel == "Rectangle") myObject.gotoAndStop (1) hvis (myComboBox.selectedLabel == "Triangle") myObject.gotoAndStop (2) hvis (myComboBox.selectedLabel == "Circle") myObject.gotoAndStop (3) // Slett doodle myCanvas.graphics.clear () // Synker myObject og myObjectAsMask rammer myObjectAsMask.gotoAndStop (myObject.currentFrame)

Trinn 10: Lagre-knappen

Neste opp: Vi legger til en lagre-knapp i vår søknad. Senere vil dette lagre alle myObjects data i et SharedObject. Opprett en ny knapp og utform det du vil. Jeg har tatt med min egen knapp, men viser deg hvordan du tegner en, er ikke viktig.

Dra en forekomst av knappen på scenen og gi den forekomstnavnet til "saveStuff". Legg deretter til følgende hendelseslytter til konstruktøren:

 saveStuff.addEventListener (MouseEvent.CLICK, saveObjectData)

Deretter legger du til denne tomme funksjonen som vi skal bruke for å legge til koden vår som lagrer objektet.

 privat funksjon saveObjectData (e: MouseEvent): void 

Trinn 11: Opprette og få tilgang til et nytt SharedObject

For å begynne å bruke SharedObject-klassen, må vi opprette en ny forekomst av SharedObject-klassen. Hvis du aldri har brukt SharedObject-klassen før, ville det være fint å sjekke ut denne opplæringen om Arbeide med SharedObjects for å få en grunnleggende ide om hvordan de fungerer. Bruk denne koden til å opprette en SharedObject:

 private var mySaveData: SharedObject = SharedObject.getLocal ("saveData")

Gå inn i saveObjectData-funksjonen og legg til følgende kode for å begynne å lagre operasjonen:

 // Oppretter et nytt utvalg inne i programmet var myDataArrayInProgram: Array = new Array () // Legger til noen tilfeldige data i vårt Array myDataArrayInProgram.push ("WhateverDataYouWant") // Oppretter en variabel inne i SharedObject // og setter det til verdi for verdien av vårt lokale // array mySaveData.data.myDataArray = myDataArrayInProgram // "Flushes" dataene som skal lagres i //-datamaskinen (selv om navnet antyder annet, // dette lagrer faktisk dataene!) mySaveData.flush ()

Hvis du vil sjekke om denne koden er effektiv, legger du bare til dette kodestykket til bunnen av funksjonen din:

 spor (mySaveData.data.myDataArray)

Trinn 12: Lagre våre viktigste MovieClip-data

Så langt er alt bra. Vi har klart å opprette et SharedObject og har lagret noen få byte data i den. Det neste trinnet er å begynne å forberede vårt program for å rekonstruere vår MovieClip. I dette trinnet legger vi alle nødvendige data til vårt SharedObject for vårt program for å rekonstruere MovieClip fra grunnen av.

For å gjøre dette, må vi skyve alle dataene våre i myDataArrayInProgram Array slik at det vil bli knyttet til vårt SharedObject. Jeg har endret funksjonen saveObjectData for å gjøre alt dette. Du kan se det nedenfor:

 privat funksjon saveObjectData (e: MouseEvent): void var myDataArrayInProgram: Array = new Array () // Legger til objektets X-sted myDataArrayInProgram.push (myObject.x) // Legger til objektets Y-posisjon myDataArrayInProgram.push (myObject.y) // Legger til objektets nåværendeFrame // (Nåværende objekt valgt) myDataArrayInProgram.push (myObject.currentFrame) // Legger til gjeldende ramme av // nåværende objektets animasjon myDataArrayInProgram.push (myObject.getChildAt (0) .currentFrame) mySaveData. data.myDataArray = myDataArrayInProgram mySaveData.flush () spor (mySaveData.data.myDataArray)

VIKTIG: getChildAt () åpner objektets barn basert på deres indeks. Når det bare er ett objekt i en MovieClip, kan du være sikker på at getChildAt (0) vil få deg til det!

ENDA VIKTIGERE: Ikke bekymre deg hvis du får følgende feil:

1119: Tilgang til muligens udefinert egenskap currentFrame gjennom en referanse med statisk type flash.display: DisplayObject.

I så fall har du sannsynligvis Strenge modus aktivert i flashinnstillingene dine. Problemet er det getChildAt () returnerer en DisplayObject, og å blinke, det kan være en Bitmap, Sprite, MovieClip, etc. Problemet med DisplayObject.currentFrame er det bare MovieClip Class har egenskapen currentFrame, fordi ingen annen klasse har noen animasjon.

For å løse dette, gå til: Fil> Publiser innstillinger> Actionscript Innstillinger og fjern merket "Feil: Strenge modus"

Redaktør: Alternativt kan du støpt objektet returnert av getChildAt () som en MovieClip, slik som:
 myDataArrayInProgram.push ((myObject.getChildAt (0) som MovieClip) .currentFrame)

Dette forteller Flash, "behandle dette objektet som en Filmklipp".


Trinn 13: Opprette en lasteknapp

Vi er ikke på scenen ennå, men vi kan bruke lagre dataene våre, men det er fortsatt godt å lage UI-alternativet for å laste SharedObject på forhånd. Akkurat som lagre knappen, kan du designe denne knappen for å være det du vil ha; Jeg kommer ikke til å gå deg gjennom å tegne den.

Opprett en ny knapp og dra en forekomst på scenen. Sett deretter instansnavnet til "loadStuff".

Og nå legger du bare til følgende Event Listener:

 loadStuff.addEventListener (MouseEvent.CLICK, loadObjectData)

Og opprett loadObjectData-funksjonen slik:

 privat funksjon loadObjectData (e: MouseEvent): void 

Trinn 14: Fjern alt-knappen

La oss nå legge til en ny knapp til brukergrensesnittet vårt. Denne knappen vil slette alt i vårt SharedObject og også tørke ut den nåværende doodle på myCanvas.

På samme måte som de andre knappene, velger jeg min egen grafikk; Du kan velge din egen eller bruke min.

Denne gangen kan du sette instansnavnet på knappen til "clearStuff".

Legg til denne hendelseslytteren:

 clearStuff.addEventListener (MouseEvent.CLICK, clearObjectData)

Og opprett clearObjectData-funksjonen slik:

 privat funksjon clearObjectData (e: MouseEvent): void // Clear SharedObject mySaveData.clear () // Fjerner myCanvas grafikk myCanvas.graphics.clear ()

Trinn 15: BitmapData stillbilder

Nå begynner du å spørre: "Hvorfor kan jeg ikke redde brukerens doodle som enhver annen eiendom?" Dessverre tillater Flash ikke deg direkte å lagre MovieClips, Bitmaps eller til og med Shapes inne i et SharedObject, men du kan gjøre dette ved å lagre piksel etter pixelverdi av bildet.

Du må spørre: "Men Doodle er ikke en bitmap, det er en bruker trukket vektor bilde inneholdt i form ?!" Det stemmer, men vi kan konvertere det til Bitmap-baserte data ved å ta et øyeblikksbilde av det med BitmapData-klassen!

Gå videre og opprett følgende variabel over konstruktøren til vårt hovedprogram:

 private var bitmapDataSnapshot: BitmapData

Denne variabelen vil være "kameraet" som tar et øyeblikksbilde av doodle.

Legg nå følgende markerte linjer til saveObjectData-funksjonen på stedet som er vist nedenfor:

 privat funksjon saveObjectData (e: MouseEvent): void var myDataArrayInProgram: Array = new Array () myDataArrayInProgram.push (myObject.x) myDataArrayInProgram.push (myObject.currentFrame) myDataArrayInProgram.push (myObject.getChildAt (0) .currentFrame) / / Oppretter en ny forekomst av BitmapData-klassen, // gjør størrelsen på scenen, muliggjør gjennomsiktighet, // og setter fyllingen til en gjennomsiktig hvit bitmapDataSnapshot = ny BitmapData (640, 480, true, 0) // Forteller kamera for å ta et øyeblikksbilde // av myCanvas, hopper over de neste tre parameterne, // og forteller at stillbildsområdet bare inkluderer // de ting som dekkes av myObject MovieClip bitmapDataSnapshot.draw (myCanvas, null, null, null, nytt rektangel 250, 30, 150, 100)) mySaveData.data.myDataArray = myDataArrayInProgram mySaveData.flush () spor (mySaveData.data.myDataArray)

Trinn 16: Lagre BitmapData i et SharedObject

La oss pakke inn sparingprosessen til vårt program. Nå som vi har opprettet en BitmapData-forekomst med alle våre myCanvas-dataene, må vi lagre den i en ByteArray for å bli sendt inn i vårt SharedObject. For å gjøre dette kan vi bruke en veldig praktisk funksjon inne i BitmapData-klassen. Navnet dens er getPixels ().

getPixels () returnerer en ByteArray av alle pikseldataene til en BitmapData. I motsetning til BitmapData-klassen, ByteArrays kan lagres i SharedObjects, slik at de er det rette verktøyet for å lagre vår Doodle.

Alt du trenger å gjøre er å legge til denne koden i din saveObjectData-funksjon rett etter at du har fullført ditt BitmapData-arbeid:

 // Skriver verdien av den returnerte // ByteArray av getPixels () -funksjonen // i myDataArrayInProgram // getPixels () krever et rektangel som // viser hvilken del av objektets piksler // vi egentlig vil ha! // MERK: Gjeldende rektangel er bare // en tilnærming av hvor doodle // skal vise! mySaveData.data.myDataArray.push (bitmapDataSnapshot.getPixels (nytt rektangel (250, 30, 150, 100)))

På til siste skritt. Når dataene er lagret, må vi få brukeren til å oppdatere siden, for å bevise at deres doodle er lagret på harddisken, og ikke bare lagret i midlertidig minne. Tegn en svart boks rundt scenen og legg til litt tekst på den som ber spilleren å oppdatere. Velg deretter hele objektet og trykk F8. Pass på å sjekke boksen "Eksporter for handlinger" og sett "Class" til "refreshScreen". Du kan nå slette objektet på scenen ...

Nedenfor er refreshScreen som jeg har tegnet:

Legg nå denne koden til bunnen av din saveObjectData-funksjon:

 addChild (ny refreshScreen ())

Din ferdige saveObjectData-funksjon skal se slik ut:

 privat funksjon saveObjectData (e: MouseEvent): void var myDataArrayInProgram: Array = new Array () myDataArrayInProgram.push (myObject.x) myDataArrayInProgram.push (myObject.currentFrame) myDataArrayInProgram.push (myObject.getChildAt (0) .currentFrame) bitmapDataSnapshot = new BitmapData (640, 480, true, 0) bitmapDataSnapshot.draw (myCanvas, null, null, null, nytt rektangel (250, 30, 150, 100)) myDataArrayInProgram.push (bitmapDataSnapshot.getPixels (nytt rektangel , 150, 100))) mySaveData.data.myDataArray = myDataArrayInProgram mySaveData.flush () spor (mySaveData.data.myDataArray) addChild (ny refreshScreen ())

Trinn 17: Rekonstruere vår Doodle

Det er på tide å rekonstruere hele vår Doodle fra ByteArray som vi lagret tidligere!

Du må tenke: "Hva gjør jeg med en ByteArray, det er bare en masse søppel mumbo-jumbo!" Og du har rett, det er det! Heldigvis har Adobe også gitt oss en flott funksjon som heter setPixels () som du gir samme rektangel og ByteArray, for å gjenskape samme BitmapData du hadde!

Før vi rekonstruerer hele vår MovieClip, bør vi fortsette å kjøre en test for å se om vi kan rekonstruere BitmapData selv. Endre din loadObjectData funksjon slik at det ser slik ut:

 privat funksjon loadObjectData (e: MouseEvent): void // Oppretter en BitmapData og gjør // den størrelsen på scenen, og // applys alle de gamle innstillingene var loadBitmapData: BitmapData = ny BitmapData (640, 480, true, 1) // Setter pikslene av loadBitmap // ved hjelp av vårt gamle rektangel, og // ved å gå til vårt SaveData ByteArray // (4. element i myDataArray (myDataArray [3])) loadBitmapData.setPixels (nytt rektangel (250, 30, 150 , 100), mySaveData.data.myDataArray [3]) // Oppretter en ny Bitmap og forteller det å // laste bildet fra loadBitmapData var display: Bitmap = nytt Bitmap (loadBitmapData) // Flytter objektmasken // spilleled til den høyre rammen minObjectAsMask.gotoAndStop (mySaveData.data.myDataArray [2]) // Masker bildet med masken display.mask = myObjectAsMask // Legger til Bitmapet til scenen addChild (skjerm)

Trinn 18: Fullstendig rekonstruere myObject

Nå er det på tide å sette alt sammen! Først høyreklikk på myObject (i biblioteket)> Egenskaper. Merk av for "Eksporter for handlinger" og sett "Klassen" til "myObjectType". Sammenlign dine egenskaper med de i bildet:

Hvis det er alt det samme, så er vi klare til å gå! Legg til dette over vår konstruktør:

 private var minNewObject: myObjectType;

Og legg til alle av dette til toppen av loadObjectData ().

 // Oppretter en ny forekomst av myObjectType (myObject) myNewObject = new myObjectType () // Setter X til den gamle posisjonen minNewObject.x = mySaveData.data.myDataArray [0] // Setter Y til den gamle posisjonen minNewObject.y = mySaveData.data.myDataArray [1] // Velger det gamle objektet myNewObject.gotoAndStop (mySaveData.data.myDataArray [2]) // Flytter avspillingshode til høyre animasjonsramme myNewObject.getChildAt (0) .gotoAndStop (mySaveData.data .myDataArray [3]) // legger objektet til scenen addChild (myNewObject) // Fjerner comboBox hendelse lytter myComboBox.removeEventListener (Event.CHANGE, changeObjectFrame) // Fjerner "doStuff" hendelse lyttere for knapper saveStuff.removeEventListener (MouseEvent .CLICK, saveObjectData) loadStuff.removeEventListener (MouseEvent.CLICK, loadObjectData) clearStuff.removeEventListener (MouseEvent.CLICK, clearObjectData) // Fjerner tegningshendelse lyttere scene.removeEventListener (MouseEvent.MOUSE_MOVE, drawDoodle) stage.removeEventListener (MouseEvent.MOUSE_DOWN, mouseDown ) stag e.removeEventListener (MouseEvent.MOUSE_UP, mouseUp) // Fjerner unødvendig brukergrensesnitt removeChild (myObject) removeChild (saveStuff) removeChild (loadStuff) removeChild (clearStuff) removeChild (myComboBox) removeChild (myCanvas)

Test appen, det skal fungere perfekt.

Gratulerer! Du har offisielt rekonstruert en MovieClip ved hjelp av SharedObject-klassen!


Trinn 19: Legge til en animasjonsknapp for spill

Hvis programmet ovenfor fungerer, bør det presentere et midlertidig bilde av hvor du lagret myObject. For å få animasjonen til å spille igjen, la oss lage en "Play" -knapp. Her er den jeg har valgt:

Dra det bare under myObject på scenen og sett sitt eksempelnavn til "playAnimation".

Legg nå dette til bunnen av vår konstruktør:

 // Skjuler button playAnimation.visible = false // Legger til knapper Event Listener playAnimation.addEventListener (MouseEvent.CLICK, playObjectAnimation)

Sett så dette på bunnen av loadObjectData ().

 // Viser knapp playAnimation.visible = true

Til slutt legger du til denne funksjonen i programmet:

 privat funksjon playObjectAnimation (e: MouseEvent): void myNewObject.play ()

Trinn 20: Endelig kilde

Her er vår Final Application Source Code. Hvis det er noen forskjell mellom koden din og dette, gå tilbake og se hvor du tok en annen vei.

 pakke import flash.display.Bitmap; importer flash.display.BitmapData; importer flash.display.Graphics; importer flash.display.Shape; importer flash.display.Sprite; importere fl.controls.ComboBox import flash.events.Event; importer flash.events.MouseEvent; importer flash.geom.Matrix; importer flash.geom.Rectangle; importer flash.net.SharedObject; offentlig klasse Hoved utvider Sprite private var myComboBox: ComboBox = ny ComboBox () privat var myCanvas: Shape = ny Shape () privat var mouseIsDown: Boolean = feil privat var mySaveData: SharedObject = SharedObject.getLocal ("saveData") privat var bitmapDataSnapshot : BitmapData private var myNewObject: myObjectType offentlig funksjon Main (): void myObject.gotoAndStop (1) myComboBox.addItem (label: "Rectangle") myComboBox.addItem (label: "Triangle") myComboBox.addItem label: "Circle") addChild (myComboBox) myComboBox.move (280, 150) myComboBox.addEventListener (Event.CHANGE, changeObjectFrame) addChild (myCanvas) stage.addEventListener (MouseEvent.MOUSE_MOVE, drawDoodle) stage.addEventListener (MouseEvent.MOUSE_DOWN , MouseDown) stage.addEventListener (MouseEvent.MOUSE_UP, mouseUp) myCanvas.mask = myObjectAsMask myObjectAsMask.gotoAndStop (1) saveStuff.addEventListener (MouseEvent.CLICK, saveObjectData) loadStuff.addEventListener (MouseEvent.CLICK, loadObjectData) clearStuff.addEventListener (Mous eEvent.CLICK, clearObjectData) playAnimation.visible = feil playAnimation.addEventListener (MouseEvent.CLICK, playObjectAnimation) privat funksjon clearObjectData (e: MouseEvent): void mySaveData.clear () myCanvas.graphics.clear () privatfunksjon loadObjectData ( e: MouseEvent): void myNewObject = ny myObjectType () myNewObject.x = mySaveData.data.myDataArray [0] myNewObject.y = mySaveData.data.myDataArray [1] myNewObject.gotoAndStop (mySaveData.data.myDataArray [2]) myNewObject.getChildAt (0) .gotoAndStop (mySaveData.data.myDataArray [3]) addChild (myNewObject) myComboBox.removeEventListener (Event.CHANGE, changeObjectFrame) saveStuff.removeEventListener (MouseEvent.CLICK, saveObjectData) loadStuff.removeEventListener (MouseEvent.CLICK, loadObjectData) clearStuff.removeEventListener (MouseEvent.CLICK, clearObjectData) stage.removeEventListener (MouseEvent.MOUSE_MOVE, drawDoodle) scene.removeEventListener (MouseEvent.MOUSE_DOWN, mouseDown) scene.removeEventListener (MouseEvent.MOUSE_UP, mouseUp) remo veChild (myObject) removeChild (saveStuff) removeChild (loadStuff) removeChild (clearStuff) removeChild (myComboBox) removeChild (myCanvas) var loadBitmapData: BitmapData = ny BitmapData (640, 480, true, 1) loadBitmapData.setPixels (nytt rektangel , MySaveData.data.myDataArray [4]) var vise: Bitmap = ny Bitmap = true privat funksjon playObjectAnimation (e: MouseEvent): void myNewObject.getChildAt (0) .play () playAnimation.visible = false privatfunksjon saveObjectData (e: MouseEvent): void var myDataArrayInProgram: Array = new Array myDataArrayInProgram.push (myObject.x) myDataArrayInProgram.push (myObject.y) myDataArrayInProgram.push (myObject.currentFrame) myDataArrayInProgram.push (myObject.getChildAt (0) .currentFrame) bitmapDataSnapshot = ny BitmapData (640, 480, true, 0) bitmapDataSnapshot.draw (myCanvas, null, null, null, ny Recta ngle (250, 30, 150, 100)) myDataArrayInProgram.push (bitmapDataSnapshot.getPixels (ny rektangel (250, 30, 150, 100)) mySaveData.data.myDataArray = myDataArrayInProgram mySaveData.flush () spor (mySaveData.data. myDataArray) privat funksjon mouseUp (e: MouseEvent): void mouseIsDown = false privat funksjon mouseDown (e: MouseEvent): void mouseIsDown = true myCanvas.graphics.moveTo (myCanvas.mouseX, myCanvas.mouseY);  private funksjon drawDoodle (e: MouseEvent): void if (mouseIsDown) myCanvas.graphics.lineStyle (5, 0, 1) myCanvas.graphics.lineTo (myCanvas.mouseX, myCanvas.mouseY);  privat funksjon changeObjectFrame (e: Event): void if (myComboBox.selectedLabel == "Rectangle") myObject.gotoAndStop (1) hvis (myComboBox.selectedLabel == "Triangle") myObject.gotoAndStop  hvis (myComboBox.selectedLabel == "Circle") myObject.gotoAndStop (3) myCanvas.graphics.clear () myObjectAsMask.gotoAndStop (myObject.currentFrame)

Konklusjon

Som du kan se, med litt ompasning, er det helt mulig å lagre alle MovieClip-data i SharedObjects for lasting senere. Dette betyr at hvis du skriver et spill, kan du enkelt lage lagrede stater i stedet for å ha små kontrollpunkter ...

Lykke til med å bruke denne metoden for å lagre data på spill og programmer, for å gjøre programmene dine bedre enn noensinne!

Takk for at du leste!