Tijdens deze zelfstudie zullen we leren hoe we de SharedObject-klasse kunnen implementeren. We slaan alle essentiële gegevens van een MovieClip lokaal op en laden deze vervolgens opnieuw wanneer de toepassing wordt geopend!
We vonden deze geweldige auteur dankzij FlashGameLicense.com, dé plek om Flash-spellen te kopen en verkopen.
Met dank aan manicho voor het pictogram van de harde schijf.
Laten we eens kijken naar het eindresultaat waar we naartoe zullen werken:
Bewerk een afbeelding in het vak met je muis en klik op de knop Opslaan. Ververs deze pagina in uw browser en klik op Laden. Je zult zien dat je doodle opnieuw verschijnt nadat deze van je harde schijf is geladen; de achtergrondanimatie bevindt zich zelfs in hetzelfde frame als voorheen!
Laten we beginnen met het maken van een nieuwe .fla. Sla het op en open het eigenschappenvenster in Flash. Ik gebruik Flash CS5, maar deze handleiding zou met elke Flash CS-versie moeten werken. Druk in het eigenschappenvenster op Bewerk knop en zorg ervoor dat uw instellingen identiek zijn aan de afbeelding hieronder:
Nu we onze .fla hebben ingesteld, laten we onze documentklasse beginnen. Om te beginnen, open je je favoriete ActionScript-code-editor en sla je een .as-bestand met de naam "Main.as" op in dezelfde map als je .fla. Ga vervolgens naar het paneel "Publiceren" van Flash. Zet het "Class" tekstveld op "Main". Open nu Main.as en kopieer en plak de volgende code om onze hoofddocumentklasse te maken.
pakket import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Graphics; import flash.display.Shape; import flash.display.Sprite; import fl.controls.ComboBox import flash.events.Event; import flash.events.MouseEvent; import flash.geom.Matrix; import flash.geom.Rectangle; import flash.net.SharedObject; public class Hoofd breidt uit openbare functie Main (): void
Nu gaan we onze belangrijkste MovieClip maken. Het zal 3 frames bevatten. Elk met een gekleurde vorm. Teken een rode rechthoek, verander het in een MovieClip met F8 en stel de naam van de MovieClip in op "myObject". Zorg ervoor dat het registratiepunt de linkerbovenhoek is. Maak vervolgens twee nieuwe lege frames in de MovieClip. Vul de ene met een groene driehoek en de andere met een blauwe cirkel.
Het eindresultaat zou er ongeveer zo uit moeten zien:
Nu gaan we een ComboBox gebruiken, die in feite een vervolgkeuzelijst is. Zorg ervoor dat het exemplaar van myObject op het werkgebied ook als myObject wordt gekenmerkt. Open vervolgens: Venster> Onderdelen en sleep het item "ComboBox" naar de bibliotheek. Als u de Flash IDE niet gebruikt, moet u rechts klikken> Exporteren naar SWC de ComboBox in de bibliotheek.
Nu kunnen we de "myComboBox" -variabele maken, geplaatst boven de constructorfunctie.
private var myComboBox: ComboBox = nieuwe ComboBox ()
Voeg vervolgens de volgende code toe aan uw Main () -constructor:
// Stopt de myObject MovieClip in het eerste frame myObject.gotoAndStop (1) // Voegt de volgende objecten toe aan de ComboBox en geeft ze elke unieke labels myComboBox.addItem (label: "Rectangle") myComboBox.addItem (label: "Cirkel") myComboBox.addItem (label: "Triangle") // Voegt de ComboBox toe addChild (myComboBox) // Verplaatst het naar de juiste coördinaten myComboBox.move (280,150)
Hier is een momentopname van hoe uw applicatie eruit zou moeten zien wanneer uitgevoerd:
myObject
framesWe willen dat onze MovieClip frames verandert wanneer we een ander item selecteren!
Laten we beginnen met het toevoegen van een EventListener aan onze constructor - de Event.CHANGE gebeurtenislistener - die controleert wanneer het geselecteerde object in de ComboBox verandert. Dit is precies wanneer de gebruiker een nieuw ComboBox-item kiest.
myComboBox.addEventListener (Event.CHANGE, changeObjectFrame)
Vervolgens zullen we de functie changeObjectFrame () maken. Deze functie controleert om te zien wat het huidige label op de ComboBox is, wat de naam is van het object dat de gebruiker heeft geselecteerd. Het gaat dan naar het juiste frame van myObject
om het geselecteerde objecttype weer te geven.
persoonlijke functie changeObjectFrame (e: Event): void //myComboBox.selectedLabel is de naam van het geselecteerde huidige object dat we eerder hebben gedefinieerd ... if (myComboBox.selectLabel == "Rectangle") myObject.gotoAndStop (1) if ( myComboBox.selectedLabel == "Triangle") myObject.gotoAndStop (2) if (myComboBox.selectedLabel == "Circle") myObject.gotoAndStop (3)
U kunt nu doorgaan en de applicatie compileren. U moet kunnen overschakelen naar een ander object door het te selecteren in het vervolgkeuzemenu.
Laten we vervolgens een animatie toevoegen aan ons programma. Ga naar de myObject
MovieClip op het eerste frame. Selecteer alle rode rechthoeken en druk op F8 om er een MovieClip van te maken. Zorg ervoor dat het registratiepunt zich in de linkerbovenhoek bevindt. Doe dit met elke vorm in de myObject
Filmclip
Vervolgens zullen we elke MovieClip een animatie moeten geven. Ga naar de rechthoekige vorm MovieClip en rechter muisknop> Creëer Shape Tween op de rode vormvulling.
Selecteer vervolgens het 60ste frame van de MovieClip op de tijdlijn en druk op F6 om een nieuw hoofdframe te maken. Doe dit ook met het 30e frame. Nu kunt u gewoon naar het 30e kader gaan en de kleur van de vormvulling wijzigen. Ik heb ervoor gekozen om de kleur in een gouden sinaasappel te veranderen. Als u nu de animatie afspeelt, moet de kleur veranderen van Rood> Oranje> Rood.
Ga je gang en doe dit voor elke vorm in de myObject
Filmclip. Nu kunt u doorgaan en de applicatie compileren; elke geselecteerde vorm zal de kleuren veranderen.
De huidige applicatie zou als volgt moeten werken:
Laten we nu toestaan dat de gebruiker een kleine aangepaste doodle op de MovieClip tekent. Dit is vergelijkbaar met mijn laatste zelfstudie waarin we de gebruiker toestonden een aangepast ontwerp op de speler te tekenen. We gaan echter een stap verder in deze zelfstudie door de gebruiker toe te staan zijn bericht te OPSLAAN. Maar laten we opslaan dat voor later!
Laten we beginnen door een instantie van de klasse Shape in te stellen. Voeg deze code toe boven je constructor:
private var myCanvas: Shape = new Shape ()
Vervolgens gaan we de variabele myCanvas aan het podium toevoegen ... Voeg deze code toe aan de onderkant van onze constructor.
addChild (myCanvas))
We doen dit heel snel. Als je meer uitleg wilt over het gebruik van de klasse Shape voor tekenen, controleer dan mijn andere tutorial.
Begin met het maken van een mouseIsDown-variabele ...
// Controleert of de muis niet beschikbaar is private var mouseIsDown: Boolean = false
Ga nu door en voeg de volgende gebeurtenislisteners toe:
stage.addEventListener (MouseEvent.MOUSE_MOVE, drawDoodle) stage.addEventListener (MouseEvent.MOUSE_DOWN, mouseDown) stage.addEventListener (MouseEvent.MOUSE_UP, mouseUp)
En hier zijn de 3 functies die zijn gekoppeld aan de EventListeners:
privéfunctie mouseUp (e: MouseEvent): void mouseIsDown = false persoonlijke functie mouseDown (e: MouseEvent): void mouseIsDown = true // Verplaatst muisaanwijzer naar muis myCanvas.graphics.moveTo (myCanvas.mouseX, myCanvas.mouseY) ; private functie drawDoodle (e: MouseEvent): void // Als er op de muis wordt geklikt (mouseIsDown) // Maakt tekeninginstellingen juist myCanvas.graphics.lineStyle (5, 0, 1) // Draws the doodle line myCanvas. graphics.lineTo (myCanvas.mouseX, myCanvas.mouseY);
Nu kunt u het programma testen en het zou goed moeten gaan. We hebben echter nog steeds niet de tekenruimte van ons canvas beperkt, dus tekeningen die buiten de grenzen van myObject liggen, worden nog steeds weergegeven. In de volgende stap zullen we dit allemaal oplossen!
In mijn vorige zelfstudie was het proces van maskeren erg gemakkelijk omdat elk gemaskerd object in de hele applicatie hetzelfde bleef. Deze keer moeten we een masker hebben dat zich aanpast aan elke MovieClip.
Laten we doorgaan en rechts klikken> Kopieer onze myObject
op het podium. Nu moeten we rechts klikken> Plakken op plaats het object zodat het precies daar is waar ons myObject
was. Verander nu de naam van het exemplaar naar "myObjectAsMask." Schakel over naar de hoofdklasse en voeg de volgende regels toe aan de constructor:
// Dit zou vanzelfsprekend moeten zijn! myCanvas.mask = myObjectAsMask myObjectAsMask.gotoAndStop (1)
Tot nu toe zou het masker alleen moeten werken voor het eerste object. We moeten de changeObjectFrame-functie aanpassen om ons masker aan te passen aan de nieuwe vorm van myObject. Voeg de gemarkeerde code toe aan de functie changeObjectFrame:
persoonlijke functie changeObjectFrame (e: Event): void if (myComboBox.selectedLabel == "Rectangle") myObject.gotoAndStop (1) if (myComboBox.selectedLabel == "Triangle") myObject.gotoAndStop (2) if (myComboBox.selectedLabel == "Circle") myObject.gotoAndStop (3) // Wist doodle myCanvas.graphics.clear () // Synchroniseert mijnObject- en myObjectAsMask-frames myObjectAsMask.gotoAndStop (myObject.currentFrame)
De volgende: we voegen een knop voor opslaan toe aan onze applicatie. Later worden hierdoor alle gegevens van mijn myObject opgeslagen in een SharedObject. Maak een nieuwe knop en ontwerp deze zoals je wilt. Ik heb mijn eigen knop opgenomen, maar laten zien hoe je er een kunt tekenen, is niet belangrijk.
Sleep een instantie van de knop naar het werkgebied en geef deze de instantienaam "saveStuff". Voeg vervolgens de volgende gebeurtenislistener toe aan de constructor:
saveStuff.addEventListener (MouseEvent.CLICK, saveObjectData)
Voeg vervolgens deze lege functie toe die we zullen gebruiken om onze code toe te voegen die het object opslaat.
privéfunctie saveObjectData (e: MouseEvent): void
Als u de SharedObject-klasse wilt gaan gebruiken, moeten we een nieuw exemplaar van de klasse SharedObject maken. Als u de klasse SharedObject nog nooit hebt gebruikt, zou dit een goed moment zijn om deze zelfstudie over werken met SharedObjects te bekijken om een basisidee te krijgen van hoe ze werken. Gebruik deze code om een SharedObject te maken:
private var mySaveData: SharedObject = SharedObject.getLocal ("saveData")
Ga naar de functie saveObjectData en voeg de volgende code toe om onze opslagbewerking te starten:
// Creëert een nieuwe array in het programma var myDataArrayInProgram: Array = new Array () // Voegt wat willekeurige gegevens toe aan onze array myDataArrayInProgram.push ("WhateverDataYouWant") // Creëert een variabele binnen SharedObject // en stelt zijn waarde in op de waarde van onze lokale // array mySaveData.data.myDataArray = myDataArrayInProgram // "Flushes" de gegevens weg om te worden opgeslagen in de // computer (hoewel de naam anders doet vermoeden, // deze slaat de gegevens feitelijk op!) mySaveData.flush ()
Als u wilt controleren of deze code effectief is, voegt u dit codefragment toe aan de onderkant van uw functie:
trace (mySaveData.data.myDataArray)
Tot nu toe is alles goed. We zijn erin geslaagd om een SharedObject te maken en hebben daarin met succes enkele bytes aan gegevens opgeslagen. De volgende stap is om ons programma voor te bereiden voor het reconstrueren van onze MovieClip. In deze stap zullen we alle benodigde gegevens toevoegen aan ons SharedObject voor onze toepassing om de MovieClip helemaal opnieuw te construeren.
Om dit te doen, moeten we al onze gegevens in de array myDataArrayInProgram zetten zodat deze wordt gekoppeld aan ons SharedObject. Ik heb de functie saveObjectData aangepast om dit allemaal te doen. Je kunt het hieronder bekijken:
privéfunctie saveObjectData (e: MouseEvent): void var myDataArrayInProgram: Array = new Array () // Voegt de X-locatie van het object toe myDataArrayInProgram.push (myObject.x) // Voegt de Y-locatie van het object toe myDataArrayInProgram.push (myObject.y) // Voegt het currentFrame van het object // (Het geselecteerde huidige object) toe myDataArrayInProgram.push (myObject.currentFrame) // Voegt het huidige frame van de animatie van het // huidige object toe myDataArrayInProgram.push (myObject.getChildAt (0) .currentFrame) mySaveData. data.myDataArray = myDataArrayInProgram mySaveData.flush () trace (mySaveData.data.myDataArray)
BELANGRIJK: getChildAt ()
benadert de kinderen van het object op basis van hun index. Als er maar één object in een MovieClip staat, weet je dat zeker getChildAt (0)
zal je ertoe brengen!
BELANGRIJKER: Maak je geen zorgen als je de volgende foutmelding krijgt:
1119: Toegang van mogelijk ongedefinieerde eigenschap currentFrame via een verwijzing met statische type flash.display: DisplayObject.
Als dit het geval is, hebt u de Strict-modus waarschijnlijk ingeschakeld in uw flitsinstellingen. Het probleem is dat getChildAt ()
geeft een DisplayObject terug, en om te flitsen, dat zou een Bitmap, Sprite, MovieClip, etc. kunnen zijn. Het probleem met DisplayObject.currentFrame
is dat alleen de MovieClip Class de currentFrame-eigenschap heeft, omdat geen enkele andere andere animatie heeft.
Om dit op te lossen, gaat u naar: Bestand> Instellingen publiceren> Instellingen Actionscript en vink "Fouten: Strikte modus" uit
Editor: Als alternatief zou dat kunnen gegoten het object geretourneerd door getChildAt () als een MovieClip, zoals zo:myDataArrayInProgram.push ((myObject.getChildAt (0) als MovieClip) .currentFrame)
Dit vertelt Flash, "behandel dit object zoals een Filmclip".
We zijn nog niet zover dat we onze opslaggegevens kunnen gebruiken, maar het is nog steeds goed om de UI-optie te maken om SharedObject van tevoren te laden. Net als de knop Opslaan, kunt u deze knop ontwerpen zoals u het wilt; Ik ga je niet door het tekenen leiden.
Maak een nieuwe knop en sleep een exemplaar naar het werkgebied. Stel vervolgens de naam van het exemplaar in op "loadStuff".
En voeg nu gewoon de volgende Event Listener toe:
loadStuff.addEventListener (MouseEvent.CLICK, loadObjectData)
En maak de loadObjectData-functie als volgt aan:
persoonlijke functie loadObjectData (e: MouseEvent): void
Laten we nu een nieuwe knop aan onze gebruikersinterface toevoegen. Met deze knop wordt alles in ons SharedObject verwijderd en wordt ook de huidige doodle op myCanvas weggevaagd.
Net als de andere knoppen, kies ik mijn eigen afbeelding; je kunt je eigen keuze maken of de mijne gebruiken.
Deze keer kun je de instantienaam van de knop instellen op "clearStuff".
Voeg nu deze gebeurtenis luisteraar toe:
clearStuff.addEventListener (MouseEvent.CLICK, clearObjectData)
En maak de clearObjectData-functie als volgt aan:
private function clearObjectData (e: MouseEvent): void // Wissen SharedObject mySaveData.clear () // Wist myCanvas-afbeeldingen myCanvas.graphics.clear ()
Nu begin je te vragen: "Waarom kan ik de doodle van de gebruiker niet opslaan zoals andere objecten?" Helaas staat Flash je niet toe om MovieClips, bitmaps of zelfs vormen direct in een SharedObject op te slaan, maar je kunt dit doen door de pixel voor pixel waarde van de afbeelding op te slaan.
Je moet je afvragen: "Maar de doodle is geen bitmap, het is een door de gebruiker getekend vector-beeld in vorm ?!" Dat klopt, maar we kunnen het converteren naar op Bitmap gebaseerde gegevens door er een momentopname van te maken met de BitmapData-klasse!
Ga je gang en maak de volgende variabele boven de constructor van onze hoofdtoepassing:
private var bitmapDataSnapshot: BitmapData
Deze variabele is de "camera" die een momentopname van de doodle maakt.
Voeg nu de volgende gemarkeerde regels toe aan de functie saveObjectData op de onderstaande locatie:
privéfunctie saveObjectData (e: MouseEvent): void var myDataArrayInProgram: Array = new Array () myDataArrayInProgram.push (myObject.x) myDataArrayInProgram.push (myObject.currentFrame) myDataArrayInProgram.push (myObject.getChildAt (0) .currentFrame) / / Maakt een nieuw exemplaar van de klasse BitmapData, // maakt het de grootte van het werkgebied, maakt transparantie mogelijk // en stelt de vulling in op een transparant wit bitmapDataSnapshot = nieuwe BitmapData (640, 480, waar, 0) // Vertelt de camera om een snapshot te nemen // van myCanvas, slaat de volgende 3 parameters over, // en vertelt het snapshotgebied om alleen // de spullen te omvatten die vallen onder de myObject MovieClip bitmapDataSnapshot.draw (myCanvas, null, null, null, new Rectangle ( 250, 30, 150, 100)) mySaveData.data.myDataArray = myDataArrayInProgram mySaveData.flush () trace (mySaveData.data.myDataArray)
Laten we het opslaan van ons programma afsluiten. Nu we een BitmapData-instantie hebben gemaakt met al onze myCanvas-gegevens, moeten we deze opslaan in een ByteArray om naar ons SharedObject te worden verzonden. Om dit te doen, kunnen we een zeer handige functie gebruiken binnen de BitmapData-klasse. Zijn naam is getPixels ()
.
getPixels ()
retourneert een ByteArray van alle pixelgegevens van een BitmapData. In tegenstelling tot de BitmapData-klasse, ByteArrays kan worden opgeslagen in SharedObjects, zodat ze de juiste tool zijn om onze Doodle op te slaan.
Het enige wat u hoeft te doen is deze regel code toe te voegen aan uw saveObjectData-functie direct nadat u klaar bent met uw BitmapData-werk:
// Verplaatst de waarde van de geretourneerde // ByteArray van de functie getPixels () // in myDataArrayInProgram // getPixels () vereist een rechthoek die // toont welk deel van de pixels van het object // we eigenlijk willen! // OPMERKING: de huidige rechthoek is slechts // een benadering van waar de doodle // moet worden weergegeven! mySaveData.data.myDataArray.push (bitmapDataSnapshot.getPixels (nieuwe rechthoek (250, 30, 150, 100)))
Op naar de laatste stap. Nadat de gegevens zijn opgeslagen, moeten we de gebruiker de pagina vernieuwen om aan te tonen dat de doodle op de harde schijf is opgeslagen en niet alleen in het tijdelijke geheugen is opgeslagen. Trek een zwarte doos rond het podium en voeg wat tekst toe die de speler vraagt te vernieuwen. Selecteer vervolgens het hele object en druk op F8. Controleer het vakje "Exporteren voor Actionscript" en stel "Class" in op "refreshScreen". U kunt nu het object op het podium verwijderen ...
Hieronder staat het refreshScreen dat ik heb getekend:
Voeg nu deze code toe aan de onderkant van uw saveObjectData-functie:
addChild (nieuw refreshScreen ())
De voltooide saveObjectData-functie zou er als volgt uit moeten zien:
persoonlijke functie 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, new Rectangle (250, 30, 150, 100)) myDataArrayInProgram.push (bitmapDataSnapshot.getPixels (nieuwe rechthoek (250, 30) , 150, 100))) mySaveData.data.myDataArray = myDataArrayInProgram mySaveData.flush () trace (mySaveData.data.myDataArray) addChild (nieuw refreshScreen ())
Het is tijd om onze hele Doodle te reconstrueren uit de ByteArray die we eerder hebben opgeslagen!
Je moet denken: "Wat doe ik in hemelsnaam met een ByteArray, het is maar een stelletje onleesbare mumbo-jumbo!" En je hebt gelijk, dat is het! Gelukkig heeft Adobe ons ook een geweldige functie gegeven, genaamd setPixels ()
waarbij je dezelfde Rectangle en ByteArray geeft, om dezelfde BitmapData die je had opnieuw aan te maken!
Voordat we onze hele MovieClip reconstrueren, moeten we doorgaan en een test uitvoeren om te kijken of we de BitmapData zelf kunnen reconstrueren. Wijzig uw loadObjectData
functie zodat het er zo uitziet:
persoonlijke functie loadObjectData (e: MouseEvent): void // Creëert een BitmapData en maakt // het de grootte van de stage, en // past alle oude instellingen var toe loadBitmapData: BitmapData = nieuwe BitmapData (640, 480, true, 1) // Stelt de pixels van loadBitmap // in met behulp van onze oude rechthoek en // door toegang te krijgen tot onze SaveData ByteArray // (4e item in myDataArray (myDataArray [3])) loadBitmapData.setPixels (nieuwe rechthoek (250, 30, 150) , 100), mySaveData.data.myDataArray [3]) // Creëert een nieuwe bitmap en vertelt deze om zijn afbeelding te laden vanuit loadBitmapData var-weergave: Bitmap = nieuwe Bitmap (loadBitmapData) // Verplaatst het objectmasker // playhead naar het juiste frame myObjectAsMask.gotoAndStop (mySaveData.data.myDataArray [2]) // Maskeer de afbeelding met het masker display.mask = myObjectAsMask // Voegt de Bitmap toe aan het podium addChild (scherm)
Nu is het tijd om alles samen te voegen! Klik eerst met de rechtermuisknop op myObject
(in bibliotheek)> Eigenschappen. Vink nu het vakje "Exporteren voor Actionscript" aan en stel "Class" in op "myObjectType". Vergelijk uw eigenschappen met die in de afbeelding:
Als het allemaal hetzelfde is, dan zijn we klaar om te gaan! Voeg dit toe boven onze constructor:
privé var myNewObject: myObjectType;
En voeg toe allemaal hiervan naar de top van loadObjectData ()
.
// Maakt een nieuw exemplaar van myObjectType (myObject) myNewObject = new myObjectType () // Stelt de X in op de oude positie myNewObject.x = mySaveData.data.myDataArray [0] // Stelt de Y in op de oude positie myNewObject.y = mySaveData.data.myDataArray [1] // Selecteert het oude object myNewObject.gotoAndStop (mySaveData.data.myDataArray [2]) // Verplaatst de afspeelkop naar het juiste animatiekader myNewObject.getChildAt (0) .gotoAndStop (mySaveData.data .myDataArray [3]) // Voegt het object toe aan de fase addChild (myNewObject) // Verwijdert comboBox-gebeurtenislistener myComboBox.removeEventListener (Event.CHANGE, changeObjectFrame) // Verwijdert de "doStuff" -eventlisteners voor knoppen saveStuff.removeEventListener (MouseEvent .CLICK, saveObjectData) loadStuff.removeEventListener (MouseEvent.CLICK, loadObjectData) clearStuff.removeEventListener (MouseEvent.CLICK, clearObjectData) // Verwijdert tekeningsgebeurtenislisteners stage.removeEventListener (MouseEvent.MOUSE_MOVE, drawDoodle) stage.removeEventListener (MouseEvent.MOUSE_DOWN, mouseDown ) hert e.removeEventListener (MouseEvent.MOUSE_UP, mouseUp) // Verwijdert onnodige gebruikersinterface removeChild (myObject) removeChild (saveStuff) removeChild (loadStuff) removeChild (clearStuff) removeChild (myComboBox) removeChild (myCanvas)
Test de app, het zou perfect moeten werken.
Gefeliciteerd! U hebt officieel een MovieClip gereconstrueerd met de klasse SharedObject!
Als de bovenstaande applicatie werkt, moet deze een gepauzeerd beeld bevatten van waar u myObject hebt opgeslagen. Om de animatie weer te laten spelen, maken we een knop "Afspelen". Hier is degene die ik heb gekozen:
Sleep het net eronder myObject
op het podium en stel de instantienaam in op "playAnimation".
Voeg dit nu toe aan de onderkant van onze constructor:
// Verberg knoppen playAnimation.visible = false // Knoppen toevoegen Event Luisteraar playAnimation.addEventListener (MouseEvent.CLICK, playObjectAnimation)
Plaats dit onderaan loadObjectData ()
.
// Toont de knop playAnimation.visible = true
Voeg ten slotte deze functie toe aan uw programma:
privéfunctie playObjectAnimation (e: MouseEvent): void myNewObject.play ()
Hier is onze broncode van de definitieve applicatie. Als er een verschil is tussen uw code en deze, gaat u terug en ziet u waar u een ander pad hebt genomen.
pakket import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Graphics; import flash.display.Shape; import flash.display.Sprite; import fl.controls.ComboBox import flash.events.Event; import flash.events.MouseEvent; import flash.geom.Matrix; import flash.geom.Rectangle; import flash.net.SharedObject; public class Main breidt Sprite uit private var myComboBox: ComboBox = nieuwe ComboBox () private var myCanvas: Shape = new Shape () private var mouseIsDown: Boolean = false private var mySaveData: SharedObject = SharedObject.getLocal ("saveData") private var bitmapDataSnapshot : BitmapData private var myNewObject: myObjectType publieke functie 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, saveObData) loadStuff.addEventListener (MouseEvent.CLICK, loadObjectData) clearStuff.addEventListener (Mous eEvent.CLICK, clearObjectData) playAnimation.visible = false playAnimation.addEventListener (MouseEvent.CLICK, playObjectAnimation) private function clearObjectData (e: MouseEvent): void mySaveData.clear () myCanvas.graphics.clear () private function loadObjectData ( e: MouseEvent): void myNewObject = new 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) stage.removeEventListener (MouseEvent.MOUSE_DOWN, mouseDown) stage.removeEventListener (MouseEvent.MOUSE_UP, mouseUp) remo veChild (myObject) removeChild (saveStuff) removeChild (loadStuff) removeChild (clearStuff) removeChild (myComboBox) removeChild (myCanvas) var loadBitmapData: BitmapData = nieuwe BitmapData (640, 480, true, 1) loadBitmapData.setPixels (new Rectangle (250, 30) , 150, 100), mySaveData.data.myDataArray [4]) var elkaar: Bitmap = new Bitmap (loadBitmapData) myObjectAsMask.gotoAndStop (mySaveData.data.myDataArray [2]) display.mask = myObjectAsMask addChild (display) playAnimation.visible = true persoonlijke functie playObjectAnimation (e: MouseEvent): void myNewObject.getChildAt (0) .play () playAnimation.visible = false private function 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 = nieuwe BitmapData (640, 480, waar, 0) bitmapDataSnapshot.draw (myCanvas, null, null, null, nieuwe Recta ngle (250, 30, 150, 100)) myDataArrayInProgram.push (bitmapDataSnapshot.getPixels (new Rectangle (250, 30, 150, 100))) = mySaveData.data.myDataArray myDataArrayInProgram mySaveData.flush () trace (mySaveData.data. myDataArray) persoonlijke functie mouseUp (e: MouseEvent): void mouseIsDown = false persoonlijke functie mouseDown (e: MouseEvent): void mouseIsDown = true myCanvas.graphics.moveTo (myCanvas.mouseX, myCanvas.mouseY); private functie drawDoodle (e: MouseEvent): void if (mouseIsDown) myCanvas.graphics.lineStyle (5, 0, 1) myCanvas.graphics.lineTo (myCanvas.mouseX, myCanvas.mouseY); persoonlijke functie changeObjectFrame (e: Event): void if (myComboBox.selectedLabel == "Rectangle") myObject.gotoAndStop (1) if (myComboBox.selectedLabel == "Triangle") myObject.gotoAndStop (2) if (myComboBox.selectedLabel == "Circle") myObject.gotoAndStop (3) myCanvas.graphics.clear () myObjectAsMask.gotoAndStop (myObject.currentFrame)
Zoals u kunt zien, is het met een klein beetje tweaken absoluut mogelijk om alle MovieClip-gegevens op te slaan in SharedObjects om later te laden. Dit betekent dat als je een spel aan het schrijven bent, je makkelijk save states kunt maken in plaats van kleine checkpoints ...
Veel succes met het gebruiken van deze methode om gegevens over uw games en applicaties op te slaan, om uw programma's beter dan ooit te maken!
Bedankt voor het lezen!