Maak een Slick Image Revealer in Flash met ActionScript 3

In deze zelfstudie maken we een geanimeerde maskeerversie van afbeeldingen, met filmclips, maskers en ActionScript 3.


Eindresultaat voorbeeld

Hieronder is het eindresultaat waar we naartoe zullen werken.

Stap 1 - Kort overzicht

We maken het bovenstaande effect, maar zonder de functie 'klik opnieuw afspelen'. Hier is een overzicht van wat we gaan doen. Er zullen twee lagen zijn. De ene houdt de acties vast en de andere bevat de afbeelding. We zullen ook een geanimeerde filmclip maken die tijdens runtime aan een masker wordt toegevoegd. Het doel van de geanimeerde filmclip is om de afbeelding beetje bij beetje te onthullen.

Ik ga ervan uit dat je al een basiskennis hebt van Flash en ActionScript 3. Ik zal echter nog steeds proberen elke stap zo duidelijk mogelijk te houden.

Stap 2

Maak een nieuw ActionScript 3-document. Stel de Stage-maat in op 600 x 420 px en 24 FPS. Ik heb voor deze maat gekozen omdat de afbeelding die ik ga gebruiken, mooi in deze dimensies past.

Stap 3

Hernoem de eerste laag naar "afbeelding" en importeer de afbeelding vervolgens. Ik heb een afbeelding van een strand geïmporteerd en het midden op het strand uitgelijnd.

Stap 4

Selecteer nu de afbeelding en converteer deze naar een filmclipsymbool. Ik heb het 'strand' genoemd, maar het kan echt alles zijn. Zorg ervoor dat het registratiepunt zich in de linkerbovenhoek bevindt.

Stap 5

Geef de nieuwe afbeelding Movie Clip een instantienaam van "imageToReveal_mc". Vergrendel die laag omdat we hem niet meer zullen veranderen.

Opmerking: ik heb de naam beëindigd met "_mc". Dit is handig als u automatische codehints wilt in het deelvenster Handelingen.

Stap 6

Laten we nu een beetje animatie maken. Maak een nieuw symbool en geef het een naam "cirkelanimatie". Selecteer "Movie Clip" als het type.

Stap 7

Je zou nu in de tijdlijn van de "cirkelanimatie" moeten zijn. Hernoem eerst de laag naar "animatie" en maak vervolgens een cirkel van 80 x 80px op het podium. Centreer het.

Stap 8

Selecteer de cirkel en converteer deze in een symbool (F8). Noem het "cirkel" en selecteer "Grafisch" als het type. Zorg ervoor dat het registratiepunt "centraal" is.

Stap 9

Selecteer de grafische cirkel en pas een eenvoudige bewegings-tween toe. De duur is 14 frames. Zorg ervoor dat de cirkel een schaal van 1% heeft op frame 1 en 100% op frame 14. U kunt de positie / schaal / rotatie van de cirkel naar wens aanpassen tussen de frames. Ik heb alleen de mijne geschaald.

Stap 10

Maak nu een nieuwe laag in de filmclip met de naam "acties". Plaats een sleutelframe in het laatste frame (14). Open het deelvenster Handelingen en voeg een stopactie toe. Hiermee stopt de animatie van een lus.

Stap 11

Zodra dat is gebeurd, gaat u naar het Bibliotheekpaneel, klikt u met de rechtermuisknop op "animatie omcirkelen" en selecteert u "Eigenschappen ...". Zorg ervoor dat u zich in de weergave 'Geavanceerd' bevindt. Vink "Exporteren voor ActionScript" aan - "Exporteren in frame 1" moet automatisch worden gecontroleerd. Voer voor de klasse "CircleAnimation" in en verlaat de basisklasse als "flash.display.MovieClip".

Stap 12 - Controlepunt

Ga nu terug naar de hoofdtijdlijn en zorg ervoor dat alleen de laag "afbeelding" op het podium staat. De nieuwe "cirkelanimatie" die je hebt gemaakt, zou niet op het toneel moeten staan, hij zou alleen in de bibliotheek moeten bestaan.

Stap 13

Maak een nieuwe laag met de naam "acties" en vergrendel deze. Selecteer het eerste frame voor die laag en ga naar het deelvenster Handelingen.


Notitie: Normaal vind ik het leuk om mijn "acties" -laag bovenaan te plaatsen, zodat het gemakkelijk te vinden is.

Stap 14

Maak eerst een masker voor de afbeelding. Voeg het vervolgens toe aan het werkgebied en wijs het masker toe aan de afbeelding Filmclip.

Stap 15

Nu maken we 4 variabelen: xPos, yPos, spacingX, en spacingY. "xPos" en "yPos" worden gebruikt om de nieuwe CircleAnimation-instanties te positioneren. "spacingX" en "spacingY" is de afstand tussen elk CircleAnimation-exemplaar langs de x- en y-as.

Stap 16

Omdat we CircleAnimation-instanties één voor één in het masker willen invoegen, gebruiken we een timer om een ​​functie herhaaldelijk te bellen. De functie "revealImage" wordt elke 30 milliseconden genoemd. Om de Timer te starten, moet u ook de "start" -methode aanroepen.


Notitie: Ik zou willen voorstellen dat je de niet-gecomprimeerde addEventListener gebruikt, omdat deze kan helpen met geheugenbeheer als je ooit vergeet om ongebruikte luisteraars te verwijderen. De vijfde parameter (true) verwijst naar "zwakke referentie", die standaard is ingesteld op "false". Raadpleeg deze blogpost voor meer informatie over "zwakke referentie".

Stap 17

Laten we de functie "revealImage" nu maken. Zorg ervoor dat het een parameter heeft van het type "TimerEvent".

Stap 18

