Crea un sorprendente gioco Breakout in Flash

In questo tutorial Premium, costruiremo un gioco Breakout; "Brick Breaker" da zero utilizzando Flash e AS3.


Passaggio 1: breve panoramica

Usando gli strumenti di disegno di Flash creeremo un'interfaccia grafica di bell'aspetto che sarà alimentata da diverse classi ActionScript 3.

L'utente sarà in grado di giocare attraverso una serie di livelli, puoi facilmente aggiungere tutti i livelli che vuoi!


Passaggio 2: Impostazioni documento Flash

Apri Flash e crea un documento di 320 pixel di larghezza e 480 pixel di altezza. Imposta la frequenza dei fotogrammi su 24 fps.



Passaggio 3: interfaccia


Verrà visualizzata un'interfaccia colorata e di bell'aspetto. Conterrà più forme, pulsanti, bitmap e altro ancora.

Passiamo direttamente alla creazione di questa GUI.


Passaggio 4: Schermata principale


Questa è la schermata principale o la vista, sarà la prima immagine che apparirà nel nostro gioco.


Passaggio 5: sfondo

Crea un rettangolo 320x480 e riempilo con questo gradiente radiale: # 3A9826, # 102A07.


Daremo un po 'più di dettaglio aggiungendo un filtro di Photoshop, se non hai Photoshop puoi provare ad aggiungere un bell'effetto usando gli strumenti di Flash.

Apri l'immagine in Photoshop e vai a Filtri> Texture> Patchwork, utilizzare le seguenti impostazioni:


Finirai con qualcosa di simile a questo:


Questo sfondo sarà sul palco così come gli indicatori di paddle, palla e testo. Converti lo sfondo in a Un filmato e nominalo bg.


Passaggio 6: titolo

Seleziona lo Strumento Testo (T), seleziona un font adatto e scrivi il titolo del gioco. Ho usato questo formato: Akashi, 55pt, # FFCC33.


Seleziona il campo di testo e utilizza il pannello Filtri per aggiungere un'ombra esterna:


Duplica il testo (Cmd + D) e spostalo di 3px verso l'alto per dargli un po 'di rilievo.


Convertire la grafica in a Un filmato e nominalo schermata MENU, ricorda di segnare il Esporta per ActionScript scatola. È possibile eliminare questo dallo stage al termine, come verrà chiamato utilizzando AS3.


Passo 7: pagaia

Usa lo Strumento Rettangolo Primitivo (R) per creare un rettangolo tondo di 57x11,5 px, modifica il raggio dell'angolo a 10 e applica questo gradiente: # 4E4E4E, #BABABA, # B0B3BA.


Aggiungi alcune linee di dettaglio con lo strumento Rettangolo, usa il tuo stile personale!


Puoi anche aggiungere un po 'di colore alla tua racchetta, ecco il risultato finale della mia, il colore usato è: # CC0000.


Convertire la grafica in a Un filmato e nominalo pagaia.


Step 8: Ball

Per creare la palla, seleziona lo Strumento Ovale (O) e usalo per creare un cerchio 12x12px, #CCCCCC.


Duplica il cerchio (Cmd + D) cambiandone le dimensioni a 10x10px e riempilo con questo gradiente radiale: # 95D4FF, # 0099FF.


Infine, taglia il secondo cerchio a metà e usa lo strumento Selezione (V) per formare una curva nella parte inferiore. Cambia il suo colore con un gradiente lineare bianco con alfa 60, 10.


Convertire la grafica in a Un filmato e nominalo palla.


Passaggio 9: Brick

Il nostro mattone sarà molto semplice.

Utilizzare lo strumento Rettangolo per creare un rettangolo di 38 x 18 px e applicare il gradiente successivo: # CC0000, # 8E0000, # FF5656.


Converti il ​​rettangolo in un MovieClip e applica il filtro ombra utilizzato nel testo del titolo per dargli un aspetto più gradevole.

Converti nuovamente l'immagine in a Un filmato e nominalo mattone, ricorda di segnare il Esporta per ActionScript scatola.


Step 10: About Screen

La schermata Informazioni mostrerà i crediti, l'anno e il copyright del gioco.

Sarà piuttosto semplice da creare poiché abbiamo già tutti gli elementi in esso utilizzati.


Convertire la grafica in a Un filmato e nominalo AboutScreen, ricorda di segnare il Esporta per ActionScript scatola.


Passaggio 11: schermata di gioco

