Suggerimento rapido accelerare i percorsi di movimento in tempo reale

In questo suggerimento rapido useremo il ColorMatrixFilter e BlurFilter per creare un effetto Motion Trail.

Abbiamo trovato questo fantastico autore grazie a FlashGameLicense.com, il posto dove comprare e vendere giochi Flash.


Anteprima del risultato finale

Diamo un'occhiata al risultato finale su cui lavoreremo:


Passaggio 1: crea un progetto e impostalo

Crea un nuovo progetto in FlashDevelop (o qualsiasi editor che usi), imposta le dimensioni di swf su 600x400 e lo sfondo su nero (# 000000).

Quindi, per impostare la scena ne avremo due sprites, uno è per il display principale a cui aggiungeremo tutti gli oggetti di visualizzazione e l'altro è per l'effetto Motion Trail che utilizza il display principale come riferimento.

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

E aggiungi il sprites al Palcoscenico.

 // // Imposta display // Dobbiamo aggiungere i nostri due display allo stage addChild (_mtDisplay); addChild (_mainDisplay);

Ora stiamo per incorporare la nostra immagine stellare per l'uso, o se vuoi usare la tua immagine.

 [Incorpora (source = '... / ... /images/star.png')] var star: Class;

L'ultima cosa che vogliamo fare per l'installazione è creare a ciclo continuo funzione. Questo verrà aggiornato ogni frame, per cose come il posizionamento e l'aggiornamento del Motion Trail. Quindi crea un'altra funzione e un listener di eventi per chiamarla ogni frame.

Il tuo Main.as la classe dovrebbe assomigliare a questo.

 package rtmTrail import flash.display.Sprite; import flash.events.Event; public class Main extends Sprite public function Main (): void if (stage) init (); else addEventListener (Event.ADDED_TO_STAGE, init);  funzione privata init (e: Event = null): void removeEventListener (Event.ADDED_TO_STAGE, init); // // Carica immagini [Incorpora (source = '... / ... /images/star.png')] var star: Class; // // Imposta display // Dobbiamo aggiungere i nostri due display allo stage addChild (_mtDisplay); addChild (_mainDisplay); // Aggiungi un nuovo Listener di eventi per la nostra funzione di loop ogni volta che inseriamo // il frame per spostare gli sprite e aggiornare il nostro effetto MotionTrail addEventListener (Event.ENTER_FRAME, loop);  private function loop (e: Event): void  private var _mainDisplay: Sprite = new Sprite (); private var _mtDisplay: Sprite = new Sprite (); 

Passaggio 2: Sprites & TextField

Per testare il Motion Trail ne creeremo dieci sprites dall'immagine della stella e posizionali in luoghi casuali. Inoltre stiamo andando a creare un Punto questo ci dice la velocità e la direzione in cui si muoveranno. La prima cosa da fare è crearne due Array per memorizzare queste informazioni; uno è per il folletto e l'altro è per il Punto.

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

Aggiungi questo al dentro funzione per creare e posizionare in modo casuale dieci stelle.

 // Disegna alcune stelle var spr: Sprite; var bmp: Bitmap; per (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); 

Ora per creare il Campo di testo Aggiungi questo.

 // Aggiungi un campo di testo troppo _txt.defaultTextFormat = new TextFormat ("arial", 18, 0xFF00FF); _txt.text = "Real Time Motion Trail" _txt.x = 20; _txt.y = 10; _txt.width = 200; _mainDisplay.addChild (_txt);

Step 3: controllo Sprite Movement

Ora dobbiamo trasferirci nel nostro ciclo continuo funzione per folletto controllo del movimento. Abbastanza semplice, usa a per loop per passare attraverso ciascuno folletto abbiamo e se colpisce il bordo inversa la xey del Punto quindi va nella direzione opposta. Dovremo anche spostare lo sprite nel loop per i valori nel file Punto e, per renderlo più interessante, ruotarlo lentamente.

 loop di funzioni private (e: Event): void // Aggiorna le forme di sprite per (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; se (_sprites [i] .y <= 0 || _sprites[i].y >= 400) _spritesDir [i] .y = -_spritesDir [i] .y; // Sposta la forma Sprite _sprites [i] .x + = _spritesDir [i] .x; _sprites [i] .y + = _spritesDir [i] .y; // Rotate Sprite Shape _sprites [i] .rotation + = 2; 

Per spostare il Campo di testo in alto a sinistra dobbiamo solo sottrarre dal X proprietà ogni fotogramma, e se esce dallo schermo riportarlo sul lato destro dello schermo.

 loop di funzioni private (e: Event): void // Aggiorna le forme di sprite per (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; se (_sprites [i] .y <= 0 || _sprites[i].y >= 400) _spritesDir [i] .y = -_spritesDir [i] .y; // Sposta la forma Sprite _sprites [i] .x + = _spritesDir [i] .x; _sprites [i] .y + = _spritesDir [i] .y; // Rotate Sprite Shape _sprites [i] .rotation + = 2;  // Sposta testo _txt.x - = 4 se (_txt.x < -200) _txt.x = 600; 

Dopo averlo testato, avresti dovuto vedere qualcosa di simile (con le stelle e il testo che si muovono sullo schermo, ovviamente).


Passaggio 4: creare la classe MotionTrail

Ora è il momento di fare il nostro MotionTrail Classe. Ciò che questa classe sta per fare è prendere un DisplayObject che è disegnato per il proprio display (a folletto) e usando un paio di filtri, sbiaditi e sfocati.

Quindi fai il tuo nuovo MotionTrail.as Classe e lascia che si estenda il folletto Classe.

Per un po 'di pre-setup per i passi in arrivo creeremo alcune variabili, prima le _display per memorizzare un riferimento del display principale, a BitmapData attirare a, a Rettangolo la dimensione del palco e a Punto nell'angolo in alto a sinistra per i filtri. L'ultimo è un schieramento per il ColorMatrixFilter.

 package rtmTrail import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.DisplayObject; import flash.display.Sprite; import flash.geom.Point; import flash.geom.Rectangle; public class MotionTrail estende Sprite public function MotionTrail (display: DisplayObject) // Riferimento al display utilizzato per il motion trail _display = display; // Crea un oggetto BitmapData da disegnare su // Se vuoi usare questo per il tuo progetto e le dimensioni non sono 600x400 //, dovresti cambiarlo qui e il rettangolo sotto _bitmapData = new BitmapData (600, 400 , vero, 0x000000); // Alcune cose per cui i filtri devono essere inseriti affinché funzioni _rect = new Rectangle (0, 0, 600, 400); _pnt = new Point (0, 0); _cMatrix = new Array (); // Aggiungi un po 'di trasparenza in modo da non distogliere l'attenzione dal Main Display alpha = 0.6; addChild (nuovo Bitmap (_bitmapData));  private var _display: DisplayObject; private var _bitmapData: BitmapData; private var _rect: Rectangle; private var _pnt: Point; private var _cMatrix: Array; 

Dato che abbiamo fatto questo corso, dobbiamo tornare molto velocemente al _mtDisplay variabile e cambiarlo dal folletto Classe al MotionTrail Classe, insieme con l'inserimento del _mainDisplay variabile.

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

Passaggio 5: matrice ColorMatrixFilter

Per creare il nostro Matrice per il ColorMatrixFilter, l'idea di base è di sfumare i colori in modo da ridurre lentamente tutti i valori a zero. Aggiungi questo al costruttore.

 // Crea Matrix per 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]) // Blue _cMatrix = _cMatrix.concat ([0, 0, 0, 0,92, 0]) // Alpha

Questo moltiplicherà ogni valore di ogni pixel per 0.92 e con ogni fotogramma diventerà sempre più piccolo fino a raggiungere il suo limite a 0. Quindi quanto più i valori sono vicini a 1,0 quanto più ci vuole per raggiungere lo zero, il che significa una traccia più lunga (e viceversa: più vicino a 0.0 più breve è il sentiero).


Passaggio 6: ColorMatrixFilter e BlurFilter

Ora creiamo il ColorMatrixFilter e il BlurFilter.

Il ColorMatrixFilter userà il schieramento abbiamo appena creato e ne creeremo due BlurFilters. L'ho trovato usando due BlurFilters dà un buon effetto a impulsi e non sfoca troppo lentamente o troppo velocemente, ma se preferisci avere uno che va bene anche tu.

Aggiungi prima le variabili per i filtri.

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

Crea i filtri nel costruttore

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

Passaggio 7: aggiornamento di MotionTrails

Ora è il momento di creare una funzione per aggiornare i nostri Motion Trails. Crea una funzione chiamata aggiornare nel MotionTrail Classe. Per fare il percorso dobbiamo disegnare il Main Display al BitmapData ogni frame che rende l'effetto trail.

 public function update (): void // Disegna visualizzazione su BitmapData _bitmapData.draw (_display); 

Ora dovresti avere una pista se la esegui, ma ovviamente i Motion Trails svaniscono e lo faremo svanire con i filtri che abbiamo fatto nell'ultimo passaggio.


Passaggio 8: applicazione dei filtri

Ora possiamo applicare i filtri al BitmapData. Usiamo lo stesso BitmapData per la fonte, il _rect e _pnt variabili per il sourceRect e destPoint rispettivamente, e l'ultimo è il filtro che vogliamo applicare.

Dato che abbiamo alcuni filtri, non vogliamo applicarli tutti i fotogrammi perché farlo rallenterebbe troppo. Invece, stiamo per cambiare il ColorMatrixFilter e BlurFilter lavorare in diversi frame e cambiare il BlurFilters allo stesso modo.

Per cambiarli, avremo una variabile per tenere traccia del frame e usare l'operatore del modulo per verificare.

 private var _count: Number = 0;
 public function update (): void // Disegna visualizzazione su BitmapData _bitmapData.draw (_display); // Applica effetti a BitmapData if (_count% 2 == 0) _bitmapData.applyFilter (_bitmapData, _rect, _pnt, _cFilter); else if (_count% 4 == 1) _bitmapData.applyFilter (_bitmapData, _rect, _pnt, _bFilter); else _bitmapData.applyFilter (_bitmapData, _rect, _pnt, _bFilter2); // Aumenta il conteggio _count ++; 

Ora che il aggiornare la funzione è finita la aggiungiamo alla nostra ciclo continuo funzione.

 // Aggiorna Motion Blur _mtDisplay.update ();

Conclusione Test ed estensione

Eccezionale! Abbiamo finito con questo suggerimento rapido e puoi procedere e provarlo.

Dovresti avere ottenuto lo stesso risultato del campione swf e ora puoi provare ad estenderlo. Ci sono molti effetti diversi che puoi fare, soprattutto se conosci il ColorMatrixFilter.

Ad esempio, puoi sfumare il colore della traccia in rosso in questo modo:

 // Offset Valore rosso di 30 ogni volta _cMatrix = _cMatrix.concat ([0.92, 0, 0, 0, 30]) // Red _cMatrix = _cMatrix.concat ([0, 0.92, 0, 0, 0]) // Green _cMatrix = _cMatrix.concat ([0, 0, 0,92, 0, 0]) // Blue _cMatrix = _cMatrix.concat ([0, 0, 0, 0,92, 0]) // Alpha

Oppure puoi anche cambiare i colori rendendo tutte le tracce blu:

 // Solo tracce blu _cMatrix = _cMatrix.concat ([0, 0, 0, 0, 0]) // Red _cMatrix = _cMatrix.concat ([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

Grazie per aver letto. Spero che tutti voi abbiate imparato qualcosa da questo e che si rivelerà utile in futuro, probabilmente un nuovo fantastico gioco che usa questo effetto.