Maak nu een nieuwe instantie voor CircleAnimation en positioneer deze op basis van de "xPos" en "yPos". Voeg het dan toe aan het masker.

Stap 19

Momenteel zijn alle CircleAnimation-instanties op elkaar gestapeld, omdat 'xPos' en 'yPos' altijd hetzelfde zijn. Wat we willen is dat de instanties van links naar rechts en van boven naar beneden verschijnen, dus we moeten ervoor zorgen dat we de "xPos" met "spaceX" verhogen. Hetzelfde geldt voor "yPos" met "spaceY", maar "yPos" zou alleen moeten toenemen wanneer "xPos" de maximale x-grens overschrijdt. Wanneer dat gebeurt, moet "xPos" ook terug naar links worden gereset.

Stap 20

Als u uw film nu test, moet deze de afbeelding onthullen als het uiteindelijke effect. Er is een belangrijk ding dat je misschien niet hebt opgemerkt; CircleAnimation-instanties worden nog steeds gemaakt, zelfs nadat de afbeelding is onthuld. Dit komt omdat de gebeurtenislistener "createChildTimer" nooit wordt verwijderd. We moeten controleren om te zien of "yPos" de maximale y-grens heeft overschreden en, zo ja, de "createChildTimer" gebeurtenislistener verwijderen.

Stap 21 - Laatste code

By the way, "imageToReveal_mc.x + imageToReveal_mc.width + spacingX" en "imageToReveal_mc.y + imageToReveal_mc.height + spacingY" veranderen nooit, dus ik heb ze opgeslagen in de variabelen "maxXPos" en "maxYPos".

Uw definitieve code in het deelvenster Handelingen zou er ongeveer zo uit moeten zien ...

 var maskImg: MovieClip = nieuwe MovieClip (); addChild (maskImg); imageToReveal_mc.mask = maskImg; var xPos: Number = imageToReveal_mc.x; var yPos: Number = imageToReveal_mc.y; var spacingX: Number = 50; var spacingY: Number = 50; var createChildTimer: Timer = new Timer (30); // createChildTimer.addEventListener (TimerEvent.TIMER, revealImage); createChildTimer.addEventListener (TimerEvent.TIMER, revealImage, false, 0, true); createChildTimer.start (); var maxXPos: Number = imageToReveal_mc.x + imageToReveal_mc.width + spacingX; var maxYPos: Number = imageToReveal_mc.y + imageToReveal_mc.height + spacingY; function revealImage (evt: TimerEvent): void var ca: CircleAnimation = new CircleAnimation (); ca.x = xPos; ca.y = yPos; maskImg.addChild (ca); xPos + = spacingX; if (xPos> maxXPos) xPos = imageToReveal_mc.x; yPos + = spacingY;  if (yPos> maxYPos) createChildTimer.removeEventListener (TimerEvent.TIMER, revealImage); 

Stap 22 - Optioneel per rij

Door een beetje recursie te gebruiken, kunnen we het effect wijzigen, zodat het beeld rij per rij wordt weergegeven.

 var maskImg: MovieClip = nieuwe MovieClip (); addChild (maskImg); imageToReveal_mc.mask = maskImg; var xPos: Number = imageToReveal_mc.x; var yPos: Number = imageToReveal_mc.y; var spacingX: Number = 50; var spacingY: Number = 50; var createChildTimer: Timer = new Timer (120); // createChildTimer.addEventListener (TimerEvent.TIMER, revealImage); createChildTimer.addEventListener (TimerEvent.TIMER, revealImage, false, 0, true); createChildTimer.start (); var maxXPos: Number = imageToReveal_mc.x + imageToReveal_mc.width + spacingX; var maxYPos: Number = imageToReveal_mc.y + imageToReveal_mc.height + spacingY; function revealImage (evt: TimerEvent): void var ca: CircleAnimation = new CircleAnimation (); ca.x = xPos; ca.y = yPos; maskImg.addChild (ca); xPos + = spacingX; if (xPos> maxXPos) xPos = imageToReveal_mc.x; yPos + = spacingY;  else revealImage (evt);  if (yPos> maxYPos) createChildTimer.removeEventListener (TimerEvent.TIMER, revealImage); 

Stap 23 - Optioneel per kolom

Hier is een kolom voor kolomversie. De meeste van de x- en y-variabelen / eigenschappen hebben posities geruild.

 var maskImg: MovieClip = nieuwe MovieClip (); addChild (maskImg); imageToReveal_mc.mask = maskImg; var xPos: Number = imageToReveal_mc.x; var yPos: Number = imageToReveal_mc.y; var spacingX: Number = 50; var spacingY: Number = 50; var createChildTimer: Timer = new Timer (120); // createChildTimer.addEventListener (TimerEvent.TIMER, revealImage); createChildTimer.addEventListener (TimerEvent.TIMER, revealImage, false, 0, true); createChildTimer.start (); var maxXPos: Number = imageToReveal_mc.x + imageToReveal_mc.width + spacingX; var maxYPos: Number = imageToReveal_mc.y + imageToReveal_mc.height + spacingY; function revealImage (evt: TimerEvent): void var ca: CircleAnimation = new CircleAnimation (); ca.x = xPos; ca.y = yPos; maskImg.addChild (ca); yPos + = spacingY; if (yPos> maxYPos) yPos = imageToReveal_mc.y; xPos + = spacingX;  else revealImage (evt);  if (xPos> maxXPos) createChildTimer.removeEventListener (TimerEvent.TIMER, revealImage); 

Conclusie

Er zijn veel andere dingen die u kunt veranderen om verschillende onthullende effecten te krijgen, zoals de vorm die in de animatie wordt gebruikt, transformaties in de animatie, timersnelheid, enz..

Bedankt voor het bekijken van deze tutorial en ik hoop dat je het leuk vond.