Crea una classe di contatore del punteggio a rotazione di stile Pinball

Due volte al mese, rivisitiamo alcuni dei post preferiti dei nostri lettori da tutta la storia di Activetuts +. Questo tutorial è stato pubblicato per la prima volta nel febbraio 2010.

In questo tutorial creerai una classe Punteggio riutilizzabile che conta fino al nuovo totale quando i punti vengono aggiunti (invece di saltare al nuovo punteggio). Copriremo la creazione di grafica e il codice.


Anteprima del risultato finale

In alcuni giochi quando guadagni punti, vedrai immediatamente il tuo punteggio saltare al nuovo totale. Penso che sia molto più interessante se il punteggio conta uno alla volta, quindi il giocatore può "accumulare punti". Questo è quello che faremo qui.

Ecco un esempio della classe del punteggio in azione:

L'idea principale alla base di questo tutorial è di insegnarti come programmare la funzionalità di "conteggio in avanti", ma ti mostrerò anche come creare il fantastico display a LED visto nell'anteprima. Inizieremo progettando i numeri:


Passaggio 1: configura il tuo file Flash

Crea un nuovo file Flash (ActionScript 3.0). Le impostazioni del film variano a seconda del gioco. Per questa demo sto configurando il mio film come 500x300, sfondo nero e 30 fps.


Passaggio 2: crea il simbolo della cifra

Crea un nuovo simbolo di clip filmato (Inserisci> Nuovo simbolo). Dare a questo simbolo il nome "cifra".


Passaggio 3: creare il campo di testo della cifra

All'interno del clip filmato digitale utilizzare lo strumento Testo per aggiungere un numero 0 al simbolo. Sto usando un font chiamato Digital Readout, ma qualsiasi carattere di tipo LED dovrebbe funzionare.