Questa è la schermata di gioco, sarà sul palco dall'inizio e conterrà gli indicatori di paddle, palla, sfondo e testo. (Aggiungeremo i mattoni usando il codice.)


I nomi delle istanze sono abbastanza semplici e auto esplicativi: pagaia, palla, bg, punteggioTF, viveTF e levelTF.


Passaggio 12: incorporare i caratteri

Per utilizzare dinamicamente il carattere personalizzato, è necessario incorporarlo nell'applicazione.

Seleziona un campo di testo dinamico e fai clic su Incorporare? pulsante nel Pannello Proprietà.


Seleziona / aggiungi tutti i caratteri necessari e clicca ok.


Passaggio 13: schermata di avviso

Questa schermata apparirà quando il gioco è stato deciso; o vinci, perdi o raggiungi la partita (vincendo tutti i livelli o perdendo tutte le vite).

In questa vista vengono utilizzati due campi di testo dinamici, che visualizzeranno lo stato attuale del gioco più un breve messaggio. I campi di testo sono nominati titleTF e msgTF.


Convertire la grafica in a Un filmato e segnare il Esporta per ActionScript box, imposta il nome della classe su AlertScreen.

Questo termina la parte grafica, quindi inizia l'ActionScript!


Passaggio 14: Tween Nano


Useremo un motore di interpolazione diverso dal predefinito incluso nel flash, questo aumenterà le prestazioni e sarà più facile da usare.

È possibile scaricare Tween Nano dal suo sito Web ufficiale.


Passaggio 15: nuova classe ActionScript

Creare una nuova classe ActionScript 3.0 (Cmd + N) e salvarla come Main.as nella tua cartella di classe.



Passo 16: Struttura della classe

Crea la tua struttura di base per iniziare a scrivere il tuo codice.

 pacchetto import flash.display.Sprite; public class Main estende Sprite public function Main (): void // constructor code

Passaggio 17: Classi richieste

Queste sono le classi che dovremo importare affinché la nostra classe funzioni, il importare direttiva rende disponibili classi e pacchetti definiti esternamente al codice.

 import flash.display.Sprite; import flash.ui.Mouse; import flash.events.MouseEvent; import flash.events.KeyboardEvent; import flash.events.Event; import com.greensock.TweenNano; import com.greensock.easing.Circ;

Passaggio 18: variabili e costanti

Queste sono le variabili e le costanti che useremo, leggere i commenti nel codice per scoprire di più su di loro.

 const privato BRICK_W: int = 39; // brick's width const privato BRICK_H: int = 19; // brick's height const privato OFFSET: int = 6; // Un offset usato per centrare i mattoni private const W_LEN: int = 8; // la lunghezza dei livelli, solo 8 mattoni orizzontali dovrebbero essere creati sul palco privato const SCORE_CONST: int = 100; // l'ammontare da aggiungere al punteggio quando viene colpito un mattoncino privato: Vector. = nuovo vettore.(); // memorizza tutti i mattoni private var xSpeed: int = 5; private var ySpeed: int = -5; private var xDir: int = 1; // x direction private var yDir: int = 1; private var gameEvent: String = "; // memorizza eventi come win, lose, gameover private var currentLevel: int = 0; private var menuScreen: MenuScreen; // un'istanza della schermata del menu private var aboutScreen: AboutScreen; private var alertScreen: AlertScreen; private var lives: int = 3; private var levels: Array = []; // memorizza i livelli

Step 19: Livelli

Tutti i nostri livelli saranno archiviati in array multidimensionali.

Questi sono array contenenti array; puoi scriverli in una sola riga, ma se li alline puoi effettivamente vedere il modulo che il livello prenderà.

 const privato LEVEL_1: Array = [[0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0], [0,0,0, 1,1,0,0,0], [0,0,0,1,1,0,0,0], [0,1,1,1,1,1,1,0], [0, 1,1,1,1,1,1,0], [0,0,0,1,1,0,0,0], [0,0,0,1,1,0,0,0] [0,0,0,0,0,0,0,0]]; // questo forma un segno +! const privato LEVEL_2: Array = [[0,0,0,0,0,0,0,0], [0,0,0,1,1,0,0,0], [0,0,1, 0,0,1,0,0], [0,0,0,0,0,1,0,0], [0,0,0,0,1,0,0,0], [0, 0,0,1,0,0,0,0], [0,0,1,0,0,0,0,0], [0,0,1,1,1,1,0,0] ,]; // questo costituisce un numero 2!

