Blitting con AS3 rimozione del colore di sfondo di una bitmap

Oggi imparerai come rimuovere il colore di sfondo da un foglio sprite usando AS3 e mischia il risultato a una tela bitmap. Continuate a leggere per saperne di più!


Anteprima del risultato finale

Diamo un'occhiata al risultato finale su cui lavoreremo:


Passaggio 1: disegnare il foglio di sprite

Quindi, è tempo di disegnare il tuo sprite. Apri il tuo programma 'pixel-art' preferito e crea un'immagine di 128x128 e dai un colore di sfondo di '# e731f2', che è un bel colore viola!

Questa è la mia fantastica opera d'arte:

Salva la tua immagine da qualche parte organizzata e continuiamo!


Passaggio 2: importazione del foglio degli sprite

Ora, lo chiamo uno sprite foglio anche se è solo un'immagine. Un "foglio di sprite" di solito è composto da più di uno sprite ma possiamo immaginare di avere di più, giusto?

Ad ogni modo, se utilizzi Flash CS4 o versioni successive, importa semplicemente l'immagine tramite File | Importa | Importa nella libreria:

Se si utilizza un altro IDE AS3, ho incluso il file SWC, quindi è consigliabile saltare questo passaggio. Se desideri incorporare le tue immagini, sono certo che il tuo IDE di scelta avrà questa funzione.


Passaggio 3: esportazione del foglio degli sprite

Ora abbiamo il nostro foglio sprite nella Libreria; dovremmo davvero farlo diventare un Classe.

Fare clic con il tasto destro del mouse sull'immagine nella libreria e selezionare "Proprietà". Assegna all'immagine le seguenti proprietà:

Hit OK. Se ricevi un avvertimento, ignoralo; non importa qui.


Passaggio 4: creazione della classe di documenti

Se non hai familiarità con il concetto di una classe di documenti, consulta questo suggerimento rapido prima di leggere ulteriormente.

Crea una nuova "Classe ActionScript 3.0" e assegnagli il nome "Principale". Quando il file è stato creato, salvalo come "Main.as".

Questo codice dovrebbe essere inserito nella nostra nuova classe:

 package import flash.display.MovieClip; public class Main estende MovieClip public function Main () // constructor code

Non abbiamo ancora finito, comunque! Se si utilizza l'IDE Flash, accedere al "Pannello Proprietà" e impostare "Classe documento" su "Principale". Se ti stai chiedendo cosa faccia, significa che quando la tua applicazione / gioco viene eseguita da Flash Player, Main.as sarà la classe che è collegata al SWF stesso. Splendido, no?

Esegui il programma; se non ottieni errori, dovresti essere pronto!


Passaggio 5: creazione della tela

Prima di fare qualsiasi blitter, per prima cosa dovremo creare una tela su cui saltare. Se non sei sicuro del termine Blitting o vorresti saperne di più, ti preghiamo di dare un'occhiata a questo tutorial.

Ora dichiareremo una nuova variabile Bitmap, a cui blitereremo (copia) l'immagine.

 tela var privata: Bitmap;

Dopo averlo fatto, aggiungeremo un funzione chiamato Inizializzare() che ci permetterà di sistemare tutto in ordine:

 funzione pubblica Main () Initialize (); 

Cerchiamo di creare la funzione ora:

 funzione privata Initialize (): void canvas = new Bitmap (new BitmapData (550, 400, false, 0x000000)); // Imposta la tela sul nero. stage.addChild (tela); // Aggiunge la tela allo stage. 

Tuttavia, non siamo ancora finiti, poiché dobbiamo ancora aggiungere il importazioni:

 import flash.display.MovieClip; import flash.display.Bitmap; import flash.display.BitmapData;

Esegui il programma; se ha uno sfondo nero, ha funzionato!


Passaggio 6: inizializzazione di SpriteSheet

Innanzitutto, dovremo creare una nuova variabile di tipo SpriteSheet - che era la classe per l'immagine che abbiamo importato prima, ricorda?

 tela var privata: Bitmap; private var spriteSheet: SpriteSheet;

Quindi inizializzeremo:

 funzione privata Initialize (): void canvas = new Bitmap (new BitmapData (550, 400, false, 0x000000)); // Imposta la tela sul nero. spriteSheet = new SpriteSheet (); // Imposta spriteSheet per contenere un'istanza dell'immagine che abbiamo creato. stage.addChild (tela); // Aggiunge la tela allo stage. 

Esegui il programma e non dovresti vedere nulla; sistemiamolo subito!


Passaggio 7: aggiornamento del programma

