Snabbtips Whipping up realtidsbanor

I denna Snabba Tips ska vi använda Colormatrixfilter och BlurFilter för att skapa en Motion Trail-effekt.

Vi hittade denna fantastiska författare tack vare FlashGameLicense.com, platsen att köpa och sälja Flash-spel.


Slutresultatförhandsvisning

Låt oss ta en titt på det slutliga resultatet vi ska arbeta för:


Steg 1: Skapa projekt och sätt upp det

Skapa ett nytt projekt i FlashDevelop (eller vilken redaktör du använder), sätt dimensionerna för swf till 600x400 och bakgrunden till svart (# 000000).

Nästa, för att ställa upp scenen kommer vi att ha två sprites, en är för huvuddisplayen som vi kommer att lägga till alla bildobjekt och den andra är för rörelsespårseffekten som använder huvuddisplayen som referens.

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

Och lägg till sprites till Skede.

 // // Set up Displays // Vi måste lägga till våra två skärmar till Stage addChild (_mtDisplay); addChild (_mainDisplay);

Nu ska vi bädda in vår stjärnbild för användning, eller om du vill använda din egen bild.

 [Bädda in (source = '... / ... /images/star.png')] var stjärna: Klass;

Det sista vi vill göra för installationen är att skapa en slinga fungera. Detta kommer att uppdateras varje ram, för saker som positionering och uppdatering av rörelsespåret. Så gör en annan funktion och en händelse lyssnare att kalla det varje ram.

Din Main.as klassen ska se ut så här.

 paketet rtmTrail importera flash.display.Sprite; importera flash.events.Event; public class Main sträcker Sprite public function Main (): void if (stage) init (); annars addEventListener (Event.ADDED_TO_STAGE, init);  privatfunktion init (e: Event = null): void removeEventListener (Event.ADDED_TO_STAGE, init); // // Ladda upp bilder [Bädda in (source = '... / ... /images/star.png')] var stjärna: Klass; // // Set up Displays // Vi måste lägga till våra två skärmar till scenen addChild (_mtDisplay); addChild (_mainDisplay); // Lägg till en ny Event Listener för vår loop-funktion när vi går in // ramen för att flytta sprites och uppdatera vår MotionTrail Effect addEventListener (Event.ENTER_FRAME, loop);  privat funktionsling (e: händelse): void  privat var _mainDisplay: Sprite = new Sprite (); privat var _mtDisplay: Sprite = new Sprite (); 

Steg 2: Sprites & TextField

För att testa Motion Trail ska vi skapa tio sprites från stjärnbilden och placera dem på slumpmässiga platser. Dessutom ska vi skapa en Punkt Det berättar för oss hur snabbt och riktigt de ska röra sig. Det första du behöver göra är att skapa två arrayer att lagra denna information; en är för Sprite och den andra är för Punkt.

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

Lägg till det här i i det funktionen att slumpmässigt skapa och placera tio stjärnor.

 // Rita några stjärnor var spr: Sprite; var bmp: Bitmapp; för (var i: 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); 

Nu för att skapa Textfält Lägg till detta.

 // Lägg till ett textfält för _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);

Steg 3: Control Sprite Movement

Nu måste vi flytta in i vårt slinga funktion för Sprite rörelsekontroll. Ganska enkelt, använd a för slinga för att gå igenom vardera Sprite vi har och om det träffar kanten invers x eller y av Punkt så det går i andra riktningen. Vi måste också flytta sprite i loop med värdena i Punkt och för att göra det mer intressant, rotera det långsamt.

 privat funktion loop (e: Event): void // Uppdatera Sprite Shapes för (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; om (_sprites [i] .y <= 0 || _sprites[i].y >= 400) _spritesDir [i] .y = -_spritesDir [i] .y; // Flytta Sprite Shape _sprites [i] .x + = _spritesDir [i] .x; _sprites [i] .y + = _spritesDir [i] .y; // Rotera Sprite Shape _sprites [i] .rotation + = 2; 

För att flytta Textfält Överst till vänster måste vi bara subtrahera från x egendom varje ram, och om den går av skärmen sätt tillbaka den till höger på skärmen.

 privat funktion loop (e: Event): void // Uppdatera Sprite Shapes för (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; om (_sprites [i] .y <= 0 || _sprites[i].y >= 400) _spritesDir [i] .y = -_spritesDir [i] .y; // Flytta Sprite Shape _sprites [i] .x + = _spritesDir [i] .x; _sprites [i] .y + = _spritesDir [i] .y; // Rotera Sprite Shape _sprites [i] .rotation + = 2;  // Flytta Text _txt.x - = 4 om (_txt.x < -200) _txt.x = 600; 

Efter att ha testat det, borde du ha sett något som detta (med stjärnorna och texten som rör sig runt på skärmen förstås).


Steg 4: Skapa MotionTrail-klassen

Nu är det dags att göra vårt MotionTrail Klass. Vad den här klassen ska göra är att ta en Display som dras till sin egen display (a Sprite) och använda ett par filter, blekade och suddiga.

Så gör din nya MotionTrail.as Klass och låt den förlänga Sprite Klass.

För lite förinstallation för de steg som kommer kommer vi att skapa några variabler, först den _visa för att lagra en referens från huvudskärmen, a BitmapData att rita till, a Rektangel scenens storlek och a Punkt i det övre vänstra hörnet för filtren. Upplagt är en Array för Colormatrixfilter.

 paketet rtmTrail importera flash.display.Bitmap; importera flash.display.BitmapData; importera flash.display.DisplayObject; importera flash.display.Sprite; importera flash.geom.Point; importera flash.geom.Rectangle; public class MotionTrail utökar Sprite public function MotionTrail (display: DisplayObject) // Referens till displayen som används för rörelsespåret _display = display; // Gör ett BitmapData-objekt att dra till // Om du vill använda det här för ditt eget projekt och dimensionerna inte är 600x400 // så måste du ändra det här och rektangeln nedan _bitmapData = ny BitmapData (600, 400 , sant, 0x000000); // Några saker som filtren behöver inmatas för att den ska fungera _rect = ny rektangel (0, 0, 600, 400); _pnt = ny punkt (0, 0); _cMatrix = new Array (); // Lägg till lite genomskinlighet så att den inte tar uppmärksamhet från huvudskärmen alpha = 0.6; addChild (new Bitmap (_bitmapData));  privat var _display: DisplayObject; privat var _bitmapData: BitmapData; privat var _rect: rektangel; privat var _pnt: Point; privat var _cMatrix: Array; 

Sedan vi gjort denna klass måste vi gå tillbaka riktigt snabbt till _mtDisplay variabel och ändra den från Sprite Klass till MotionTrail Klass, tillsammans med inmatning av _mainDisplay variabel.

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

Steg 5: ColorMatrixFilter Array

Att skapa vår Matris för Colormatrixfilter, Grundsidan är att tona bort färgerna så att vi sakta sänker alla värden tillbaka till noll. Lägg till det här i konstruktör.

 // Skapa matris för 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

Detta kommer att multiplicera varje värde av varje pixel med 0,92 och som det gör varje ram blir den mindre och mindre tills den i grunden når sin gräns vid 0. Så ju närmare värdena är 1,0 desto längre tar det att nå noll vilket betyder en längre spår (och vice versa: ju närmare 0,0 desto kortare spåret).


Steg 6: ColorMatrixFilter och BlurFilter

Nu skapar vi Colormatrixfilter och den BlurFilter.

De Colormatrixfilter kommer att använda Array Vi har just gjort och vi ska skapa två BlurFilters. Jag hittade att använda två BlurFilters ger en bra puls effekt och det suddas inte för långsamt eller för fort, men om du hellre har en som också är bra.

Lägg till variablerna för filtren först.

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

Skapa filerna i konstruktören

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

Steg 7: Uppdatering av MotionTrails

Nu är det dags att skapa en funktion för att uppdatera våra Motion Trails. Gör en funktion som heter uppdatering i MotionTrail Klass. För att göra spåret måste vi dra huvudskärmen till BitmapData varje ram som gör spårets effekt.

 public function update (): void // Draw Visa på BitmapData _bitmapData.draw (_display); 

Du borde nu få ett spår om du kör det, men naturligtvis blir Motion Trails borta och vi kommer att göra det bleknar med filtren vi gjorde i det sista steget.


Steg 8: Använda filter

Nu kan vi använda filtren till BitmapData. Vi använder samma BitmapData för källan, den _rect och _pnt variabler för sourceRect och destPoint respektive, och sist är det filter vi vill tillämpa.

Eftersom vi har några filter vill vi inte tillämpa dem alla ramar eftersom det skulle sakta ner sakerna för mycket. I stället ska vi byta Colormatrixfilter och BlurFilter att arbeta i olika ramar och byta BlurFilters på samma sätt.

För att byta dem ska vi ha en variabel för att hålla reda på ramen och använda moduloperatören att kontrollera.

 privat var _count: Number = 0;
 public function update (): void // Draw Visa på BitmapData _bitmapData.draw (_display); // Applicera effekter till BitmapData om (_count% 2 == 0) _bitmapData.applyFilter (_bitmapData, _rect, _pnt, _cFilter); annars om (_count% 4 == 1) _bitmapData.applyFilter (_bitmapData, _rect, _pnt, _bFilter); annars _bitmapData.applyFilter (_bitmapData, _rect, _pnt, _bFilter2); // Öka räkning _count ++; 

Nu när uppdatering funktionen är klar vi lägger till den i vår slinga fungera.

 // Uppdatera Motion Blur _mtDisplay.update ();

Slutsats Testning och förlängning

Grymt bra! Vi är färdiga med den här snabba tipsen och du kan fortsätta och testa den.

Du borde ha fått samma resultat som provet swf och nu kan du försöka utöka det. Det finns många olika effekter du kan göra, mest om du förstår ColorMatrixFilter.

Till exempel kan du blekna färgen på spåret till rött genom att göra så här:

 // Offset Red Value med 30 varje gång _cMatrix = _cMatrix.concat ([0.92, 0, 0, 0, 30]) // Red _cMatrix = _cMatrix.concat ([0, 0.92, 0, 0, 0]) // Grön _cMatrix = _cMatrix.concat ([0, 0, 0,92, 0, 0]) // Blå _cMatrix = _cMatrix.concat ([0, 0, 0, 0.92, 0]) // Alpha

Eller du kan också byta färger som gör alla spår blå:

 // Endast blåa spår _cMatrix = _cMatrix.concat ([0, 0, 0, 0, 0]) // Red _cMatrix = _cMatrix.concat ([0, 0, 0, 0, 0]) // Green _cMatrix = _cMatrix .concat ([0.92, 0.92, 0.92, 0, 0]) // Blue _cMatrix = _cMatrix.concat ([0, 0, 0, 0.92, 0]) // Alpha

Tack för att du läser. Jag hoppas att alla lärde dig något av det här och det kommer att bli användbart i framtiden, kanske ett coolt nytt spel med denna effekt.