Creare videogiochi con java (parte 2)
Secondo di una serie di articoli sulle basi della libreria GTGE, una libreria java completamente gratuita per creare videogiochi 2d portabili e di impatto.
Eccoci finalmente giunti alla seconda parte del mini corso sulla programmazione di videogiochi 2D con java. Dopo aver visto un’introduzione generale a GTGE nel primo articolo, in questo secondo appuntamento vedremo come creare degli Sprite animati e come inserire dei semplici effetti sonori.
Sprite animati
La libreria GTGE fornisce diverse classi per la gestione di animazioni:
- com.golden.gamedev.object.AnimatedSprite: è uno sprite formato da più immagini (che danno origine all’animazione).
- com.golden.gamedev.object.sprite.AdvanceSprite: rappresenta sempre uno Sprite animato ma offre funzionalità avanzate per la gestione delle animazioni.
- com.golden.gamedev.object.sprite.VolatileSprite: sempre uno Sprite animato, ma stavolta l’animazione viene visualizzata un’unica volta anzichè essere mandata in loop. E’ particolarmente utile nel caso di esplosioni o simili.
In questo articolo approfondiremo solo AnimatedSprite.
AnimatedSprite
L’utilizzo della classe AnimatedSprite è molto semplice, come mostrato in questo esempio:
... // riferimento allo sprite animato AnimatedSprite sprite; // vettore con i vari frame dell'animazione BufferedImage[] spriteImage; ... // crea lo sprite sprite = new AnimatedSprite(spriteImage, 0, 0); // imposta il ritardo tra un frame ed il successivo sprite.getAnimationTimer().setDelay(100); // imposto i frame dell'animazione sprite.setAnimationFrame(0, 2); // animo lo sprite sprite.setAnimate(true); // metto in loop l'animazione sprite.setLoopAnim(true); ...
Analizziamo in dettaglio il codice. AnimatedSprite mette a disposizione quattro costruttori (compreso quello di default):
- public AnimatedSprite(): crea uno Sprite animato senza immagini e lo posiziona in (0, 0)
- public AnimatedSprite(BufferedImage[] image): crea uno Sprite animato con le immagini contenute in image e lo posiziona in (0, 0)
- public AnimatedSprite(BufferedImage[] image, double x, double y): crea uno Sprite animato con le immagini contenute in image e lo posiziona in (x, y)
- public AnimatedSprite(double x, double y): crea uno Sprite animato senza immagini e lo posiziona in (x, y)
Nel codice qui sopra il costruttore usato è il terzo (ed è quello che probabilmente utilizzerete più spesso). Dopo aver istanziato lo Sprite è necessario impostare l’intervallo di tempo tra un frame ed il successivo. Per fare questo abbiamo bisogno di ottenere un riferimento al timer interno allo Sprite col metodo getAnimationTimer e chiamare su questo riferimento il metodo setDelay(int). L’intero in ingresso a setDelay è la durata dell’intervallo espressa in millisecondi.
Fatto questo dobbiamo indicare allo Sprite quali frame mostrare. Questo si fa col metodo setAnimationFrame(int start, int finish). I frame che compongono l’animazione sono quelli che stanno tra il frame di indice start (compreso) ed il frame di indice finish (compreso). Ovviamente start deve essere minore di finish.
Fatto questo occorre far partire l’animazione col metodo setAnimate(true). Per fermare l’animazione basta passare false al posto di true. Se notate però, in questo modo l’animazione verrà eseguita una sola volta. Per fare in modo che l’animazione venga ripetuta (magari finchè si preme un tasto) bisogna chiamare il metodo setLoopAnim(true). Ovviamente passando false al posto di true l’animazione non verrà più iterata.
Ecco un semplice esempio (il file plane2.png si trova nel paccheto completo di GTGE):
import com.golden.gamedev.*; import com.golden.gamedev.object.background.*; import com.golden.gamedev.object.*; import java.awt.*; public class AnimatedSpriteDemo extends Game { private AnimatedSprite sprite; private Background background; public void initResources() { background = new ColorBackground(Color.blue); // crea lo sprite sprite = new AnimatedSprite( getImages("plane2.png", 3, 1), 100, 100); // imposta il ritardo tra un frame ed il successivo sprite.getAnimationTimer().setDelay(50); // imposto i frame dell'animazione sprite.setAnimationFrame(0, 2); // animo lo sprite sprite.setAnimate(true); // metto in loop l'animazione sprite.setLoopAnim(true); } public void update(long elapsedTime) { background.update(elapsedTime); sprite.update(elapsedTime); } public void render(Graphics2D g) { background.render(g); sprite.render(g); } public static void main(String[] args) { GameLoader gameLoader = new GameLoader(); gameLoader.setup( new AnimatedSpriteDemo(), new Dimension(640, 480), false); gameLoader.start(); } }
Come semplice esercizio provate a cercare le immagini dell’aereo nelle quattro direzioni e provate a far muovere l’aereo con i tasti freccia. Basta mettere una catena di if in update e cambiare l’animazione di conseguenza!
Inserire effetti sonori
GTGE fornisce due metodi per inserire suoni nel nostro videogioco:
- public int playMusic(String)
- public int playSound(String)
La stringa richiesta dai due metodi è ovviamente il percorso ai file sonori. La differenza tra i due metodi è che playMusic manda l’effetto sonoro in loop, mentre playSound esegue il suono solo una volta. Inoltre cambia il formato audio: playMusic vuole un file .mid mentre playSound vuole un .wav.
Conclusioni
Finisce qui la seconda parte di questa guida a GTGE. Nella prossima puntata parleremo di collisioni. Non mancate!
Commenti recenti