Rask Tips Piske opp Real Time Motion Trails

I denne Quick Tip skal vi bruke ColorMatrixFilter og BlurFilter for å lage en Motion Trail-effekt.

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


Endelig resultatforhåndsvisning

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


Trinn 1: Opprett prosjekt og sett det opp

Opprett et nytt prosjekt i FlashDevelop (eller hvilken redaktør du bruker), sett dimensjonene til swf til 600x400 og bakgrunnen til svart (# 000000).

For å sette opp scenen skal vi ha to sprites, en er for hoveddisplayet som vi vil legge til alle skjermobjektene, og den andre er for bevegelsessporet-effekten som bruker hoveddisplayet som referanse.

 private var _mainDisplay: Sprite = new Sprite (); privat var _mtDisplay: Sprite = new Sprite ();

Og legg til sprites til Scene.

 // // Set up Displays // Vi må legge til våre to skjermer til Stage addChild (_mtDisplay); addChild (_mainDisplay);

Nå skal vi legge inn vårt stjernebilde for bruk, eller hvis du vil bruke ditt eget bilde.

 [Embed (source = '... / ... /images/star.png')] var stjerne: Klasse;

Den endelige tingen vi vil gjøre for oppsettet, er å lage en sløyfe funksjon. Dette vil bli oppdatert hver ramme, for ting som posisjonering og oppdatering av Motion Trail. Så gjør en annen funksjon og en hendelse lytter å kalle det hver ramme.

Din Main.as klassen skal se noe slikt ut.

 pakke rtmTrail import flash.display.Sprite; importere flash.events.Event; offentlig klasse Hoved utvider Sprite offentlig funksjon Main (): void if (stage) init (); ellers addEventListener (Event.ADDED_TO_STAGE, init);  privat funksjon init (e: Event = null): void removeEventListener (Event.ADDED_TO_STAGE, init); // // Legg inn bilder [Embed (source = '... / ... /images/star.png')] var stjerne: Klasse; // // Set up Displays // Vi må legge til våre to skjermer til scenen addChild (_mtDisplay); addChild (_mainDisplay); // Legg til en ny Event Listener for vår loop-funksjon når vi går inn // rammen for å flytte sprites og oppdater våre MotionTrail Effect addEventListener (Event.ENTER_FRAME, loop);  Private funksjonsløyfe (e: Event): void  private var _mainDisplay: Sprite = new Sprite (); privat var _mtDisplay: Sprite = new Sprite (); 

Trinn 2: Sprites & TextField

For å teste Motion Trail skal vi lage ti sprites fra stjernen bildet og plassere dem på tilfeldige steder. I tillegg skal vi lage en Punkt som forteller oss hastigheten og retningen de vil bevege seg. Den første tingen å gjøre er å lage to arrays å lagre denne informasjonen; en er for Sprite og den andre er for Punkt.

 private var _sprites: Array = new Array (); private var _spritesDir: Array = new Array (); private var _txt: TextField = ny TextField ();

Legg dette til i i det Funksjonen er å tilfeldig opprette og plassere ti stjerner.

 // Tegn noen stjerner var spr: Sprite; var bmp: Bitmap; for (var jeg: int = 0; i < 10; i++)  spr = new Sprite(); bmp = new star(); spr.addChild(bmp); bmp.smoothing = true; spr.x = Math.random() * 240 + 80; spr.y = Math.random() * 240 + 80; // We are going to add the new sprite into the _sprites Array and a // Point that tells us where to move the sprite in the _spritesDir Array. _sprites.push(spr); _spritesDir.push(new Point(Math.random() * 6, Math.random() * 6)); // Last thing to do is add it to our main Display _mainDisplay.addChild(spr); 

Nå for å lage Tekstfelt Legg til dette.

 // Legg til et tekstfelt for _txt.defaultTextFormat = nytt TextFormat ("arial", 18, 0xFF00FF); _txt.text = "Real Time Motion Trail" _txt.x = 20; _txt.y = 10; _txt.width = 200; _mainDisplay.addChild (_txt);

Trinn 3: Kontroll Sprite-bevegelse

Nå må vi flytte inn i vår sløyfe funksjon for Sprite bevegelseskontroll. Ganske enkelt, bruk a til loop for å gå gjennom hver Sprite vi har, og hvis det treffer kanten, reverserer x eller y av Punkt så det går i den andre retningen. Vi må også flytte sprite i løkken av verdiene i Punkt og for å gjøre det mer interessant, roter det langsomt.

 privat funksjonsløype (e: Event): void // Oppdater Sprite Shapes for (var i: int = 0; i < _sprites.length; i++)  // Check to see if the shape is at or out of the // outer bounds so we can change direction if (_sprites[i].x <= 0 || _sprites[i].x >= 600) _spritesDir [i] .x = -_spritesDir [i] .x; hvis (_sprites [i] .y <= 0 || _sprites[i].y >= 400) _spritesDir [i] .y = -_spritesDir [i] .y; // Flytt Sprite Shape _sprites [i] .x + = _spritesDir [i] .x; _sprites [i] .y + = _spritesDir [i] .y; // Rotate Sprite Shape _sprites [i] .rotation + = 2; 

For å flytte Tekstfelt over toppen til venstre må vi bare trekke fra x Egenskap hver ramme, og hvis den går av skjermen, sett den tilbake til høyre side av skjermen.

 privat funksjonsløype (e: Event): void // Oppdater Sprite Shapes for (var i: int = 0; i < _sprites.length; i++)  // Check to see if the shape is at or out of the // outer bounds so we can change direction if (_sprites[i].x <= 0 || _sprites[i].x >= 600) _spritesDir [i] .x = -_spritesDir [i] .x; hvis (_sprites [i] .y <= 0 || _sprites[i].y >= 400) _spritesDir [i] .y = -_spritesDir [i] .y; // Flytt Sprite Shape _sprites [i] .x + = _spritesDir [i] .x; _sprites [i] .y + = _spritesDir [i] .y; // Rotate Sprite Shape _sprites [i] .rotation + = 2;  // Flytt tekst _txt.x - = 4 hvis (_txt.x < -200) _txt.x = 600; 

Etter å ha testet det, burde du ha sett noe slikt (med stjernene og teksten som beveger seg rundt på skjermen selvfølgelig).


Trinn 4: Opprett MotionTrail-klassen

Nå er det på tide å lage vår MotionTrail Klasse. Hva denne klassen skal gjøre er å ta en Displayobject som er trukket til sin egen skjerm (a Sprite) og bruker et par filtre, bleknet og uskarpt.

Så gjør det nye MotionTrail.as Klasse og la det forlenge Sprite Klasse.

For litt forhåndsoppsett for trinnene som kommer, skal vi lage noen få variabler, først _vise for å lagre en referanse til hovedskjermen, a BitmapData å tegne til, a Rektangel størrelsen på scenen og a Punkt i øverste venstre hjørne for filtrene. Sist opp er en Array for ColorMatrixFilter.

 pakke rtmTrail import flash.display.Bitmap; importer flash.display.BitmapData; importer flash.display.DisplayObject; importer flash.display.Sprite; importer flash.geom.Point; importer flash.geom.Rectangle; offentlig klasse MotionTrail utvider Sprite offentlig funksjon MotionTrail (display: DisplayObject) // Henvisning til skjermen som brukes til bevegelsesporet _display = display; // Lag et BitmapData objekt å tegne til // Hvis du vil bruke dette til ditt eget prosjekt og dimensjonene ikke er 600x400 //, må du endre det her og rektangelet nedenfor _bitmapData = ny BitmapData (600, 400 , sant, 0x000000); // Noen ting som filtene trenger inntastet for at det skal fungere _rect = nytt rektangel (0, 0, 600, 400); _pnt = nytt punkt (0, 0); _cMatrix = ny Array (); // Legg litt gjennomsiktighet slik at det ikke tar oppmerksomhet vekk fra hoveddisplayet alfa = 0,6; addChild (ny Bitmap (_bitmapData));  privat var _display: DisplayObject; privat var _bitmapData: BitmapData; private var _rect: rektangel; privat var _pnt: punkt; privat var _cMatrix: Array; 

Siden vi har laget denne klassen må vi gå tilbake veldig raskt til _mtDisplay variabel og endre den fra Sprite Klasse til MotionTrail Klasse, sammen med innlasting av _mainDisplay variabel.

 private var _mainDisplay: Sprite = new Sprite (); private var _mtDisplay: MotionTrail = ny MotionTrail (_mainDisplay);

Trinn 5: ColorMatrixFilter Array

Å skape vår Matrise for ColorMatrixFilter, Den grunnleggende ideen er å fade fargene vekk, slik at vi sakte reduserer alle verdiene tilbake til null. Legg dette til i konstruktør.

 // Lag matrise for ColorMatrixFilter _cMatrix = _cMatrix.concat ([0.92, 0, 0, 0, 0)) // Red _cMatrix = _cMatrix.concat ([0, 0.92, 0, 0, 0]) // Green _cMatrix = _cMatrix.concat ([0, 0, 0.92, 0, 0]) // Blå _cMatrix = _cMatrix.concat ([0, 0, 0, 0.92, 0]) // Alpha

Dette vil multiplisere hver verdi av hver piksel med 0,92, og som det gjør hver ramme blir den mindre og mindre til den i utgangspunktet når grensen til 0. Jo nærmere verdiene er til 1,0, desto lengre det tar å nå null, hvilket betyr at en lengre sti (og omvendt: jo nærmere 0,0 jo kortere stien).


Trinn 6: ColorMatrixFilter og BlurFilter

Nå lager vi ColorMatrixFilter og BlurFilter.

De ColorMatrixFilter skal bruke Array vi har nettopp laget og vi skal lage to BlurFilters. Jeg fant at ved å bruke to BlurFilters gir en fin pulseffekt og det blir ikke uskarpt for sakte eller for fort, men hvis du heller har en som også passer bra.

Legg til variablene for filtre først.

 privat var _cFilter: ColorMatrixFilter; privat var _bFilter: BlurFilter; private var _bFilter2: BlurFilter;

Lag filtre i konstruktøren

 _cFilter = ny ColorMatrixFilter (_cMatrix); _bFilter = ny BlurFilter (2, 2, 1); _bFilter2 = ny BlurFilter (8, 8, 1);

Trinn 7: Oppdatere MotionTrails

Nå er det på tide å opprette en funksjon for å oppdatere våre Motion Trails. Lag en funksjon som heter Oppdater i MotionTrail Klasse. For å gjøre stien må vi tegne hovedskjermen til BitmapData hver ramme som gjør stien effekten.

 offentlig funksjon oppdatering (): void // Tegn Vis på BitmapData _bitmapData.draw (_display); 

Du bør nå ha en sti hvis du kjører den, men selvfølgelig forsvinner Motion Trails bort, og vi vil gjøre det forsvinne med filtre vi laget i det siste trinnet.


Trinn 8: Bruk av filtre

Nå kan vi bruke filtrene til BitmapData. Vi bruker det samme BitmapData for kilden, den _rect og _pnt variabler for sourceRect og destPoint henholdsvis, og sist er filteret vi vil bruke.

Siden vi har noen få filtre, ønsker vi ikke å bruke alle av dem hver ramme fordi det å gjøre det vil redusere ting for mye. I stedet skal vi bytte ColorMatrixFilter og BlurFilter å jobbe i forskjellige rammer og bytte BlurFilters på samme måte.

For å bytte dem rundt, skal vi ha en variabel for å holde oversikt over rammen og bruke moduloperatøren til å sjekke.

 privat var _count: tall = 0;
 offentlig funksjon oppdatering (): void // Tegn Vis på BitmapData _bitmapData.draw (_display); // Bruk effekter til BitmapData hvis (_count% 2 == 0) _bitmapData.applyFilter (_bitmapData, _rect, _pnt, _cFilter); ellers hvis (_count% 4 == 1) _bitmapData.applyFilter (_bitmapData, _rect, _pnt, _bFilter); ellers _bitmapData.applyFilter (_bitmapData, _rect, _pnt, _bFilter2); // Øk graden _count ++; 

Nå da Oppdater funksjonen er ferdig legger vi den til vår sløyfe funksjon.

 // Oppdater Motion Blur _mtDisplay.update ();

Konklusjonstesting og forlengelse

Rått! Vi er ferdige med denne raske tipsen, og du kan fortsette og teste den ut.

Du burde ha fått samme resultat som sample swf, og nå kan du prøve å utvide den. Det er mange forskjellige effekter du kan gjøre, mesteparten av det hvis du forstår ColorMatrixFilter.

For eksempel kan du fade fargen på stien til rød ved å gjøre dette:

 // Offset Red Value med 30 hver gang _cMatrix = _cMatrix.concat ([0.92, 0, 0, 0, 30)) // Red _cMatrix = _cMatrix.concat ([0, 0.92, 0, 0, 0]) // Grønn _cMatrix = _cMatrix.concat ([0, 0, 0,92, 0, 0]) // Blå _cMatrix = _cMatrix.concat ([0, 0, 0, 0.92, 0]) // Alpha

Eller du kan også bytte fargene som gjør alle stiene blå:

 // Bare blå stier _cMatrix = _cMatrix.concat ([0, 0, 0, 0, 0)) // Rød _cMatrix = _cMatrix.concat ([0, 0, 0, 0, 0)) // Grønn _cMatrix = _cMatrix .concat ([0.92, 0.92, 0.92, 0, 0]) // Blå _cMatrix = _cMatrix.concat ([0, 0, 0, 0.92, 0]) // Alpha

Takk for at du leste. Jeg håper dere alle har lært noe av dette, og det vil vise seg å være nyttig i fremtiden, muligens et kult nytt spill som bruker denne effekten.