In questi livelli il 1s rappresentano lo spazio nel palcoscenico in cui verrà posizionato un mattone, e il 0s sono solo uno spazio vuoto. Questi livelli verranno in seguito letti da una funzione che posizionerà i mattoni sul palco. Puoi aggiungere tutti i livelli che vuoi usando questa classe!


Passaggio 20: codice costruttore

Il costruttore è una funzione che viene eseguita quando un oggetto viene creato da una classe; questo codice è il primo ad essere eseguito quando si crea un'istanza di un oggetto (o si esegue quando il gioco viene caricato, nel caso di una classe di documento).

Chiama le funzioni necessarie per iniziare il gioco. Dai un'occhiata a queste funzioni nei seguenti passaggi.

 funzione pubblica finale Main (): void / * Aggiungi livelli * / levels.push (LEVEL_1, LEVEL_2); // aggiungiamo i livelli all'array per sapere quanti sono / * Schermata del menu, Pulsanti Listener * / menuScreen = new MenuScreen (); addChild (schermata MENU); menuScreen.startB.addEventListener (MouseEvent.MOUSE_UP, tweenMS); menuScreen.aboutB.addEventListener (MouseEvent.MOUSE_UP, tweenMS); 

Passo 21: Schermata del menu e About Visualizza animazione

Le righe successive gestiscono i pulsanti della schermata Menu e interpolano la visualizzazione Menu o About a seconda del pulsante premuto.

 private final function tweenMS (e: MouseEvent): void if (e.target.name == 'startB') // se si fa clic sul pulsante di avvio TweenNano.to (menuScreen, 0.3, y: -menuScreen.height, facilità : Circ, onComplete: init); // schermata menu tween else // se si fa clic sul pulsante aboutScreen = new AboutScreen (); // aggiungi sullo schermo addChild (aboutScreen); TweenNano.from (aboutScreen, 0.3, x: stage.stageWidth, ease: Circ); // Interpolazione sullo schermo aboutScreen.addEventListener (MouseEvent.MOUSE_UP, hideAbout); // aggiungi un listener del mouse per rimuoverlo / * Rimuove About view * / private final function hideAbout (e: MouseEvent): void TweenNano.to (aboutScreen, 0.3, x: stage.stageWidth, facilità: Circ, onComplete : function rmv (): void aboutScreen.removeEventListener (MouseEvent.MOUSE_UP, hideAbout); removeChild (aboutScreen);); 

Passaggio 22: Funzione Init

Questa funzione esegue le operazioni necessarie per iniziare il gioco, leggere i commenti nel codice per saperne di più.

 funzione finale privata init (): void / * Schermata del menu Destroy * / menuScreen.startB.removeEventListener (MouseEvent.MOUSE_UP, tweenMS); menuScreen.aboutB.removeEventListener (MouseEvent.MOUSE_UP, tweenMS); removeChild (schermata MENU); menuScreen = null; / * Hide Cursor * / Mouse.hide (); / * Build Level Bricks * / buildLevel (LEVEL_1); / * Start Listener * / bg.addEventListener (MouseEvent.MOUSE_UP, startGame); 

Passaggio 23: sposta la paletta

La Paddle sarà controllata dal mouse, seguirà la posizione del mouse x .

 funzione finale privata movePaddle (e: MouseEvent): void / * Segui Mouse * / paddle.x = mouseX; 

Passo 24: Collisione di bordo di paddle

Per impedire che la paletta lasci il palco, creiamo confini invisibili ai lati dello schermo.

 / * Segui Mouse * / paddle.x = mouseX; / * Bordi * / if ((paddle.x - paddle.width / 2) < 0)  paddle.x = paddle.width / 2;  else if((paddle.x + paddle.width / 2) > stage.stageWidth) paddle.x = stage.stageWidth - paddle.width / 2; 

Passaggio 25: Funzione di livello di costruzione

I livelli saranno creati da questa funzione.

Usa un parametro per ottenere il livello da costruire, calcola le sue dimensioni ed esegue un ciclo forato annidato, con un ciclo per l'altezza e uno per la larghezza. Successivamente, crea una nuova istanza Brick che viene posizionata in base alla larghezza, all'altezza e al numero corrispondente a io e j.

Infine, il mattone viene aggiunto al mattoni vettore per accedervi al di fuori di questa funzione.

 private final function buildLevel (level: Array): void / * Lunghezza del livello, altezza * / var len: int = level.length; per (var i: int = 0; i < len; i++)  for(var j:int = 0; j < W_LEN; j++)  if(level[i][j] == 1)  var brick:Brick = new Brick(); brick.x = OFFSET + (BRICK_W * j); brick.y = BRICK_H * i; addChild(brick); bricks.push(brick);    

