LIBGDX Coñecendo a estrutura dos proxectos

De MediaWiki
Saltar a: navegación, buscar

UNIDADE 2: Coñecendo a estrutura dos proxectos

Imos analizar a estrutura dos proxectos.

Cartafol Assets

Na versión Android da nosa aplicación se atopa o cartafol Assets. É dentro deste cartafol onde temos que gardar todos os nosos recursos gráficos, música, efectos de son,....xa que a este cartafol é a onde vai dirixirse o resto de versións.

LIBGDX xogos2d 01.jpg

Podemos comprobar coma na versión Desktop vai utilizar como cartafol de traballo cartafol assets creado na versión Android.

LIBGDX xogos2d 02.jpg

Clases que inician o xogo

Versión Desktop

No caso da versión Desktop é unha clase Java cun método main.

  1. package com.plategaxogo2d.angel.desktop;
  2.  
  3. import com.badlogic.gdx.backends.lwjgl.LwjglApplication;
  4. import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration;
  5. import com.plategaxogo2d.angel.MeuXogo;
  6.  
  7. public class DesktopLauncher {
  8.         public static void main (String[] arg) {
  9.                 LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
  10.                 config.title = "O meu Xogo";
  11.                 config.width = 480;
  12.                 config.height = 320;
  13.                 new LwjglApplication(new MeuXogo(), config);
  14.         }
  15. }

Nota: No voso proxecto podedes ter un nome de paquete (package) diferente. Tede coidado cando copiedes o código e mantede o voso nome de paquete.


O que fai dito método é preparar un obxecto da clase LwjglApplicationConfiguration cos datos necesarios para executar o xogo, no noso caso indica que:

  • O título do xogo será: O meu xogo (aparece na parte superior da xanela cando se executa o xogo)
  • Indica o ancho e alto en pixeis da pantalla onde vai executarse a aplicación.


Despois crea un obxecto da clase LwjglApplication mandando coma parámetros a configuración indicada anteriormente e un obxecto da clase MeuXogo.

Imos analizar un pouco máis algunha das propiedades que podemos modificar na configuración Desktop.

  • title: título que vai aparecer na parte superior da xanela cando se executa.
  • width: ancho en pixeis da xanela.
  • height: alto en pixeis da xanela.
  • fullscreen: permite que o xogo se execute a pantalla completa. É necesario quitar as dúas propiedades anteriores ou ben poñer un height-width que permite ter a pantalla completa.

Para saír de pantalla completa podemos pechar a xanela premendo as teclas Alt+F4.

Utilizando esta forma usa a resolución máis baixa da tarxeta gráfica que permita ter a pantalla completa (normalmente 640x480 pixeis). Se queremos que estea a pantalla completa utilizando a resolución que estades a utilizar agora mesmo no voso computador, teríamos que obter o modo de resolución que ten a tarxeta gráfica neste intre.

O modo de resolución nos permite obter información sobre o ancho, alto, frecuencia e número de cores que está a utilizar a tarxeta.

Para obtelo teremos que poñer este código:

  1. package com.plategaxogo2d.angel.desktop;
  2.  
  3. import com.badlogic.gdx.Graphics.DisplayMode;
  4. import com.badlogic.gdx.backends.lwjgl.LwjglApplication;
  5. import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration;
  6. import com.plategaxogo2d.angel.MeuXogo;
  7.  
  8. public class DesktopLauncher {
  9.         public static void main (String[] arg) {
  10.                 LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
  11.                 config.title = "O meu Xogo";
  12.                 DisplayMode displaymode = LwjglApplicationConfiguration
  13.                                 .getDesktopDisplayMode();
  14.                 config.width = displaymode.width;
  15.                 config.height = displaymode.height;
  16.                 config.fullscreen = true;
  17.                 new LwjglApplication(new MeuXogo(), config);
  18.         }
  19. }
  • Engidida a liña 12 e modificadas as liñas 14 e 15.



Nota:: cando se engada unha nova clase ao código temos que importala. Unha forma de facelo é premendo as combinacións de teclas Control+Enter estando enriba da clase temos que importar.

