libgdx Tutorial
Iniziare con libgdx
Ricerca…
Versioni
Installazione o configurazione
LibGDX ha una configurazione abbastanza semplice, con l'aiuto di un semplice programma Java. Puoi trovare il download qui . Quando avvii l'applicazione, sarà simile a questa:
Nota: questo screenshot è stato realizzato su Linux e mostra il percorso che differisce da un'installazione di Windows. Tuttavia, il modulo è lo stesso su qualsiasi sistema operativo compatibile con questa applicazione di configurazione
Caselle di input
Nella casella di inserimento "Nome", è il nome del gioco per il tuo progetto. La casella di inserimento "Pacchetto" è il pacchetto della tua classe principale. La casella di input "Game Class" è la classe principale che viene chiamata quando si esegue il gioco. La casella di input "Destinazione" è la destinazione in cui verrà generato il progetto. La casella di input "Andriod SDK", il percorso dove si trova il tuo sdk Android. Questa casella di input è completamente opzionale, quindi se non vuoi distribuire la tua applicazione su Android, non devi preoccuparti di questo.
Sottoprogetti
I progetti secondari sono solo le piattaforme a cui devono essere distribuiti. Quella parte è piuttosto auto-esplicativa. Se non vuoi distribuirlo in HTML, per esempio, semplicemente deseleziona la casella di controllo.
estensioni
Le estensioni sono le estensioni libgDX ufficiali. Ecco una tabella che ti dice che ognuno è:
Nome dell'estensione | Descrizione |
---|---|
proiettile | Bullet è una libreria per la rilevazione di collisioni 3D e la dinamica dei corpi rigidi. |
Freetype | Freetype ti permette di usare i caratteri .ttf, invece di dover usare i font Bitmap |
Utensili | Consente di implementare l'output degli strumenti LibGDX. |
Controller | Ti permette di implementare controller come i controller XBox 360. |
box2d | Una libreria di fisica per giochi 2D. |
Box2dlights | Consente un modo semplice di aggiungere luci dinamiche morbide a un gioco di fisica. |
Ashley | Un piccolo quadro di entità |
Ai | Una struttura di intelligenza artificiale. |
Puoi aggiungere estensioni di terze parti, ma i loro dettagli o nomi non verranno mostrati qui.
Avanzate
Nella sezione Avanzate è possibile impostare diverse impostazioni e generare file di progetto aggiuntivi per Eclipse e IDE IDE.
Impostazione del nome | Descrizione |
---|---|
Maven Mirror URL | Sostituisce Maven Central con l'URL Maven fornito |
IDEA | Genera file di progetto IDEA Intellij |
Eclisse | Genera file di progetto Eclipse |
Modalità offline | Non forzare le dipendenze di download |
Generazione
Una volta che tutte le impostazioni sono corrette, puoi premere il pulsante "Genera". Questo potrebbe richiedere un paio di secondi, ma genererà i file di base e Gradle necessario per il tuo progetto. Una volta terminato, è necessario importare il progetto nel tuo IDE.
LibGDX Hello World
Nozioni di base
I progetti generati contengono un'applicazione di base Hello World già implementata.
Il progetto principale è il progetto principale, che contiene tutto il codice indipendente dalla piattaforma. Questo è obbligatorio, ma in base alle impostazioni della tua generazione puoi avere molti più progetti per ogni piattaforma che hai selezionato.
L'esempio
Apri com.mygdx.game.MyGdxGame.java
nel progetto core
. Vedrai il seguente codice:
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();
}
}
Sebbene questo sia il tuo progetto principale, non lo eseguirai direttamente, devi sempre eseguire il Launcher specifico per piattaforma, per desktop si chiama com.mygdx.game.desktop.DesktopLauncher.java
nel progetto desktop
.
public class DesktopLauncher {
public static void main (String[] arg) {
LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
new LwjglApplication(new MyGdxGame(), config);
}
}
In questa classe puoi impostare le impostazioni specifiche della piattaforma.
Gestisci il tuo gioco
Eclipse e Intellij usano due metodi diversi per eseguire il tuo progetto. Trova l'IDE che usi qui sotto.
Esecuzione con Eclipse
Utilizzando eclipse, è possibile eseguire l'applicazione eseguendo questa classe come applicazione Java (fare clic con il tasto destro del mouse su progetto -> Esegui come -> Applicazione Java). Vedrai la seguente finestra:
Funzionando usando l'idea di Intellij
In Intellij, dovrai eseguire una configurazione di corsa. Per fare ciò, è necessario fare clic sul pulsante in alto a destra che assomiglia a una carota verso il basso:
Quindi fare clic sul pulsante "Modifica configurazioni ...". Ti verrà presentata una schermata di tutte le configurazioni correnti della corsa. Fai clic su "+" in alto a sinistra in quella finestra e seleziona l'opzione "Applicazione". Da lì, selezionare il file "DesktopLauncher" per l'opzione "Main class", impostare "Usa classpath del modulo" sull'opzione core e impostare "Directory di lavoro" nella cartella delle risorse nella cartella principale. Il prodotto finale dovrebbe assomigliare a questo:
Dopo averlo fatto, è possibile selezionare un nome per la configurazione di esecuzione e fare clic su "Applica", quindi su "OK". Una volta terminato, puoi fare clic sull'icona a scorrimento verde in alto a destra:
Cosa sta succedendo nella classe MyGdxGame?
Prima viene chiamato il metodo di create
, che inizializzerà il batch che disegna sullo schermo. Quindi il metodo carica il file badlogic.jpg nella memoria.
Dopo questo il metodo di render
viene chiamato più volte fino a quando l'applicazione non viene arrestata. Questo metodo si reimposta sul colore di sfondo su rosso e disegna l'immagine sullo schermo. Come puoi vedere, devi sempre iniziare e finire il disegno in batch. Infine, quando l'applicazione sta per interrompere il metodo di dispose
, ciò libererà lo spazio di memoria utilizzato dalla trama e dal batch.
(È bene sapere che lo smaltimento può avvenire anche in runtime su altre piattaforme, ad esempio Android, perché Android potrebbe liberare spazio di memoria quando le applicazioni sono in background, ma questo è un argomento più avanzato)
Nota: se si verifica un errore durante l'esecuzione come di seguito, controllare la risposta per questa domanda !
File non trovato: badlogic.jpg (interno)
Panoramica generale di LibGDX
LibGDX è una libreria di sviluppo di giochi open source gratuita sviluppata in Java. Gli obiettivi sono permettere agli utenti di sviluppare giochi multipiattaforma che girano su desktop, Android, iOS e browser web. Scrivi il codice una volta, distribuilo su una delle piattaforme principali.
Aggiunta del supporto per il codice specifico della piattaforma
LibGDX è progettato in modo da poter scrivere lo stesso codice e distribuirlo su diverse piattaforme. Tuttavia, ci sono momenti in cui si desidera ottenere l'accesso al codice specifico della piattaforma. Per un'istanza, se hai classifiche e risultati nel tuo gioco, potresti voler utilizzare strumenti specifici della piattaforma (come Google Play Games) oltre a memorizzarli localmente. O vuoi usare un database, o qualcosa di completamente diverso.
Non è possibile aggiungere questo tipo di codice nel modulo principale. Quindi il primo passo è creare un'interfaccia. Crealo nel modulo principale. Questa prima è un'utilità per gestire altre interfacce:
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
}
Quindi, dobbiamo creare una seconda interfaccia, SQLWrapper. Questo va anche nel modulo principale.
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
}
Ora, è necessario entrare in ogni progetto e creare una classe per implementare PlatformWrapper e una per implementare SQLWrapper. In ogni progetto si aggiunge il codice necessario, come le istanze, i costruttori e così via.
Dopo aver sovrascritto tutte le interfacce che hai creato, assicurati che abbiano tutte un'istanza nella classe che implementa PlatformWrapper (e che c'è un getter). Alla fine, cambi il costruttore nella classe principale. La classe principale è la classe di riferimento dal programma di avvio. Estende ApplicationAdapter, implementa ApplicationListener o estende Game. Modifica il costruttore e aggiungi PlatformWrapper come argomento. All'interno del wrapper della piattaforma hai alcune utility (se ne hai aggiunte) oltre a tutti gli altri wrapper (sql, achievement, o qualsiasi altra cosa aggiunta).
Ora, se tutto è impostato correttamente, è possibile effettuare una chiamata a PlatformWrapper e ottenere una qualsiasi delle interfacce multipiattaforma. Chiama qualsiasi metodo e (assumendo che il codice eseguito sia corretto) vedrai su qualsiasi piattaforma, fa quello che dovrebbe fare con il codice specifico della piattaforma
AssetManager
AssetManager è una classe che ti aiuta a gestire le tue risorse.
Innanzitutto, devi creare un'istanza:
AssetManager am = new AssetManager();
Dopo che questo è stato inizializzato, e prima di eseguire il rendering di qualsiasi cosa, vuoi ottenere le risorse:
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();
Ora, dove hai voglia di ricevere badlogic.jpg
:
Texture texture = am.get("badlogic.jpg");
//Ready to render! The rendering itself is in the normal way
Usando AssetManager puoi caricarli una volta nella memoria di AssetManager, e quindi ottenerli tutte le volte che vuoi.
Perché usare AssetManager? (dal wiki ):
AssetManager (codice) ti aiuta a caricare e gestire le tue risorse. È il modo consigliato per caricare le tue risorse, a causa dei seguenti comportamenti:
- Il caricamento della maggior parte delle risorse viene eseguito in modo asincrono, pertanto è possibile visualizzare una schermata di caricamento reattiva mentre le cose si caricano
- Le risorse sono conteggiate con riferimento. Se due beni A e B dipendono entrambi da un'altra risorsa C, C non sarà smaltita finché A e B non saranno stati eliminati. Ciò significa anche che se carichi una risorsa più volte, sarà effettivamente condivisa e occuperà solo una volta la memoria!
- Un unico luogo in cui archiviare tutte le tue risorse.
- Permette di implementare in modo trasparente cose come cache (vedi FileHandleResolver sotto)
Il grafico della scena 2D
Quando inizi con Java o Android, impari rapidamente che (0,0) si trova nell'angolo in alto a sinistra. In LibGDX, tuttavia, (0,0) è di default nell'angolo in basso a sinistra.
Usando una camera ortogonale, puoi ottenere (0, 0) nell'angolo in alto a sinistra. Anche se di default, (0, 0) si trova nell'angolo in basso a sinistra. Questo è qualcosa che è importante sapere, poiché cambia anche quale angolo delle trame ha le coordinate X e Y.