Passaggio 26: Ascoltatori di giochi

Questa funzione aggiunge o rimuove il mouse e inserisce i listener del frame. Usa un parametro per determinare se gli ascoltatori dovrebbero essere aggiunti o rimossi: l'impostazione predefinita è Inserisci.

 private final function gameListeners (action: String = 'add'): void if (action == 'add') stage.addEventListener (MouseEvent.MOUSE_MOVE, movePaddle); stage.addEventListener (Event.ENTER_FRAME, update);  else stage.removeEventListener (MouseEvent.MOUSE_MOVE, movePaddle); stage.removeEventListener (Event.ENTER_FRAME, update); 

Passaggio 27: Avvia la funzione di gioco

Il prossimo codice chiama il gameListeners () funzione per iniziare il gioco.

 private final function startGame (e: KeyboardEvent): void bg.removeEventListener (MouseEvent.MOUSE_UP, startGame); gameListeners (); 

Step 28: Movimento della palla

La velocità della palla è determinata dal xSpeed e yspeed variabili, quando il aggiornare la funzione viene eseguita, la palla inizia a muoversi usando questi valori ogni fotogramma.

 aggiornamento della funzione finale privata (e: Event): void / * Ball Movement * / ball.x + = xSpeed; ball.y + = ySpeed;

Passaggio 29: Collisione di muri

Questo codice controlla le collisioni tra la palla e le pareti.

 / * Collisione muro * / se (palla.x. < 0)ball.x = ball.x + 3;xSpeed = -xSpeed;;//Left if((ball.x + ball.width) > stage.stageWidth) ball.x = ball.x - 3; xSpeed ​​= -xSpeed;; // Giusto se (ball.y < 0)ySpeed = -ySpeed;;//Up

Passaggio 30: Perdere Evento di gioco

Un'istruzione if viene usata per verificare quando la pagaia manca alla palla. Se è così, il giocatore perde una vita.

 if (ball.y + ball.height> paddle.y + paddle.height) alert ('You Lose', 'Play Again?'); gameEvent = 'lose'; lives -; livesTF.text = String (lives );; // giù / perdere

Passo 31: Collisioni con la paletta

Quando la palla colpisce la paletta, la velocità è impostata su negativa per far alzare la palla. Controlliamo anche in quale lato della paletta la palla ha colpito per scegliere il lato dove si muoverà in seguito.

 / * Collisione della paletta, controlla il lato della paletta che colpisce la palla * / se (paddle.hitTestObject (palla) && (ball.x + ball.width / 2) < paddle.x)  ySpeed = -5; xSpeed = -5; //left  else if(paddle.hitTestObject(ball) && (ball.x + ball.width / 2) >= paddle.x) ySpeed ​​= -5; xSpeed ​​= 5; //destra 

Passo 32: Collisioni di mattoni

Noi usiamo a per e hitTest per verificare le collisioni dei mattoni, quando la palla colpisce un mattone, viene utilizzata la stessa tecnica utilizzata nella pagaia per determinare il lato che seguirà la palla.

 / * Collisione di mattoni * / per (var i: int = 0; i < bricks.length; i++)  if(ball.hitTestObject(bricks[i]))  /* Check the which side of the brick the ball hits, left, right */ if((ball.x + ball.width / 2) < (bricks[i].x + bricks[i].width / 2))  xSpeed = -5;  else if((ball.x + ball.width / 2) >= (mattoni [i] .x + mattoni [i] .width / 2)) xSpeed ​​= 5; 

Passo 33: Cambia direzione delle sfere e Rimuovi mattone

Il seguente codice modifica la direzione Y della pallina e rimuove il mattone dallo stage e dal vettore.

 / * Cambia la direzione y della pallina * / ySpeed ​​= -ySpeed; removeChild (mattoni [i]); bricks.splice (i, 1);

Se vuoi, puoi cambiare questa logica in modo che la velocità y della palla sia invertita solo se colpisce la parte superiore o inferiore di un mattone e non quando colpisce i lati. Provalo e guarda cosa ne pensi.


Passaggio 34: aggiungi punteggio e controlla Win

Ogni colpo di mattone aggiungerà 100 al punteggio, il punteggio sarà preso dalla costante del punteggio e aggiunto al punteggio corrente usando int e Stringa funzioni. Questo codice controlla anche se non ci sono più mattoni nel vettore e visualizza un avviso se è così.

 / * Punteggio ++ * / scoreTF.text = String (int (scoreTF.text) + SCORE_CONST);  / * Controlla se tutti i mattoni sono distrutti * / if (bricks.length < 1)  alert('You Win!', 'Next Level ?'); gameEvent = 'win';  

