Primeros pasos con libgdx

Instalación o configuración

LibGDX tiene una configuración bastante simple, con la ayuda de un programa Java simple. Puede encontrar la descarga aquí. Cuando inicie la aplicación, se verá así:Ejemplo de generador de proyectos LibGDX
Nota: esta captura de pantalla se tomó en Linux y muestra una ruta que difiere de una instalación de Windows. Sin embargo, el formulario es el mismo en cualquier sistema operativo compatible con esta aplicación de configuración

Cuadros de entrada

En el cuadro de entrada “Nombre”, está el nombre del juego para tu proyecto. El cuadro de entrada “Paquete” es el paquete para su clase principal. El cuadro de entrada “Clase de juego” es la clase principal que se llama cuando se ejecuta el juego. El cuadro de entrada “Destino” es el destino donde se generará su proyecto. El cuadro de entrada “Andriod SDK”, la ruta a donde está su Android SDK. Este cuadro de entrada es completamente opcional, por lo que si no desea implementar su aplicación en Android, no tiene que preocuparse por esto.


Subproyectos

Los subproyectos son solo las plataformas en las que se implementarán. Esa parte es bastante autoexplicativa. Si no desea implementarlo en HTML, por ejemplo, simplemente desmarque la casilla de verificación.


Extensiones

Las extensiones son las extensiones oficiales de LibGDX. Aquí hay una tabla que te dice qué es cada uno:

Nombre de extensión Descripción
Bala Bullet es una biblioteca de dinámica de cuerpos rígidos y detección de colisiones en 3D.
tipo libre Freetype le permite usar fuentes .ttf, en lugar de tener que usar fuentes Bitmap
Herramientas Le permite implementar la salida de las herramientas LibGDX.
Controladores Le permite implementar controladores como los controladores XBox 360.
caja2d Una biblioteca de física para juegos 2d.
Box2dluces Permite una manera fácil de agregar luces suaves y dinámicas a un juego de física.
Ashley Un marco de entidad diminuta
Ay Un marco de inteligencia artificial.

Puede agregar extensiones de terceros, pero sus detalles o nombres no se mostrarán aquí.


Avanzado

En la sección Avanzado, puede establecer varias configuraciones y generar archivos de proyecto adicionales para Eclipse e IDEA IDE.

Nombre del ajuste Descripción
URL espejo de Maven Reemplaza Maven Central con la URL de Maven provista
IDEA Genera archivos de proyecto Intellij IDEA
eclipse Genera archivos de proyecto de Eclipse
Modo fuera de línea No fuerce las dependencias de descarga

Generación

Una vez que tenga todas las configuraciones correctas, puede presionar el botón “Generar”. Esto puede demorar un par de segundos, pero generará los archivos básicos y Gradle necesarios para su proyecto. Una vez que haya terminado con eso, es hora de importar el proyecto a su IDE.

LibGDX Hola mundo

Lo esencial

Los proyectos generados contienen una aplicación básica similar a Hello World ya implementada.

El proyecto principal es el proyecto principal, que contiene todo el código independiente de la plataforma. Esto es obligatorio, pero según la configuración de generación, puede tener varios proyectos más para cada plataforma que haya seleccionado.

El ejemplo

Abra com.mygdx.game.MyGdxGame.java en el proyecto core. Verá el siguiente código:

public class MyGdxGame extends ApplicationAdapter {
    SpriteBatch batch;
    Texture img;
    
    @Override
    public void create () {
        batch = new SpriteBatch();
        img = new Texture("badlogic.jpg");
    }