Se temos varias clase diferentes a importar, debemos escoller a clase que estea relacionada co framework LIBGDX.




Grazas o obxecto da clase DisplayMode podemos obter a resolución que agora mesmo estades a utilizar no voso computador. Con cfg.getDisplayModes() poderíamos obter todas as resolucións que acepta a vosa tarxeta gráfica.

Fixarse como podemos enviarlle a resolución máxima e non utilizar a propiedade fullscreen, é dicir, poñer este código:

  1. package com.plategaxogo2d.angel.desktop;
  2.  
  3. import com.badlogic.gdx.Graphics.DisplayMode;
  4. import com.badlogic.gdx.backends.lwjgl.LwjglApplication;
  5. import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration;
  6. import com.plategaxogo2d.angel.MeuXogo;
  7.  
  8. public class DesktopLauncher {
  9.         public static void main (String[] arg) {
  10.                 LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
  11.                 config.title = "O meu Xogo";
  12.                 DisplayMode displaymode = LwjglApplicationConfiguration
  13.                                 .getDesktopDisplayMode();
  14.                 config.width = displaymode.width;
  15.                 config.height = displaymode.height;
  16.  
  17.                 new LwjglApplication(new MeuXogo(), config);
  18.         }
  19. }


Como podemos ver o xogo ocupa toda a pantalla pero mantemos a barra superior co nome do xogo.

Seguimos coas propiedades e métodos:

  • resizable: boolean que indica que queremos que a pantalla do xogo se poda redimensionar.
  • x | y: posición x e y da pantalla do xogo (-1 se queremos que estea centrada, valor por defecto).
  • addIcon(path,tipo): permite engadir unha icona ó xogo que será o que apareza na barra inferior cando minimizamos o xogo.


O proceso é moi sinxelo. Debemos descargar o gráfico que vai ser a nosa icona e levalo ó cartafol assets da versión móbil (vale levalo tamén ás outras versións, xa que son accesos directos á versión móbil). Normalmente será gráfico de tipo bmp e tamaño 32x32 píxeles.


Agora debemos de escribir o seguinte código (lembrade premer a combinación de teclas Control+Enter para importar as clases novas):

  1. package com.plategaxogo2d.angel.desktop;
  2.  
  3. import com.badlogic.gdx.Files.FileType;
  4. import com.badlogic.gdx.backends.lwjgl.LwjglApplication;
  5. import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration;
  6. import com.plategaxogo2d.angel.MeuXogo;
  7.  
  8. public class DesktopLauncher {
  9.         public static void main (String[] arg) {
  10.                 LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
  11.                 config.title = "O meu Xogo";
  12.                 config.width = 800;
  13.                 config.height = 480;
  14.          
  15.                 config.resizable=false;
  16.                 config.addIcon("xogo.png",FileType.Internal);
  17.  
  18.                 new LwjglApplication(new MeuXogo(), config);
  19.         }
  20. }

Agora podedes comprobar como aparece a icona:



TAREFA 2.1 APARTADO A) A FACER: Esta parte está asociada á realización dunha tarefa.




Seguimos coas propiedades e métodos:

  • overrideDensity (a partires da versión 1.1.1): permite simular a densidade da pantalla dun dispositivo móbil.

Podemos consultar neste enlace as diferentes densidades de pantalla. Teredes que buscar a Tabla 1 que ten de título: Table 1. Configuration qualifiers that allow you to provide special resources for different screen configurations. Así temos, por exemplo, que a densidade hdpi equivale a 240 puntos por pulgada.

Esta propiedade vai vir moi ben para probar os xogos como se fosen dispositivos móbiles. Así, se quero emular un dispositivo móbil de 3,7 de 800x480 pixeles cunha densidade de 252 dpi (dot per inch:puntos por pulgada) poñería:

  1.                 config.width=800;
  2.                 config.height=480;
  3.                 config.overrideDensity=240;

Podemos ver un exemplo de uso:

Versión Móbil

