libGDX, un framework di sviluppo giochi in Java

LibgdxChi non è mai stato tentato di sviluppare un gioco? Purtroppo, specie in ambito Java, ci si scontra con quella che è la dura realtà di questa piattaforma, ovvero la difficoltà nel mettere in piedi qualcosa che, sfruttando le librerie grafiche di base, sia veloce e bello da vedere.

Grazie a libGDX questo problema si risolve dandoci il supporto a librerie di input, audio, video (OpenGL compresa), un engine fisico con dei wrapper per la conosciuta Box2D e, dulcis in fundo, persino la possibilità di sviluppare in ambito multipiattaforma su Windows, Linux, Mac, Android, iOS e WebGL.

Panoramica

La gestione delle dipendenze è affidata a gradle e ciascuna piattaforma target avrà il suo modulo, quindi un modulo core, desktop, android, ios, web, etc e, ovviamente, ciascun modulo avrà al suo interno il proprio build di gradle, le dipendenze, gli step e via dicendo.

Installazione

Per prima cosa occorre preparare l’ambiente di sviluppo e quest’operazione è strettamente correlata con le piattaforme target, ciascuna ha le proprie prerogative.

Ad esempio per iOS serve un Apple Developer account, per Android serve il relativo SDK, etc.

Rimane comunque la libertà di scelta per il proprio IDE tra IntelliJ IDEA, Netbeans, Eclipse o chi per esso.

Nella documentazione non è chiaro ma l’Android SDK è strettamente necessario solo se si sviluppa per quella piattaforma. Sembra ovvio ma la documentazione non lo menziona con chiarezza.

Non rimane che scaricare il pacchetto della libGDX e far partire il Project Setup tool, uno strumento che ci consentirà di definire il progetto secondo i parametri necessari, rimando direttamente alla wiki ufficiale su GitHub.

Qui vediamo il setup del progetto su IntelliJ con solamente il modulo desktop, oltre naturalmente al core.

lunar_lander_1Il Progetto

Chiunque abbia una certa età conosce sicuramente due dei passatempi favoriti della “generazione MS-DOS”, ovvero nibbles.bas e gorilla.bas, due giochini in basic che erano distribuiti insieme al Basic del DOS. Io ho deciso di cimentarmi con qualcosa di poco più complesso, ovvero una ri-edizione (almeno un tentativo 🙂 ) del famoso Lunar Lander del 1979, troverete il progetto su GitHub.

Nel mio caso mi limiterò ad un’applicazione desktop e con pochi, pochissimi fronzoli.

Gradle Build Script

Come potrete notare ho modificato sensibilmente gli script predefiniti nel seguente modo:

Script principale

  • rimozione del repository sonatype (mi limito a mavencentral)
  • aggiunta del task “jacocoReport” per i report di coverage test con jacoco e relativa configurazione
  • dipendenze di junit e mockito
  • compatibilità Java 8

Script moduli

  • aggiunta dello step “test”
  • compatibilità Java 8

Organizzazione Progetto

Il progetto desktop non è molto più che un wrapper per lanciare il modulo core come una application, nello specifico una LwjglApplication. LWJGL è acronimo di Light Weight Java Game Library, una libreria tra le dipendenze di libGDX che implementano buona parte delle risorse per lo sviluppo cross-platform.

In teoria è possibile utilizzare solo queste ultime ma lo sforzo si moltiplica in quanto libGDX offre una serie di interfacce per accedere a sudette librerie non a così basso livello. Minecraft ad esempio utilizza proprio la LWJGL.

Concentreremo il grosso dello sviluppo nel modulo core che conterrà tutta la logica dell’applicazione:lunar_lander_2Nel dettaglio:

  • assets: contiene gli asset dell’applicazione quali suoni, sprites, etc, predefinita di libGDX.
  • BodiesNames: un semplice enum che conterrà i nomi di molti oggetti per evitare di usare “magic string” in giro per il codice.
  • Dimensions: un pojo con le definizioni delle grandezze quali gravità, pesi, spinta dei reattori, etc. È doveroso notare che la libreria Box2D si porta già dietro il sistema internazionale, ovvero kg, metri, secondi.
  • StringDecorator: un semplice decorator per convertire i float nel formato stringa che occorra, ovvero con nessuno, uno o due decimali, utilizzato solo per stampare valori a video.
  • GameEngine: il vero e proprio cuore dell’applicazione. Crea il “mondo” di Box2D, aggiunge gli oggetti gestisce l’input ed, infine, applica lo “step” del mondo, ovvero applica la logica e manda il contatore del tempo avanti. Forse andrebbe rifattorizzata dato che fa troppe cose 🙂
  • MathUtils: si occupa di convertire i radianti in gradi e calcolare la forza G applicata ad un oggetto. In entrambi i casi si tratta di funzioni utilizzate per stampare valori a video.
  • GameEngineTest e StringDecoratorTest: junit test per assicurarci che non introduciamo regressioni o rompiamo le API definite quando si fanno cambi.

Come lanciare build, test, run

Da linea di comando, o dal vostro IDE, si possono lanciare i seguenti step gradle:

  • clean
  • test: lancia la suite di test
  • run: esegue il main di DesktopLauncher
  • dist: crea un jar distribuibile con tutte le dipendenze al suo interno

Da linea di comando basta un “./gradlew clean“, come al solito gli script gradle si possono arricchire come di proprio gusto o necessità.

Il risultato finale non è nulla ai livello di Kerbal Space Program ma almeno ci permette di avere un’infarinatura, seppur di base, sulle possibilità di questa libreria.

lunar_lander_3ToDo

  • Devo ancora riuscire a scrivere un test unitario di LunarLander, per tutta una serie di motivi non riesco mai ad estendere la LWJGL Headless application per i test unitari, ho lasciato la branch “mock-lunarlander” mentre proseguono i lavori con quanto trovo su internet ma ancora non ho risolto.
  • Aggiungere un minimo di grafica che non sia un semplice wireframe 🙂

2 thoughts on “libGDX, un framework di sviluppo giochi in Java”

  1. Fantastico articolo, ti pongo solo una domanda: ho iniziato a cimentarmi da poco con LibGDX, sai se è possibile aggiungere un modulo (es.Android) in seguito?

    1. Ciao Tiziano.

      Purtroppo non so dirti per mia diretta esperienza se sia possibile aggiungere il modulo in seguito.
      Andando “a naso” direi proprio di sì, credo basti aggiungere un modulo al progetto, personalmente non ho mai provato comunque. 😉

Leave a Reply

Your email address will not be published. Required fields are marked *