    @Override
    public void render () {
        Gdx.gl.glClearColor(1, 0, 0, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
        batch.begin();
        batch.draw(img, 0, 0);
        batch.end();
    }
    
    @Override
    public void dispose () {
        batch.dispose();
        img.dispose();
    }
} 

Aunque este es su proyecto principal, no lo ejecutará directamente, siempre debe ejecutar el iniciador específico de la plataforma, para el escritorio se llama com.mygdx.game.desktop.DesktopLauncher.java en el proyecto desktop.

public class DesktopLauncher {
    public static void main (String[] arg) {
        LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
        new LwjglApplication(new MyGdxGame(), config);
    }
} 

En esta clase puede establecer configuraciones específicas de la plataforma.


Ejecutando tu juego

Eclipse e Intellij usan dos métodos diferentes para ejecutar su proyecto. Encuentre el IDE que está usando a continuación.

Ejecutando usando Eclipse

Con eclipse, puede ejecutar su aplicación ejecutando esta clase como una aplicación Java (haga clic con el botón derecho en el proyecto -> Ejecutar como -> Aplicación Java). Verá la siguiente ventana:

Ejecutando Hello world en el escritorio

Ejecutando usando Intellij Idea

En Intellij, deberá realizar una configuración de ejecución. Para ello, debes hacer clic en el botón de la parte superior derecha que parece una zanahoria hacia abajo:

Zanahoria

Luego haga clic en el botón “Editar configuraciones…”. Se le presentará una pantalla con todas sus configuraciones de ejecución actuales. Haga clic en el “+” en la parte superior izquierda de esa ventana y seleccione la opción “Aplicación”. Desde allí, seleccione el archivo “DesktopLauncher” para la opción “Clase principal”, configure “Usar classpath del módulo” en la opción principal y configure “Directorio de trabajo” en la carpeta de activos en su carpeta principal. El producto final debería verse así:

Ejecutar ejemplo de configuración

Una vez que haya hecho eso, puede seleccionar un nombre para su configuración de ejecución y hacer clic en “Aplicar”, luego en “Aceptar”. Una vez que haya terminado con eso, puede hacer clic en el icono de ejecución verde en la parte superior derecha:

Icono de ejecutar

¿Qué está pasando en la clase MyGdxGame?

Primero se llama al método create, que inicializará el lote que se dibuja en la pantalla. Luego, el método carga el archivo badlogic.jpg en la memoria.

Después de esto, se llama repetidamente al método render hasta que se detiene la aplicación. Este método restablecerá el color de fondo a rojo y dibujará la imagen en la pantalla. Como puede ver, siempre tiene que comenzar y finalizar el dibujo por lotes. Por último, cuando la aplicación está a punto de detenerse, se llama al método dispose, que liberará el espacio de memoria utilizado por la textura y el lote.

(Es bueno saber que la eliminación también puede ocurrir en tiempo de ejecución en otras plataformas, por ejemplo, Android, porque Android puede liberar espacio en la memoria cuando las aplicaciones están en segundo plano, pero este es un tema más avanzado)



Observación: Si obtiene un error al ejecutar como se muestra a continuación, consulte esta pregunta para obtener una respuesta.

Archivo no encontrado: badlogic.jpg (Interno)

Descripción general de LibGDX

LibGDX es una biblioteca de desarrollo de juegos gratuita y de código abierto desarrollada en Java. Sus objetivos son permitir a los usuarios desarrollar juegos multiplataforma que se ejecuten en navegadores de escritorio, Android, iOS y web. Escriba el código una vez, impleméntelo en cualquiera de las principales plataformas.

Agregar soporte para código específico de la plataforma

LibGDX está diseñado de manera que puede escribir el mismo código e implementarlo en varias plataformas diferentes. Sin embargo, hay momentos en los que desea obtener acceso al código específico de la plataforma. Por ejemplo, si tiene tablas de clasificación y logros en su juego, es posible que desee utilizar herramientas específicas de la plataforma (como Google Play Games) además de almacenarlas localmente. O desea utilizar una base de datos, o algo completamente diferente.

No puede agregar este tipo de código en el módulo principal. Así que el primer paso es crear una interfaz. Créalo en el módulo principal. Esta primera es una utilidad para gestionar otras interfaces:

public interface PlatformWrapper{
    //here you can also add other things you need that are platform specific.
    //If you want to create your own file saver for an instance, a JSON based database,
    //achievements, leaderboards, in app purchases and anything else you need platform specific code for.
    SQLWrapper getSQLSaver();//This one will be used in this example
    AchievementWrapper getAchievementHandler();//this line is here as an example
}

Luego, necesitamos crear una segunda interfaz, SQLWrapper. Este también va en el módulo principal.

public interface SQLWrapper{
    void init(String DATABASE);
    void saveSerializable(int id, Object o);
    Object loadSerializable(int id, Object o);
    void saveString(int id, String s);
    //.... and other methods you need here. This is something that varies
    //with usage. You may not need the serializable methods, but really need a custom method for saving 
    //an entire game world. This part is entirely up to you to find what methods you need
   
