Pagine    Articoli    Prodotti    Forum    Cerca  
Nickname

Password


Non sei registrato?
Registrati a GPI qui!

Puoi anche attivare un vecchio utente GPI e chiedere una nuova password.
I Team

Mappa Team
I nostri utenti

Mappa Utenti
  Programmare un videogame Flash con Starling #9
Pubblicato da Andrea Venturi il 2013-05-20 19:01:00

“Bang bang, My Baby Shot Me Down...”

 

In questo tutorial vediamo come far sparare la nostra astronave.

 

Momento teoria

Per realizzare questa funzionalità dovremmo andare a disegnare un proiettile dopo l’altro, facendo trascorrere del tempo tra essi, altrimenti si avrebbe un fascio continuo di sprite.

 

Quindi per dare un effetto di sparo continuo, ad ogni tick di tempo andiamo a controllare il tempo trascorso dall'ultimo proiettile disegnato e se ne è passato una quantità minima scelta da noi ne disegneremo un'altro.

 

Iniziamo con il dare ad ogni proiettile un comportamento semplice, farlo procedere in avanti fino a fine scermata, dopo di che lo elimineremo.

 

Ovviamente dovrete aggiornare la vostra texture atlas con il disegno del proiettile, nel mio caso un puntino rosso.

 

Scriviamo il codice

Creiamo una classe per gestire un proiettile, nominiamola Shoot che estende Sprite.

public class Shoot extends Sprite

Nel costruttore, come sempre chiamiamo il costruttore della classe ereditata e gestiamo l’evento onAddedToStage.

public function Shoot()
{
  super();
  addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
}

creiamo due attributi, un’immagine per la visualizzazione e un uint per gestire lo spostamento

private var shoot:Image;
private var speed:uint = 600;

[nota: 600 perchè deve andare più veloce dell’astronave]

 

Nella onAddedToStage andiamo a rimuovere il listener e a disegnare l’immagine del proiettile.

private function onAddedToStage(e:Event):void
{
  removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
  shoot = new Image(Assets.getAtlas().getTexture("shoot"));
  addChild(shoot);
}

A questo punto scriviamo il metodo update, che deve aggiornare la posizione del proiettile, che riceve in parametro un Number che rappresenta il tempo trascorso dall’ultimo update e incrementa la posizione.

public function update(time:Number):void
{
  x += time * speed;
}

                

Ovviamente può essere complicata a piacere per dare effetti particolari.

 

Chiudiamo la classe con un metodo per settare velocemente la posizione da cui deve partire il proiettile

public function setPos(X:Number, Y:Number):void
{
  x = X;
  y = Y;
}

A questo punto andiamo ad aprire la classe starField ed andiamo a inserire due nuove variabili, una che useremo per calcolare il ritardo tra uno sparo di tipo uint e l'altra e una che ci serve per collezionare i proiettili disegnati che è di tipo Vector di shoot, una collezione di oggetti di tipo Shoot.

private var ritardo:uint;
private var proiettiliPG:Vector.;

                

Ovviamente ci serve anche parametrizzare la soglia di ritardo tra uno colpo e l'altro, magari per implementare un bonus che permette di sparare più velocemente, quindi inseriamo un'altra variabile atta allo scopo.

private var DelayShoot:int;

                

A questo punto andiamo nella drawScreen per inizializzare le variabili appena inserite

ritardo = 0;
DelayShoot = 10;
proiettiliPG = new Vector.();

Ora dobbiamo crearci la funzione che eseguirà lo sparo e gestirà il loro update temporale.

 

Quindi iniziamo con creare la firma del metodo

private function PGShoot():void
{
}

 

Come prima cosa andiamo a dichiarare una variabile temporanea di tipo Shoot

var tmp:Shoot;

Incrementiamo il ritardo e testiamo se è trascorso abbastanza tempo basandoci sul DelayShoot

ritardo++;
if (ritardo > DelayShoot)
{

In caso affermativo azzeriamo il ritardo e creiamo un nuovo proiettile, andiamo a posizionarlo e accodiamolo alla lista dei proiettili da muovere

  ritardo = 0;
  tmp = new Shoot();
  tmp.setPos(ship.x+50, ship.y);
  addChild(tmp);
  proiettiliPG.push(tmp);
}

a questo punto dobbiamo aggiornare la posizione di tutti i proiettili sparati, controllando che se superano il bordo dello schermo devono essere eliminati

for (var it:int; it < proiettiliPG.length;++it )
{
  tmp = proiettiliPG[it];
  tmp.update(elapsed);
  if (tmp.x > stage.stageWidth)
  {
    proiettiliPG.splice(it, 1);
    removeChild(tmp);
  }
}

A questo punto manca solo di andare a richiamare questa funzione.

 

Ovviamente l'astronave sparerà solo quando è nella fase di gioco, quindi andiamo ad aggiungere la chiamata nel metodo onTick, all'interno dello switch nel caso "gioco", subito prima del break

PGShoot();

A questo punto non serve altro che compilare e testare il risultato.

 

E come sempre il codice lo trovate qui.

 

Campagne crowfunding

Just One Line
Siamo presenti su

     
Copyright ©2016 - Manifesto - Privacy - Termini di Servizio - Community - Collaboratori - Contattaci