Ora dobbiamo aggiungere un ENTER_FRAME evento. Ciò consentirà al programma di aggiornare 24 volte al secondo (24 FPS) nel nostro caso.

Nel Principale() funzione, aggiungi la seguente riga:

 funzione pubblica Main () Initialize (); stage.addEventListener (Event.ENTER_FRAME, Update); 

Ora dobbiamo fare il Aggiornare() funzione. Aggiungi questa funzione dopo le altre funzioni:

 Aggiornamento della funzione privata (e: Event): void 

Non dimenticare il importazioni:

 import flash.display.MovieClip; import flash.display.Bitmap; import flash.display.BitmapData; import flash.events.Event;

Ora siamo pronti a fare un po 'di bliter!


Step 8: Blitting

Ecco la parte interessante!

Bene, quindi quello che vogliamo fare è:

  • Cancella la tela.
  • Bloccare l'immagine e rimuovere il colore di sfondo.

Nella funzione di aggiornamento, digitare il seguente codice:

 funzione privata Update (e: Event): void canvas.bitmapData.lock (); canvas.bitmapData.fillRect (new Rectangle (0,0, stage.width, stage.height), 0x000000); canvas.bitmapData.copyPixels (spriteSheet, new Rectangle (0,0,128,128), new Point (100, 100)); canvas.bitmapData.unlock (); 

Se lo fai, otterrai la tua immagine sulla tela! Tuttavia, questo non è solo ciò a cui miriamo in quanto desideriamo rimuovere quel colore di sfondo dall'immagine.

Spiegherò prima parte del codice sopra:

  • canvas.bitmapData.lock (); - Questa linea ottimizza il blitting ed è una buona abitudine scrivergli la maggior parte del tempo!
  • canvas.bitmapData.fillRect (); - Questa linea cancella la tela riempiendola con un colore nero.
  • canvas.bitmapData.copyPixels (); - Non molto utile nella nostra situazione ma copia tutti i pixel da una parte di un'immagine.
  • canvas.bitmapData.unlock (); - Funziona con serratura() per ottimizzare il processo.

Ora dovresti avere questo sullo schermo ...

Sì, lo so, probabilmente hai ragione. Penso che dovremmo sbarazzarci anche del viola ...


Passaggio 9: rimozione del colore

Infine, è ora di rimuovere il colore viola!

Quello che vogliamo fare è controllare ogni pixel; se il pixel è viola, non lo copiamo semplicemente sulla tela. Per fare questo, faremo la nostra funzione.

Modificare Aggiornare() al seguente:

 funzione privata Update (e: Event): void canvas.bitmapData.lock (); canvas.bitmapData.fillRect (new Rectangle (0,0, stage.width, stage.height), 0x000000); CustomBlitting (spriteSheet, new Rectangle (0,0,128,128), new Point (100, 100), 0xE730F2); canvas.bitmapData.unlock (); 

La nostra nuova funzione (CustomBlitting (), che non abbiamo ancora scritto) prende la maggior parte dei parametri che fa copyPixels, insieme ad uno extra: il colore che vogliamo rimuovere.

È ora di scrivere la funzione. Questo codice potrebbe sembrare complicato se non ne hai mai fatto uno ciclo annidato prima. Il modo in cui questo ciclo funziona è fondamentalmente:

  • Per ogni fila abbiamo ...
  • Controlla ogni pixel in quella riga ...
  • Passa alla riga successiva in basso ...
 funzione privata CustomBlitting (src: BitmapData, srcRect: Rectangle, destPoint: Point, color: uint): void for (var i: int = 0; i < srcRect.height; i++ )  for( var j:int = 0; j < srcRect.width; j++ )  var currentPixel:uint = src.getPixel( srcRect.x + j, srcRect.y + i ); if( currentPixel != color )  canvas.bitmapData.setPixel( destPoint.x + j, destPoint.y + i, currentPixel );    

Lasciatemi spiegare getPixel e setPixel, anche se probabilmente dovrebbero essere auto-esplicativi:

  • getPixel (x, y); - Ciò restituisce il colore di un pixel nella posizione X, Y..
  • setPixel (x, y, color); - Questo imposta il colore di un pixel in colore nella posizione X, Y della tela.

Ora se esegui il programma, funziona!

Step 10: Sfide

Ho solo una sfida da fare per questo tutorial:

Accetta una matrice di colori come parametro e rimuovi tutti i colori dall'immagine che si trovano nella matrice.

In bocca al lupo!

Conclusione

Spero ti sia piaciuto questo tutorial e ho imparato qualcosa di nuovo oggi. Se desideri mostrarmi il tuo SWF con le sfide completate, lascia un commento qui sotto!