Impostare la dimensione del testo su 40 pt e renderla di colore ambra / arancione chiaro (# F4C28B). Imposta il formato del paragrafo su centrato.


Passaggio 4: Aggiungi bagliori

Aggiungi due filtri luminosi separati al tuo campo di testo. Impostare il colore su rosso (# FF0000) per entrambi e impostare la forza di entrambi su 200%.

Seleziona la casella di controllo Bagliore interno per uno e imposta Sfocatura su 2 pixel. Lascia l'altro a 5px Blur.

Puoi usare un colore diverso se vuoi (blu o verde sembrerebbero entrambi belli). Il trucco per farlo sembrare realistico è rendere il colore del testo un po 'sbiadito e impostare i bagliori su un colore più saturo. Questo fa sembrare che emetta luce.


Passaggio 5: aggiungi altri numeri

Creare fotogrammi chiave sui fotogrammi 1-10 del filmato a cifre. Un modo semplice per farlo è selezionare i fotogrammi 1-10 (fare clic sulla cornice 1, quindi premere il tasto Maiusc e fare clic sulla cornice 10) e premere F6.

Ora dovresti avere 10 frame, ciascuno con un keyframe con il tuo campo di testo 0 luminoso. Passare attraverso ogni fotogramma e modificare i numeri in modo da avere le cifre 0-9. Il fotogramma 1 avrà "0", il fotogramma 2 avrà "1", il fotogramma 3 avrà "2", ecc.

Denominare questo livello "numeri".


Passaggio 6: aggiungere lo sfondo del LED

Ora aggiungeremo uno stato "off" per i numeri di LED, così sarete in grado di vedere i segmenti non illuminati del display a LED.

Copia le tue 8 cifre (nel frame 9). Crea un nuovo livello denominato "background". Con il nuovo livello selezionato usa Incolla in posizione (Modifica> Incolla in posizione) per incollare le 8 cifre nella posizione esatta come quella copiata.

Rimuovi i bagliori dalla nuova 8 cifre e cambia il suo colore in grigio scuro (# 333333). Aggiungi un filtro sfocatura con Sfocatura impostata su 3px. Sposta questo livello sotto il livello "numeri".

Ora puoi scorrere i fotogrammi e vedere come i segmenti non illuminati del LED mostrano dietro ogni numero.


Passaggio 7: aggiungere l'azione di arresto

Crea un altro nuovo livello chiamato "azioni". Aprire il pannello Azioni e aggiungere un'azione stop () sul fotogramma 1.

Ciò manterrà il display che mostra '0' finché non lo diciamo diversamente.


Passaggio 8: Perché i frame?

Perché stiamo inserendo manualmente ogni cifra sul proprio frame invece di utilizzare un campo di testo dinamico? Buona domanda.

La ragione principale è che così facendo diventa più flessibile l'aggiornamento della grafica in seguito. Se si desidera modificare il design e utilizzare bitmap per i numeri o avere ciascuna cifra visualizzata con un font o un colore diverso, è facile farlo.

Inoltre, se designer e sviluppatori lavorano insieme su un progetto, è meglio creare le cose in un modo che dia ai progettisti un facile accesso a tutta la parte grafica possibile.
Sento che questa configurazione fa più che usare il testo dinamico.


Passaggio 9: creare il clip filmato del punteggio

Crea un nuovo filmato chiamato "Punteggio". Seleziona "Esporta per ActionScript" e imposta anche il nome della classe su "Punteggio".

Trascina il clip filmato della cifra dalla Libreria nel clip filmato di Score. Duplica la clip di cifre (Modifica> Duplica) sei volte (quindi hai sette cifre) e distanziali uniformemente.

Dato che abbiamo solo sette cifre, il punteggio massimo che saremo in grado di visualizzare è 9.999.999. Se il tuo gioco dovrà ospitare punteggi più alti, aggiungi di conseguenza più cifre.

Aggiungi un po 'più di spazio tra ogni terza cifra per consentire separatori di virgola.


Passaggio 10: assegnare un nome alle clip di cifre

Selezionare il clip filmato della cifra più a sinistra e assegnargli il nome di istanza "digit1". Assegna un nome alla successiva "digit2", quindi "digit3" e così via.


Passaggio 11: aggiungere virgole

Crea un nuovo livello chiamato "virgole".

Il modo più semplice per far apparire le virgole esattamente come i numeri è inserire una delle cifre e copiare uno dei campi di testo numerici.
Tornando all'interno del clip filmato di Score, incolla il campo di testo nel livello di virgole e cambia il numero in una virgola. Duplicalo e spostalo tutte le volte che vuoi.


Passaggio 12: aggiungere uno sfondo

Per lo sfondo del punteggio aggiungeremo semplicemente un rettangolo arrotondato semplice.

Crea un nuovo livello chiamato "sfondo" e posizionalo dietro i livelli di numeri e virgole. Seleziona lo strumento Rettangolo e fai Option-clic (Alt-clic) sul palco. Crea un rettangolo di 200 px x 40 px con angoli di 3 px (aumenta la tua durata se hai più cifre). Rendi il riempimento nero e il tratto 1px grigio (# 666666).

Per qualche motivo Flash distorce sempre i tratti sui rettangoli arrotondati. Per aggirare questo, selezionare il tratto e scegliere Modifica> Forma> Converti linee in riempimenti. Questo converte il tratto da una linea a una forma piena e non si distorcerà più.

Se pensi che questo sia un trucco totale di una soluzione alternativa per le funzionalità di base che avrebbe dovuto essere risolto anni fa, ti invito a contattare Adobe e far loro sapere.


Passaggio 13: Aggiungi lucentezza

Quale grafica sarebbe completa senza un tocco di eleganza iPhone?

Crea un nuovo livello sopra ogni altra cosa chiamata "lucentezza". Aggiungi un nuovo rettangolo arrotondato, leggermente più piccolo di quello sullo sfondo. Questa volta non dare alcun tratto e riempirlo con un gradiente bianco dal 20% di Alpha a 0% di Alpha.


Passaggio 14: creare la classe del punteggio

Crea un nuovo file Actionscript chiamato "Score.as". Salvalo nella stessa directory del tuo file Flash principale. Poiché il nome di questa classe e il nome della classe di esportazione del clip filmato di Score sono gli stessi, Flash li collegherà automaticamente.

Aggiungi questo codice al file Score.as:

 package import flash.display.MovieClip; import flash.events.Event; la classe pubblica Score estende MovieClip // COSTRUTTORE funzione pubblica Score () 

Questo è solo un guscio vuoto di una classe per ora. Dobbiamo estendere la classe MovieClip poiché questa classe è collegata a un clip filmato nella libreria, quindi dobbiamo anche importare la classe MovieClip. Useremo l'evento ENTER_FRAME, quindi importeremo anche la classe Event.


Passaggio 15: aggiungere variabili e costanti

Aggiungi queste due linee alla classe Punteggio appena sopra la funzione di costruzione.

 private const SPEED: int = 1; // quanto velocemente conta NUM_DIGITS: int = 7; // quante cifre ci sono nel punteggio

Queste sono due costanti - tipo di impostazioni simili per la classe.

  • Il primo, SPEED, controlla la rapidità con cui il punteggio conta. Ho impostato per contare uno per uno, ma se il tuo gioco utilizza punteggi più alti questo potrebbe essere troppo lento. È possibile modificare questo a 5 o 10 o 50 per contare con tali incrementi.
  • La seconda costante, NUM_DIGITS, definisce il numero di cifre che abbiamo nel nostro clip filmato. Se hai aggiunto più (o meno) di 7 cifre, dovrai cambiarlo.

Ora aggiungiamo un paio di variabili. Metti questi appena sotto le costanti:

 private var _totalScore: int = 0; private var _displayScore: int = 0;

Queste variabili terranno le due diverse versioni del nostro punteggio. "_totalScore" sarà il punteggio effettivo. "_displayScore" sarà il numero corrente
viene mostrato sul display a LED. Se aggiungo 50 al punteggio, il _totalScore sarà immediatamente 50, ma il _displayScore sarà 1, quindi 2, quindi 3, fino a raggiungere 50.

Se hai bisogno di conoscere il punteggio reale (come inviare alle tue schede di punteggio elevato) utilizzerai _totalScore poiché _displayScore potrebbe non essere accurato.

Sto usando caratteri di sottolineatura all'inizio dei nomi delle variabili per indicare che si tratta di variabili private.


Passaggio 16: aggiungere il punteggio totale Metodo di accesso

Quindi, se _totalScore è una variabile privata, come accediamo dall'esterno della classe Score? Useremo un metodo "accessor" o "getter".

Aggiungi questo metodo sotto la funzione di costruzione:

 // accesso pubblico per la funzione public totalScore get totalScore (): int return _totalScore; 

Questo metodo restituisce semplicemente il valore della variabile _totalScore. Ci dà un modo per accedere a quel valore senza dover esporlo come variabile pubblica.


Passaggio 17: aggiungere il Inserisci Metodo

Avremo bisogno di un modo per aggiungere punti al punteggio. Aggiungi questo metodo:

 // aggiungi un importo al punteggio public function add (amount: int): void _totalScore + = amount; addEventListener (Event.ENTER_FRAME, updateScoreDisplay); // avvia il conteggio del display

Questo metodo accetta un intero "importo" che aggiunge alla variabile _totalScore. La seconda riga avvia un evento ENTER_FRAME che chiama un metodo chiamato updateScoreDisplay ogni frame. Lo aggiungeremo dopo.


Passaggio 18: aggiungere il updateScoreDisplay Metodo

Ora aggiungi un metodo updateScoreDisplay. È qui che accadrà tutta la funzionalità di conteggio. Deve accettare un evento poiché viene richiamato da un evento ENTER_FRAME.

 // esegue ogni frame per aggiornare la funzione privata score scoreScoreDisplay (e: Event): void 

Ora aggiungiamo alcune funzionalità. La prima cosa che questo metodo farà è incrementare la variabile _displayScore in base alla quantità impostata nella nostra costante SPEED:

 // incrementa il punteggio visualizzato per l'importo della velocità _displayScore + = SPEED;

C'è un potenziale problema qui però. Cosa succede se la nostra velocità è impostata su 10 e cerchiamo di aggiungere 5 al punteggio? Il displayScore sarà superiore al totalScore. Aggiungiamo un paio di righe per risolvere il problema:

 // assicurati che il punteggio del display non sia superiore al punteggio reale se (_displayScore> _totalScore) _displayScore = _totalScore; 

Questo controlla se il displayScore è superiore al totalScore e, in caso affermativo, imposta il displayScore come uguale al totalScore.

Successivamente dobbiamo aggiungere gli zeri iniziali al punteggio. Lo faremo convertendo displayScore in una stringa e aggiungendo zeri fino a quando la lunghezza è uguale al numero di cifre definite dalla costante NUM_DIGITS:

 var scoreStr: String = String (_displayScore); // cast displayScore come stringa // aggiunge gli zeri iniziali mentre (scoreStr.length < NUM_DIGITS) scoreStr = "0" + scoreStr; 

Ora per visualizzare effettivamente la partitura scorreremo ciclicamente ognuna delle nostre clip di cifre (ricordiamo che abbiamo chiamato "digit1", "digit2", ecc.) E usiamo il numero corrispondente dalla stringa di punteggio per impostare il numero di fotogramma del clip:

 // scorre e aggiorna ogni cifra per (var i: int = 0; i < NUM_DIGITS; i ++) var num = int (scoreStr.charAt (i)); questa ["cifra" + (i + 1)]. gotoAndStop (num + 1); // imposta la cifra mc sulla cornice destra

Il metodo charAt recupera il carattere da una stringa nella posizione specificata. Questo ci permette di andare personaggio dopo carattere attraverso la stringa del punteggio.

Le parentesi nella riga successiva ci consentono di creare dinamicamente il nome della clip. Il codice, questo [ "cifra" + (i + 1)] accede alla clip con il nome "digit1" o "digit2", ecc., a seconda del valore di io.

Stiamo usando "num + 1" come numero di frame perché i numeri di frame sono sfalsati di 1 dalle cifre che contengono (il frame 1 mostra 0, il frame 2 mostra 1, ecc.)

L'ultima cosa che dobbiamo fare in questo metodo è controllare se il displayScore e il totalScore sono uguali. Se è così, possiamo rimuovere l'ascoltatore e smettere di chiamare questo metodo per ora.

 // se il punteggio del display è uguale al punteggio totale rimuovi l'evento enterframe se (_totalScore == _displayScore) removeEventListener (Event.ENTER_FRAME, updateScoreDisplay); 

Se ti perdi da qualche parte in quella fase, puoi controllare i file sorgente per vedere la classe completata.


Step 19: La Score Score in uso

Per utilizzare questa classe trascina il clip filmato Punteggio dalla Libreria sullo stage e assegnagli il nome di istanza "myScore". Puoi aggiungere punti al tuo punteggio usando questa linea nella tua Document Class:

 myScore.add (50);

Puoi vedere un esempio di questo nei file sorgente. Sto aggiungendo al punteggio quando si fa clic sui pulsanti del paraurti, ma è più probabile che tu stia chiamando add () quando si verificano eventi nel tuo gioco.

Se hai bisogno di conoscere il punteggio del giocatore puoi ottenere il totalScore usando:

 myScore.totalScore

Questo chiamerà il metodo accessor e restituirà il valore di _totalScore.


Conclusione

Ora hai una classe Punteggio conteggio riutilizzabile che puoi utilizzare in uno qualsiasi dei tuoi giochi.

Penso che l'aspetto dei LED sia fantastico, ma dovresti sicuramente modificare il design per adattarlo all'aspetto del tuo gioco. Ecco alcune idee per diversi progetti per iniziare:

Grazie per aver letto questo tutorial. Fatemi sapere cosa ne pensate!