No caso da versión Móbil usa a clase AndroidLauncher cun método onCreate.

  1. package com.plategaxogo2d.angel.android;
  2.  
  3. import android.os.Bundle;
  4.  
  5. import com.badlogic.gdx.backends.android.AndroidApplication;
  6. import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration;
  7. import com.plategaxogo2d.angel.MeuXogo;
  8.  
  9. public class AndroidLauncher extends AndroidApplication {
  10.         @Override
  11.         protected void onCreate (Bundle savedInstanceState) {
  12.                 super.onCreate(savedInstanceState);
  13.                 AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
  14.                 initialize(new MeuXogo(), config);
  15.         }
  16. }

Nota: No voso proxecto podedes ter un nome de paquete (package) diferente. Tede coidado cando copiedes o código e mantede o voso nome de paquete.


O que fai dito método é preparar un obxecto da clase AndroidApplicationConfiguration no que podemos indicar que hardware imos usar no noso dispositivo.

O código que lanza a aplicación é diferente da versión Desktop xa que o que estamos a desenvolver é unha aplicación Android (a clase deriva de AndroidApplication e se inicializa no método onCreate) pero os conceptos son os mesmos: creamos un obxecto coa configuración a utilizar e lanzamos un obxecto da clase MeuXogo con dita configuración.

Algúns dos parámetros que podemos modificar neste arquivo son:

  • useAccelerometer: booleano que indica se se vai facer uso do acelerómetro do dispositivo móbil.
  • useCompass: booleano que indica se se vai facer uso do compás.
  • useWakelock: necesario para que o S.O. Android non pase ó estado de 'durmido' cando non recibe ningunha sinal por parte do xogo.

A propiedade wakelock debe estar sempre a true e as outras dúas dependerá se imos a usar ou non esas funcionalidades no noso xogo.

O código quedaría así:

  1. package com.plategaxogo2d.angel.android;
  2.  
  3. import android.os.Bundle;
  4.  
  5. import com.badlogic.gdx.backends.android.AndroidApplication;
  6. import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration;
  7. import com.plategaxogo2d.angel.MeuXogo;
  8.  
  9. public class AndroidLauncher extends AndroidApplication {
  10.         @Override
  11.         protected void onCreate (Bundle savedInstanceState) {
  12.                 super.onCreate(savedInstanceState);
  13.                 AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
  14.  
  15.                 config.useAccelerometer=false;
  16.                 config.useCompass=false;
  17.                 config.useWakelock=true;
  18.                
  19.             initialize(new MeuXogo(), config);
  20.         }
  21. }

Nota: Engadidas liñas 15-17.

Facer que o dispositivo Android non entre en estado 'durmido' leva consigo solicitar ó sistema operativo permiso para facer iso. Cando instalamos unha aplicación móbil, antes de facer dita instalación, se nos amosa a lista de 'permisos' que solicita dita aplicación para poder ser executada.

Para indicarlle ó S.O. que a aplicación vai usar dito permiso será necesario modificar o arquivo AndroidManifiest.xml que se atopa no raíz do cartafol Android.

  • Engadimos o permiso correspondente: <uses-permission android:name="android.permission.wake_lock"></uses-permission>


No caso das outras dúas opcións (acelerómetro e compás) non é necesario engadir un permiso para facer uso do hardware do dispositivo, pero podemos indicar ó usuario que o xogo vai facer uso deles e incluso, se poñemos o xogo no Market, podemos facer que non poida ser instalado se non se ten dito hardware.
Escribimos en Name o hardware a usar
  • <uses-feature android:name="android.hardware.sensor.accelerometer" android:required="true"></uses-feature>
  • <uses-feature android:name="android.hardware.sensor.compass" android:required="true"></uses-feature>


  • Se escollemos a opción 'required=true' indicamos que é necesario dito hardware para que o xogo funcione.


AVISO: Os alumnos que dispoñan de dispositivo móbil que engadan o uso do acelerómetro no AndroidManifiest.xml e modifiquen o código da clase AndroidLauncher.java indicando que se vai facer uso de dito hardware.