    //With these three methods, always assume it is the active database in question. Unless 
    //otherwise specified, it most likely is
    String getActiveDatabase();
    void deleteDatabase();
    void deleteTable(String table);//delete the active table
}

Ahora, debe ingresar a cada proyecto y crear una clase para implementar PlatformWrapper y otra para implementar SQLWrapper. En cada proyecto, agrega el código necesario, como instancias, constructores, etc.

Después de anular todas las interfaces que creó, asegúrese de que todas tengan una instancia en la clase que implemente PlatformWrapper (y que haya un getter). Finalmente, cambia el constructor en la clase principal. La clase principal es la clase a la que hace referencia desde el lanzador. Extiende ApplicationAdapter, implementa ApplicationListener o extiende Game. Edite el constructor y agregue PlatformWrapper como argumento. Dentro del envoltorio de la plataforma tiene algunas utilidades (si agregó alguna) además de todos los demás envoltorios (sql, logros o cualquier otra cosa que haya agregado).

Ahora, si todo está configurado correctamente, puede realizar una llamada a PlatformWrapper y obtener cualquiera de las interfaces multiplataforma. Llame a cualquier método y (suponiendo que el código ejecutado sea correcto) verá en cualquier plataforma, hace lo que se supone que debe hacer con el código específico de la plataforma

Gestor de activos

AssetManager es una clase que le ayuda a administrar sus activos.

En primer lugar, debe crear una instancia:

AssetManager am = new AssetManager();

Después de inicializar esto, y antes de renderizar algo, desea obtener los recursos:

am.load("badlogic.jpg", Texture.class);//Texture.class is the class this asset is of. If it is a 
//sound asset, it doesn't go under Texture. if it is a 3D model, it doesn't go under Texture.class
//Which class added depends on the asset you load

//... other loading here ...//

//when finished, call finishLoading:
am.finishLoading();

Ahora, donde quieras obtener badlogic.jpg:

Texture texture = am.get("badlogic.jpg");
//Ready to render! The rendering itself is in the normal way

El uso de AssetManager le permite cargarlos una vez en la memoria de AssetManager y luego obtenerlos tantas veces como desee.

¿Por qué utilizar AssetManager? (del wiki):

AssetManager (código) lo ayuda a cargar y administrar sus activos. Es la forma recomendada de cargar sus activos, debido a los siguientes buenos comportamientos:

  • La carga de la mayoría de los recursos se realiza de forma asincrónica, por lo que puede mostrar una pantalla de carga reactiva mientras se cargan las cosas
  • Los activos se cuentan como referencia. Si dos activos A y B dependen de otro activo C, C no se enajenará hasta que se hayan enajenado A y B. ¡Esto también significa que si carga un activo varias veces, en realidad se compartirá y solo ocupará memoria una vez!
  • Un solo lugar para almacenar todos sus activos.
  • Permite implementar de forma transparente cosas como cachés (ver FileHandleResolver a continuación)

El gráfico de escena 2D

Cuando comienza a usar Java o Android, aprende rápidamente que (0,0) está en la esquina superior izquierda. En LibGDX, sin embargo, (0,0) está por defecto en la esquina inferior izquierda.

Usando una cámara ortográfica, puede hacer que (0, 0) esté en la esquina superior izquierda. Aunque por defecto, (0, 0) está en la esquina inferior izquierda. Esto es algo que es importante saber, ya que también cambia qué esquina de las texturas tienen las coordenadas X e Y.