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!

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.