(:title Giochino del Sottomarino:)
<< Immagini | Giochino Sottomarino | Fumo e stati di gioco >>
:: Giochino del Sottomarino - Esplosioni e oscillazioni ::
Esplosioni

L'esplosione
Girovagando su internet ho trovato questa immagine di un'esplosione, già divisa in frames e quindi già pronta per il nostro giochino del sottomarino. Introdurremo quindi un paio di cose nuove per poter utilizzare questa immagine, che come le altre va salvata in ./data/esplosione.png.
Ci serve innanzitutto una nuova classe, che fantasiosamente chiameremo Esplosione, e che implementerà Entity. Le variabili inizialmente saranno le solite:
boolean active;
private float x;
private float y;
private float width;
private float height;
Ci servono però altre cose:
private Image image;
private SpriteSheet sprites;
private Animation animation;
Image già la conosciamo. Le altre due ci servono per creare l'animazione: Slick ci fornisce già l'infrastruttura necessaria.
Nel costruttore, dobbiamo innanzitutto creare l'Image:
image = new Image("./data/esplosione.png");
e poi costruire lo SpriteSheet:
sprites = new SpriteSheet(image, 128, 128);
Stiamo dicendo a Slick di costruire un foglio di sprites a partire dalla nostra Image, e gli diciamo che ognuna delle caselle che contengono sprites è larga 128 pixel ed alta 128. Slickautomaticamente ricaverà i frames dall'immagine qui sopra. Lo SpriteSheet ci permette anche di accedere ad un singolo frame e così via.
Ma non è finita. Un conto è avere uno foglio di sprites, un conto è poi animarli. Slick ci offre già anche questo:
animation = new Animation(sprites, 60);
Il primo parametro che passiamo al costruttore di Animation è lo SpriteSheet da cui trarre i frames. Il secondo parametro è la durata in millisecondi di ogni frames. Le animazioni possono essere messe in loop, ovvero ripartire automaticamente da capo quando finiscono. Noi non vogliamo ciò: quando l'animazione ha terminato un giro, anche l'esplosione è terminata.
animation.setLooping(false);
Ci servono poi le altre variabili:
active = false;
x = 0.0f;
y = 0.0f;
width = image.getWidth() / 4;
height = image.getHeight() / 4;
Dobbiamo introdurre il solito metodo start, che chiameremo dall'esterno:
public void start(float x, float y) {
this.active = true;
this.x = x;
this.y = y;
animation.restart();
}
Diciamo anche all'animazione di ripartire dal primo frame.
Ecco il metodo update:
if (active) {
animation.update(delta);
if (animation.isStopped()) {
active = false;
}
}
Quando l'animazione arriva in fondo, alza automaticamente una flag, e noi possiamo scoprirlo subito.
In render dobbiamo disegnare l'esplosione nelle coordinate che ci sono state passate. Dal momento che passeremo le coordinate del centro dell'esplosione, dovremo fare una cosa del genere:
if (active) {
animation.draw(x - width / 2, y - height / 2);
}
perché le coordinate passate a draw sono quelle dell'angolo in alto a sinistra.
Diciamo anche a NetBeans di costruire automaticamente un getter per la variabile active (pulsante destro - Insert Code etc.).
Attivare le esplosioni
Torniamo allo StatoGioco. Ci serve la solita ArrayList di Esplosioni, e vi lascio come compito la scrittura di questo codice. In update e render dovremo aggiornare e renderizzare tutte le Esplosioni, allo stesso modo delle altre Entity.
Quando un Sottomarino viene colpito, vogliamo che l'esplosione avvenga nel centro esatto del Sottomarino. Andiamo quindi alla parte di codice, nella update di StatoGioco, che controlla le collisioni, e ne modifichiamo il nucleo in questo modo:
if (boxBomba.intersects(boxNemico)) {
b.setActive(false);
s.setActive(false);
attivaEsplosione(boxNemico.getCenterX(), boxNemico.getCenterY());
}
Ovviamente, ci serve anche il metodo attivaEsplosione, che si commenta da sé:
public void attivaEsplosione(float x, float y) {
for (Esplosione e : esplosioni) {
if (!e.isActive()) {
e.start(x, y);
break;
}
}
}
Fatto! Ora ci sarà una bellissima Esplosione quando un Sottomarino viene affondato:)
<< Immagini | Giochino Sottomarino | Fumo e stati di gioco >>
Guide