Questo è un proggetto universitario per "Interfacce Grafiche e Programmazione ad Eventi". Si tratta di un giochino picchiaduro basato su DagonBall, sviluppato in Java con la libreria JavaFX, il modulo di intelligenza artificiale DLV2.0 ed un paio di design patterns.
Salvatore Spagnuolo
DragonFight è un Picchia duro ispirato a Dragonball, ha due modalità di gioco:
- Singleplayer
- Multiplayer
La modalità single player consente di giocare contro un’intelligenza artificiale, mentre la multiplayer (solo offline) consente di giocare contro un altro giocatore condividendo la tastiera del pc.
Per quanto riguarda il single player i comandi sono: W, A, S, D rispettivamente per muoversi su, sinistra, giù e destra, mentre Q ed E sono gli attacchi base calcio e pungo, poi ci sono 3 attacchi di aura R (onda piccola), F (onda energetica), C (attacco finale). Nella modalità multiplayer il giocatore 2 userà Y, G, H, J per i movimenti, T, U per gli attacchi base e I, K, M per gli attacchi d’aura.
Il gioco è stato programmato in Java versione 1.8, utilizzando le librerie grafiche di JavaFX. Per l’intelligenza artificiale è stato utilizzata la tecnologia DLV, sviluppata presso L’Università della Calabria.
Durante lo sviluppo del gioco sono stati utilizzati diversi pattern ed accortezze, una tra queste che merita attenzione è stata la volontà di creare delle hitbox più precise utilizzando delle forme ellittiche, operazione non facile quella di verificare in tempo reale la collisione tra due ellissi senza per forza mettere a sistema le rispettive equazioni. In pratica la questione si è risolta definendo lungo la circonferenza dell’ellisse 8 punti equidistanti, a questo punto è facile sapere se un punto si trova dentro un’ellisse o meno. In sostanza due ellissi collidono se uno dei punti presenti sulla circonferenza entra dentro un’altra ellisse.
Altra accortezza è che ogni oggetto di gioco deriva dalla classe astratta GameObject, la quale contiene due metodi molto importanti, move() e draw(). Ogni GameObject viene listato all’interno di una Singleton Class GlobalManager, il quale implementa AnimationTimer. Nel suo Handler GlobalManager, scorre la lista di oggetti GameObject e ne chiama i metodi move() a 60FPS ed il metodo draw() (che disegna le sprite) a 16FPS. GlobalManager esegue anche l’IA DLV a 2FPS nel caso la partita sia single player.
Il main (GameLauncher) contiene un riferimento ad un'altra Singleton Class, la GameFactory, essa si occupa di creare le giuste istanze di Player a seconda del tipo di partita scelto, è una classica applicazione dei pattern AbstractFactory e FactoryMethod. Inoltre, crea anche parte della UI di gioco contenuta in oggetti, come i backgrounds e le barre della vita e dell’aura.
Per passare tutto lo stato del gioco a DLV è stata utilizzata una particolare implementazione del pattern Observer, ovvero il giocatore comandato dall’IA è observer di diversi subject (l’altro player e le varie onde) i quali ad ogni aggiornamento del loro stato mandano una notify() contentente un InformationPack, una piccola classe wrapper che contiene informazioni base sulla posizione, direzione ed azione. Questo pacchetto integra il sistema EmbASP e quindi una volta ricevuto dal player IA, viene inviato al sistema DLV, il quale elabora una soluzione che può restituire due tipi di risposte: Go(Direction) nel caso si è in pericolo di essere attaccati, o non si è allineati al soggetto per attaccare, oppure Do(Attack) nel caso in cui non si è minacciati e si è allineati con il soggetto per sferrare un attacco.
Aggiungere un nuovo personaggio è molto facile, la classe Player prende le informazioni riguardanti le varie sprite da un file properties. Basta quindi specificare il nuovo personaggio nel file properties inserendo l’url dell’immagine che contiene le sprite nuove, e la mappatura delle varie azioni su essa. Tutto questo senza toccare ne la classe player ne la factory.
L’utilizzo della factory ha permesso una divisione netta tra le due modalità di gioco, infatti nella modalità single player tutta la parte di intelligenza artificiale, observer, invio pacchetti informazione ecc. non viene proprio insaziata.