Passaggio 35: schermata di avviso

La schermata di avviso mostra le informazioni del giocatore sullo stato del gioco, viene mostrato quando viene raggiunto un evento di gioco, come perdere una vita o completare un livello.

In questa funzione vengono utilizzati due parametri:

  • t: Il titolo dell'avviso
  • m: Un breve messaggio
 avviso di funzione finale privata (t: String, m: String): void gameListeners ('remove'); Mouse.show (); alertScreen = new AlertScreen (); addChild (alertScreen); TweenNano.from (alertScreen.box, 0.3, scaleX: 0.5, scaleY: 0.5, facilità: Circ); alertScreen.box.titleTF.text = t; alertScreen.box.msgTF.text = m; alertScreen.box.boxB.addEventListener (MouseEvent.MOUSE_UP, restart); 

Passaggio 36: riavvia la funzione

La funzione successiva controlla lo stato del gioco (vinci, perdi, finito) ed esegue un'azione in base ad esso.

 riavvio privato della funzione finale (e: MouseEvent): void if (gameEvent == 'win' && levels.length> currentLevel + 1) // se il livello è chiaro ma rimangono più livelli currentLevel ++; changeLevel (levels [currentLevel]); // next level levelTF.text = 'Level' + String (currentLevel + 1);  else if (gameEvent == 'win' && levels.length <= currentLevel+1) //if level is clear and no more levels are available  alertScreen.box.boxB.removeEventListener(MouseEvent.MOUSE_UP, restart); removeChild(alertScreen); alertScreen = null; alert('Game Over', 'Congratulations!'); gameEvent = 'finished';  else if(gameEvent == 'lose' && lives > 0) // se il livello è fallito ma vive> 0 changeLevel (levels [currentLevel]); // stesso livello else if (gameEvent == 'lose' && lives <= 0) //if level failed and no more lives left  alertScreen.box.boxB.removeEventListener(MouseEvent.MOUSE_UP, restart); removeChild(alertScreen); alertScreen = null; alert('Game Over', 'Try Again!'); gameEvent = 'finished';  else if(gameEvent == 'finished') //reached when no more lives or levels are available  /* Add menu screen */ menuScreen = new MenuScreen(); addChild(menuScreen); menuScreen.startB.addEventListener(MouseEvent.MOUSE_UP, tweenMS); menuScreen.aboutB.addEventListener(MouseEvent.MOUSE_UP, tweenMS); TweenNano.from(menuScreen, 0.3, y: -menuScreen.height, ease: Circ); /* Reset vars */ currentLevel = 0; lives = 3; livesTF.text = String(lives); scoreTF.text = '0'; levelTF.text = 'Level ' + String(currentLevel + 1); xSpeed = 5; ySpeed = -5; clearLevel();  

Passaggio 38: Cambia livello

Questa funzione cambia al livello scritto nel parametro.

 private final function changeLevel (level: Array): void / * Clear * / clearLevel (); / * Ridisegna i mattoni * / buildLevel (livello); / * Start * / Mouse.hide (); bg.addEventListener (MouseEvent.MOUSE_UP, startGame); 

Passo 39: Clear Level

Una funzione per cancellare i mattoni rimanenti e gli avvisi dal palco. Inoltre, ripristina la posizione della paletta e della palla.

 private final function clearLevel (): void / * Remove Alert Screen * / alertScreen.box.boxB.removeEventListener (MouseEvent.MOUSE_UP, restart); removeChild (alertScreen); alertScreen = null; / * Clear Level Bricks * / var bricksLen: int = bricks.length; per (var i: int = 0; i < bricksLen; i++)  removeChild(bricks[i]);  bricks.length = 0; /* Reset Ball and Paddle position */ ball.x = (stage.stageWidth / 2) - (ball.width / 2); ball.y = (paddle.y - paddle.height) - (ball.height / 2) -2; paddle.x = stage.stageWidth / 2; 

Passaggio 40: imposta la classe principale


Faremo uso della Document Class in questo tutorial, se non sai come usarlo o sei un po 'confuso per favore leggi questo QuickTip.


Conclusione

Il risultato finale è un gioco personalizzabile e divertente, prova ad aggiungere grafica e livelli personalizzati!

Spero che questo tutorial di Active Premium ti sia piaciuto, grazie per la lettura!