Per dare all’Astronave qualche possibilità di sopravvivere faremo in modo che questa sia in grado di difendersi.
In questo breve tutorial vedremo come creare dei missili e come fare a lanciarli.
Come abbiamo fatto per l’Astronave, adesso creeremo due Classi:
- Una Classe Missile per disegnare la forma del razzo.
- Una Classe Bullet che ne comanda il movimento.
Sarà anche necessario intervenire sulla Classe principale del gioco, AsteroidsGame, per integrare questo nuovo elemento.
All’interno della cartella grafica creiamo questo nuovo file Missile.as:
package grafica { import flash.display.Sprite; public class Missile extends Sprite { public function Missile (color:uint = 26265, size:uint = 8) { this.graphics.beginFill(color); this.graphics.drawCircle(0,0,size); this.graphics.endFill(); } } }
Non mi soffermo su questo codice perché è molto simile ad altre Classi che abbiamo scritto in precedenza. L’unico elemento nuovo è il Metodo drawCircle che serve a disegnare un cerchio passando tre parametri: coordinata x del centro, coordinata y del centro e lunghezza del raggio.
Lo ammetto: si chiama Missile perché pensavo di disegnare davvero un Missile, poi ho cambiato idea e ho preferito utilizzare un semplice cerchietto. Ma andiamo avanti…
All’interno della cartella elementi creiamo un nuovo file Bullet.as con questo contenuto:
package elementi{ import grafica.Missile; import flash.display.Sprite; public class Bullet extends Sprite { private var _color:uint; private var _boostX:Number; private var _boostY:Number; public function Bullet(x:int = 100,y:int = 100,color:uint = 0x006699,bx:Number = 0, by:Number = 0) { _color = color; this.x = x; this.y = y; _boostX = bx; _boostY = by; this.addChild(new Missile(_color, 2)); } public function muovi() { if (this.stage) { var W:Boolean = this.x < 0; var E:Boolean = this.x > stage.stageWidth; var N:Boolean = this.y < 0; var S:Boolean = this.y > stage.stageHeight; if (!N && !S && !W && !E) { this.x += _boostX; this.y += _boostY; } else { this.parent.removeChild(this); } } } public function set boostX(bx:Number) { _boostX = bx; } public function set boostY(by:Number) { _boostY = by; } } }
La parte importante di questa Classe è il Metodo Muovi. Il movimento del proiettile dipende dai valori delle Variabili _boostX e _boostY, queste saranno assegnate dall’esterno al momento dello sparo.
Quando il proiettile ha viaggiato tanto da uscire dai bordi dello schermo lo rimuoveremo, per due motivi:
- Per non lasciare Sprite inutilizzati fuori dallo schermo ad occupare memoria inutilmente.
- Nel gioco originale si poteva sparare un solo proiettile per volta, così ho pensato di utilizzare sempre lo stesso proiettile, aggiungendolo allo Stage se non ci si trova già.
Dopo che abbiamo salvato questi due file torniamo a modificare la Classe AsteroidsGame per aggiungere la gestione del proiettile.
La prima modifica riguarda l’importazione della Classe che ci serve e va inserita nella parte superiore del codice, assieme alle altre importazioni:
import elementi.Bullet;
Le seconda modifica va dentro la definizione della Classe ed è la dichiarazione della Variabile che useremo per la gestione del proiettile:
private var _b:Bullet;
Dopo di che aggiungiamo una riga per l’Inizializzazione dentro il Metodo init:
_b = new Bullet(0,0,0xFF0000);
E infine andiamo a scrivere tutta la gestione del proiettile dentro al Metodo goOn:
if (_keyDown[32] && !_b.parent) { _b.x = _p.x; _b.y = _p.y; _b.rotation = _p.rotation; var r = (_p.rotation+360)%360; _b.boostX = _p._cosArray[r]*7; _b.boostY = _p._sinArray[r]*7; this.addChild(_b); } _b.muovi();
Questo è tutto quello che serve per permettere all’Astronave di sparare dei proiettili. Il codice 32 corrisponde al tasto SPAZIO sulla tastiera, è quello che useremo per sparare. Le coordinate di partenza, la rotazione (che non si vede perché stiamo usando un cerchio) e la direzione di spostamento dipendono dallo stato dell’Astronave nel momento in cui viene creato il proiettile. La velocità di spostamento è statica ed è di 7 pixel per ciclo.
Il risultato raggiunto dopo questa lezione è questo:
[kml_flashembed publishmethod=”dynamic” fversion=”10.0.0″ useexpressinstall=”true” movie=”https://www.danielealessandra.com/wp-content/uploads/2010/05/Asteroids.swf” width=”300″ height=”300″ targetclass=”flashmovie”]
[/kml_flashembed]