Se botamos unha ollada máis detallada o arquivo de AndroidManifiest.xml podemos observar que na liña 19 a ferramenta de xeración de proxectos indica que o xogo vai visualizarse en 'apaisado'. Se queremos que sexa en vertical teremos que sustituír landscape por portrait.

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3.     package="com.plategaxogo2d.angel.android"
  4.     android:versionCode="1"
  5.     android:versionName="1.0" >
  6.  
  7.     <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="19" />
  8.     <uses-permission android:name="android.permission.WAKE_LOCK"/>
  9.     <uses-feature android:required="true" android:name="android.hardware.sensor.accelerometer"/>
  10.  
  11.     <application
  12.         android:allowBackup="true"
  13.         android:icon="@drawable/ic_launcher"
  14.         android:label="@string/app_name"
  15.         android:theme="@style/GdxTheme" >
  16.         <activity
  17.             android:name="com.plategaxogo2d.angel.android.AndroidLauncher"
  18.             android:label="@string/app_name"
  19.             android:screenOrientation="landscape"
  20.             android:configChanges="keyboard|keyboardHidden|orientation|screenSize">
  21.             <intent-filter>
  22.                 <action android:name="android.intent.action.MAIN" />
  23.                 <category android:name="android.intent.category.LAUNCHER" />
  24.             </intent-filter>
  25.         </activity>
  26.     </application>
  27.  
  28. </manifest>


No mesmo arquivo (androidmanifiest.xml) podemos ver como se fai referencia a icona que vai ter o xogo así como o nome que vai ter o mesmo cando se instale nun dispositivo móbil.

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3.     package="com.plategaxogo2d.angel.android"
  4.     android:versionCode="1"
  5.     android:versionName="1.0" >
  6.  
  7.     <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="19" />
  8.     <uses-permission android:name="android.permission.WAKE_LOCK"/>
  9.     <uses-feature android:required="true" android:name="android.hardware.sensor.accelerometer"/>
  10.  
  11.     <application
  12.         android:allowBackup="true"
  13.         android:icon="@drawable/ic_launcher"
  14.         android:label="@string/app_name"
  15.         android:theme="@style/GdxTheme" >
  16.         <activity
  17.             android:name="com.plategaxogo2d.angel.android.AndroidLauncher"
  18.             android:label="@string/app_name"
  19.             android:screenOrientation="landscape"
  20.             android:configChanges="keyboard|keyboardHidden|orientation|screenSize">
  21.             <intent-filter>
  22.                 <action android:name="android.intent.action.MAIN" />
  23.                 <category android:name="android.intent.category.LAUNCHER" />
  24.             </intent-filter>
  25.         </activity>
  26.     </application>
  27.  
  28. </manifest>
  • android:icon="@drawable/ic_launcher": atópase no cartafol /res/drawable-xxxx. En función da resolución do dispositivo collerá o da carpeta correspondente.
  • android:label="@string/app_name": fai referencia a un dato gardado no arquivo /res/values/strings.xml. Se premedes sobreo arquivo deberedes cambiar o value para darlle un novo nome ó xogo.



TAREFA 2.1 APARTADO B) A FACER: Esta parte está asociada á realización dunha tarefa.


Versión HTML

A clase que se inicio se atopa no paquete client do voso proxecto e o nome da clase é HTMLLauncher.

LIBGDX instalacion 82.jpg

Podemos examinar o código:

  1. package com.plategaxogo2d.angel.client;
  2.  
  3. import com.badlogic.gdx.ApplicationListener;
  4. import com.badlogic.gdx.backends.gwt.GwtApplication;
  5. import com.badlogic.gdx.backends.gwt.GwtApplicationConfiguration;
  6. import com.plategaxogo2d.angel.MeuXogo;
  7.  
  8. public class HtmlLauncher extends GwtApplication {
  9.  
  10.         @Override
  11.         public GwtApplicationConfiguration getConfig () {
  12.                 return new GwtApplicationConfiguration(480, 320);
  13.         }
  14.  
  15.         @Override
  16.         public ApplicationListener getApplicationListener () {
  17.                 return new MeuXogo();
  18.         }
  19. }

Podedes observar como na liña 17 se pasa o control á clase común MeuXogo...




-- Ángel D. Fernández González -- (2015).