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() 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.

 

Ben tornato