Lo sviluppo di giochi in ambiente Android - Files System, Audio e Networking
Il modulo Files in libgdx fornisce i metodi per leggere, scrivere, copiare, spostare e cancellare file. Ognuna delle piattaforme di destinazione di libgdx gestisce i file in modo differente. Su un sistema operativo di una piattaforma desktop (Windows, Linux, Mac OS X) i file possono essere riferiti tramite percorsi relativi alla directory corrente di lavoro o tramite percorsi assoluti e, generalmente, possono essere letti o scritti da tutte le applicazioni. In Android la situazione è un po’ più complessa: ci sono tre possibili modi per memorizzare i file:
- all’ interno della cartella assets del progetto Android. In questo caso i file sono delle risorse alle quali è possibile accedere in sola lettura;
- in una directory di archiviazione interna all’applicazione ed accessibile solo dall’applicazione. In questo caso i file sono accessibili in lettura e scrittura;
- in una memoria esterna (ad esempio una scheda SD). Tale memoria non è sempre disponibile e, di conseguenza, i file memorizzati al suo interno devono considerarsi come Se si utilizza questo metodo è necessario aggiungere un permesso nel file AndroidManifest.xml per poter accedere in scrittura.
Un file in libgdx è rappresentato da un’ istanza della classe FileHandle. Questa classe fornisce un tipo (type) che definisce dove il file è memorizzato. I diversi valori che può assumere questo tipo sono: classpath, internal, local, external e absolute. Tutte le piattaforme di destinazione possono far uso de i diversi tipi eccetto HTML5 che utilizza esclusivamente il tipo internal. Il tipo classpath permette di memorizzare file in sola lettura ma non viene utilizzato spesso. I file internal e local sono file in sola lettura memorizzati nella directory di lavoro delle piattaforme desktop o nella cartella assets della piattaforma Android. Se il file non viene trovato fra quelli di tipo internal o local verrà cercato fra quelli di tipo classpath. I file external sono relativi alla scheda SD su Android o alla home directory sulle piattaforme desktop. Infine i file absolute specificano i loro path completi ma, per motivi di portabilità, questi file vengono utilizzati solo quando strettamente necessario.
I tipi di archiviazione descritti potrebbero non essere disponibili per alcune piattaforme e libgdx fornisce due metodi per conoscere la disponibilità o meno di memoria interna o esterna:
boolean isExtAvailable = Gdx.files.isExternalStorageAvailable(); boolean isLocAvailable = Gdx.files.isLocalStorageAvailable();
La gestione dei file è affidata all’ interfaccia Files.
Libgdx fornisce metodi per la riproduzione di piccoli effetti sonori (Sound) o di brani musicali (Music) direttamente dal disco. Tutti gli accessi ai serviz i audio avvengono tramite l’ interfaccia Audio la cui istanza è ottenuta con la seguente istruzione:
Audio audio = Gdx.audio;
I Sound sono piccoli file audio, generalmente non più di 1MB (qualche secondo) di dimensione, che vengono riprodotti per specifici eventi di gioco (per esempio il salto di un personaggio o lo sparo di una pistola). Tali effett i sonori possono essere memorizzati in diversi formati e libgdx supporta mp3, ogg e wav. Nel caso in cui la dimensione del file è maggiore di 1MB libgdx fornisce un’istanza della classe Music che permette di effettuare lo streaming del file direttamente dal disco anziché caricarlo completamente nella RAM come accade per i Sound. Le istruzioni seguenti consentono di caricare sound e music dalla memoria interna di una piattaforma:
Sound sound = Gdx.audio.newSound(Gdx.files.internal("data/mysound.mp3")); Music music = Gdx.audio.newMusic(Gdx.files.internal("data/mymusic.mp3"));
Una volta ottenuta un’istanza della classe Music o Sound è possibile riprodurre il brano tramite il metodo play(), settarne il volume tramite il metodo setVolume(float volume), ripetere la riproduzione col metodo setLooping(boolean isLooping), mettere in pausa e terminare la riproduzione tramite i metodi pause() e stop() rispettivamente. Al termine dell’esecuzione dell’applicazione tutte le istanze di Music e Sound devono essere eliminate per liberare memoria e ciò avviene tramite il metodo dispose().
Infine, Libgdx include alcune classi per le operazioni di rete cross-platform. Le operazioni fornite dall’ interfaccia Net possono essere semplici richieste GET e POST http o operazioni per la comunicazione tramite socket TCP in un’architettura client/server. L’interfaccia Net prevede l’utilizzo di sei classi Java:
- java, è un’ interfaccia che fornisce stream di input e di output per lavorare con le socket;
- java, è una classe usata per configurare le socket TCP lato client;
- java, è una classe usata per creare le socket TCP lato server, essa fornisce il metodo standard accept() che blocca il server in attesa che si colleghi un client;
- java, è una classe usata per configurare le socie TCP lato server;
- java, è una classe che fornisce metodi per vedere qual è il codice di stato di un tipico messaggio di risposta http;
- java, è una classe che fornisce metodi utili per le richieste http.
La creazione di socket TCP lato client e lato server avviene tramite le seguenti istruzioni:
Socket socket = Gdx.net.newClientSocket(Protocol p, String host, int port, SocketHints hints); ServerSocket server = Gdx.net.newServerSocket(Protocol protocol, int port, ServerSocketHints hints);
per inviare richieste http si usa il seguente metodo dell’ interfaccia Net:
Gdx.net.sendHttpRequest(HttpRequest httpRequest, HttpResponseListener httpResponseListener);
Per maggiori dettagli riguardo l’ interfaccia Net è possibile visitare la documentazione ufficiale.