Per quanto un gioco possa essere ripetitivo – e di certo Asteroids lo è – possiamo sperare di renderlo più avvincente inserendo due parametri: il punteggio e il livello di difficoltà.
In questa lezione aggiungeremo difficoltà al nostro gioco e assegneremo dei punti al giocatore per ogni asteroide distrutto.
Per modificare il livello di difficoltà in un gioco così semplice è sufficiente modificare la velocità di movimento degli Asteroidi.
Ricorderete che gli Astroidi si muovono grazie alle due Proprietà _boostX e _boostY della Classe Rock. Per modificare la velocità di tutti gli Asteroidi contemporaneamente dovremmo modificare il valore di queste due Proprietà su ogni istanza della Classe Rock… oppure no?
Sarebbe più comodo, per noi, utilizzare un unico moltiplicatore di velocità che tutte le Istanze possano utilizzare; modificando il valore di questo moltiplicatore modificheremmo la velocità di tutte le Istanze contemporaneamente.
Come fare quindi? Come creare una Proprietà condivisa da tutte le Istanze, in modo da non dover intervenire singolarmente su ognuna di esse?
Useremo una Variabile Statica.
Variabili statiche in AS3
Una Variabile Statica è una Variabile associata ad una Classe, anziché ad un’Istanza della Classe.
Per inizializzare una Variabile Statica utilizzeremo la parola chiave static, al’interno della Classe Rock scriveremo questo:
public static var _speedM:Number = 1;
Il valore di questa Variabile sarà condiviso da ogni Asteroide, che sia già sullo Stage o che debba ancora essere creato.
Utilizziamo questa Variabile all’interno del Metodo muovi della Classe Rock, sostituiamo queste due righe:
this.x += _boostX; this.y += _boostY;
In questo modo:
this.x += _boostX*_speedM; this.y += _boostY*_speedM;
Adesso andiamo a modificare la Classe AsteroidsGame per fare in modo che questo valore venga modificato. All’interno del Metodo splitAsteroid aggiungiamo questa riga:
Rock._speedM += 1;
Ricordiamoci che una Variabile Statica appartiene alla Classe, non ad una Istanza: per richiamare una di questa Variabili bisogna sempre utilizzare il nome della Classe (Rock) non il riferimento ad una Istanza, altrimenti otterremo un errore.
Incrementando di 1 il valore del moltiplicatore all’interno del Metodo splitAsteroid la velocità di tutti gli Asteroidi aumenta ogni volta che ne distruggiamo uno. Ecco cosa abbiamo ottenuto (distruggi qualche Asteroide per vederli accelerare):
[kml_flashembed publishmethod=”dynamic” fversion=”10.0.0″ useexpressinstall=”true” movie=”https://www.danielealessandra.com/wp-content/uploads/2010/05/Asteroids2.swf” width=”300″ height=”300″ targetclass=”flashmovie”]
[/kml_flashembed]
Naturalmente un’accelerazione di questo tipo è esagerata, l’ho usata soltanto per rendere più visibile l’effetto. Per il gioco finito utilizzerei un valore molto più piccolo, ad esempio 0,1.
E se finiscono gli Asteroidi?
Mi sono accorto adesso che è possibile distruggere tutti gli Asteroidi sullo schermo e rimanere soli a fluttuare nell’Universo. Per permettere al gioco di continuare è necessario creare altri Asteroidi quando questi finiscono.
Per fortuna abbiamo già una variabile che contiene la lista degli Asteroidi sul quadro di gioco, _asteroidsArray, e abbiamo anche un Metodo che crea Asteroidi, addAsteroids. Alla fine della Funzione splitAsteroids aggiungiamo queste tre righe:
if (_asteroidsArray.length < 1) { addAsteroids(); }
Cioé: se ci sono meno di 1 Asteroidi sullo schermo, ricreane altri 4 grandi come quelli iniziali.
In questo modo il gioco potrebbe non finire mai.
Aggiungiamo il Punteggio
Per segnare i punti ci servono due cose:
- Una Variabile che contiene il numero di punti complessivi.
- Una Casella di testo che mostri questo valore.
Aggiungere una Variabile è molto semplice, lo abbiamo fatto tante volte, alla Classe AsteroidsGame aggiungo questa Proprietà:
private var _score:uint;
Per incrementare il punteggio aggiungo questa riga alla fine del metodo splitAsteroids:
_score++;
Per mostrare questo valore abbiamo bisogno di una Casella di testo. Per utilizzarla dobbiamo prima importare la Classe necessaria:
import flash.text.TextField;
Poi inizializziamo un’Istanza di questa Classe:
private var _scoreDisplay:TextField;
All’interno del Metodo init inseriamo il valore iniziale, impostiamo il colore del testo e aggiungiamo il testo allo Stage:
_scoreDisplay = new TextField(); _scoreDisplay.text = '0'; _scoreDisplay.textColor = 0xFF6699; _scoreDisplay.selectable = false; this.addChild(_scoreDisplay);
Questo testo va aggiornato ogni volta che cambia il punteggio. Per aggiornarlo è sufficiente modificare il valore della sua Proprietà text. Torniamo all’interno del metodo splitAsteroids e scriviamo l’ultima riga:
_scoreDisplay.text = String(_score);
Ecco il risultato di questa lezione:
[kml_flashembed publishmethod=”dynamic” fversion=”10.0.0″ useexpressinstall=”true” movie=”https://www.danielealessandra.com/wp-content/uploads/2010/05/Asteroids3.swf” width=”300″ height=”300″ targetclass=”flashmovie”]
[/kml_flashembed]
Ci sono ancora molte cose da ritoccare e, certo, non abbiamo ancora gestito la collisione tra l’Astronave e gli Asteroidi… ma ci arriveremo.