libgdx Tutorial
Erste Schritte mit libgdx
Suche…
Versionen
Installation oder Setup
LibGDX hat ein recht einfaches Setup mit Hilfe eines einfachen Java-Programms. Den Download finden Sie hier . Wenn Sie die Anwendung starten, sieht es ungefähr so aus:
Hinweis: Dieser Screenshot wurde unter Linux erstellt und zeigt einen Pfad, der sich von einer Windows-Installation unterscheidet. Das Formular ist jedoch auf jedem Betriebssystem identisch, das mit dieser Setupanwendung kompatibel ist
Eingabefelder
Im Eingabefeld "Name" steht der Name des Spiels für Ihr Projekt. Das Eingabefeld "Package" ist das Paket für Ihre Hauptklasse. Das Eingabefeld "Game Class" ist die Hauptklasse, die aufgerufen wird, wenn Ihr Spiel ausgeführt wird. Das Eingabefeld "Destination" ist das Ziel, an dem Ihr Projekt generiert werden soll. Das Eingabefeld "Andriod SDK" gibt an, wo sich Ihr Android-SDK befindet. Dieses Eingabefeld ist vollständig optional. Wenn Sie Ihre Anwendung nicht für Android bereitstellen möchten, müssen Sie sich darüber keine Gedanken machen.
Unterprojekte
Unterprojekte sind nur die Plattformen, auf denen bereitgestellt werden soll. Dieser Teil ist ziemlich selbsterklärend. Wenn Sie es beispielsweise nicht in HTML implementieren möchten, deaktivieren Sie einfach das Kontrollkästchen.
Erweiterungen
Erweiterungen sind die offiziellen LibGDX-Erweiterungen. Hier ist eine Tabelle, die Ihnen sagt, was jeder ist:
Erweiterungsname | Beschreibung |
---|---|
Kugel | Bullet ist eine 3D-Kollisionserkennungs- und Rigid Body Dynamics-Bibliothek. |
Freetyp | Mit Freetype können Sie .ttf-Schriften verwenden, anstatt Bitmap-Schriften verwenden zu müssen |
Werkzeuge | Ermöglicht die Implementierung der Ausgabe von LibGDX-Tools. |
Controller | Ermöglicht die Implementierung von Controllern wie XBox 360-Controllern. |
Box2d | Eine Physikbibliothek für 2D-Spiele. |
Box2dlights | Ermöglicht eine einfache Möglichkeit, einem Physikspiel weiche dynamische Lichter hinzuzufügen. |
Ashley | Ein kleines Entity-Framework |
Ai | Ein Rahmen für künstliche Intelligenz. |
Sie können Erweiterungen von Drittanbietern hinzufügen, deren Details oder Namen werden hier jedoch nicht angezeigt.
Erweitert
Im Abschnitt "Erweitert" können Sie verschiedene Einstellungen vornehmen und zusätzliche Projektdateien für Eclipse und IDEA IDE generieren.
Name der Einstellung | Beschreibung |
---|---|
Maven Mirror URL | Ersetzt Maven Central durch die angegebene Maven-URL |
IDEE | Erzeugt Intellij IDEA-Projektdateien |
Finsternis | Erzeugt Eclipse-Projektdateien |
Offline-Modus | Erzwinge keine Download-Abhängigkeiten |
Generation
Wenn Sie alle Ihre Einstellungen richtig vorgenommen haben, können Sie die Schaltfläche "Generieren" drücken. Dies kann einige Sekunden dauern, aber es werden die grundlegenden Dateien und Gradle generiert, die für Ihr Projekt benötigt werden. Wenn Sie damit fertig sind, können Sie das Projekt in Ihre IDE importieren.
LibGDX Hallo Welt
Grundlagen
Die generierten Projekte enthalten eine grundlegende, bereits implementierte Hello World-ähnliche Anwendung.
Das Hauptprojekt ist das Kernprojekt, das den gesamten plattformunabhängigen Code enthält. Dies ist obligatorisch, aber basierend auf Ihren Generierungseinstellungen können Sie für jede ausgewählte Plattform mehrere Projekte einrichten.
Das Beispiel
Öffnen Sie com.mygdx.game.MyGdxGame.java
im core
. Sie sehen den folgenden Code:
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();
}
}
Obwohl dies Ihr Hauptprojekt ist, werden Sie es nicht direkt ausführen. Sie müssen immer das plattformspezifische Launcher ausführen. Für Desktop heißt es com.mygdx.game.desktop.DesktopLauncher.java
im desktop
Projekt.
public class DesktopLauncher {
public static void main (String[] arg) {
LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
new LwjglApplication(new MyGdxGame(), config);
}
}
In dieser Klasse können Sie plattformspezifische Einstellungen festlegen.
Laufen Sie Ihr Spiel
Eclipse und Intellij verwenden zwei verschiedene Methoden, um Ihr Projekt auszuführen. Die IDE finden Sie unten.
Laufen mit Eclipse
Mit eclipse können Sie Ihre Anwendung ausführen, indem Sie diese Klasse als Java-Anwendung ausführen (Rechtsklick auf Projekt -> Ausführen als -> Java-Anwendung). Sie sehen folgendes Fenster:
Laufen mit Intellij Idea
In Intellij müssen Sie eine Laufkonfiguration vornehmen. Dazu musst du oben rechts auf die Schaltfläche klicken, die wie eine nach unten gerichtete Karotte aussieht:
Klicken Sie dann auf die Schaltfläche "Konfigurationen bearbeiten ...". Es wird ein Bildschirm mit allen aktuellen Laufkonfigurationen angezeigt. Klicken Sie oben links in diesem Fenster auf das "+" und wählen Sie die Option "Anwendung". Wählen Sie von dort aus die Datei "DesktopLauncher" für die Option "Hauptklasse" aus, setzen Sie als Hauptoption "Klassenpfad des Moduls verwenden" und "Arbeitsverzeichnis" den Ordner "Assets" in Ihrem Kernordner. Das Endprodukt sollte ungefähr so aussehen:
Sobald Sie dies getan haben, können Sie einen Namen für Ihre Laufkonfiguration auswählen und auf "Übernehmen" und dann auf "OK" klicken. Sobald Sie damit fertig sind, können Sie oben rechts auf das grüne Run-Symbol klicken:
Was passiert in der MyGdxGame-Klasse?
Zuerst wird die create
aufgerufen, die den Stapel, der auf dem Bildschirm angezeigt wird, initialisiert. Dann lädt die Methode die badlogic.jpg in den Speicher.
Danach wird die render
wiederholt aufgerufen, bis die Anwendung gestoppt wird. Diese Methode setzt die Hintergrundfarbe auf Rot zurück und zeichnet das Bild auf dem Bildschirm. Wie Sie sehen können, müssen Sie die Stapelzeichnung immer beginnen und beenden. Wenn die Anwendung kurz vor dem Stopp steht, wird die dispose
Methode aufgerufen, die den von der Textur und dem Stapel belegten Speicherplatz freigibt.
(Es ist gut zu wissen, dass die Entsorgung auch zur Laufzeit auf anderen Plattformen, z. B. Android, erfolgen kann, da Android möglicherweise Speicherplatz freigibt, wenn Anwendungen im Hintergrund ausgeführt werden. Dies ist jedoch ein fortgeschritteneres Thema.)
Anmerkung: Wenn Sie beim Ausführen wie unten beschrieben einen Fehler erhalten, überprüfen Sie diese Frage zur Antwort!
Datei nicht gefunden: badlogic.jpg (intern)
LibGDX Allgemeiner Überblick
LibGDX ist eine kostenlose, in Java entwickelte Open-Source-Bibliothek zur Entwicklung von Spielen. Ziel ist es, Benutzern zu ermöglichen, plattformübergreifende Spiele zu entwickeln, die auf Desktop-, Android-, iOS- und Webbrowsern laufen. Schreiben Sie einmal Code, stellen Sie ihn auf einer der wichtigsten Plattformen bereit.
Unterstützung für plattformspezifischen Code hinzufügen
LibGDX ist so konzipiert, dass Sie denselben Code schreiben und auf verschiedenen Plattformen bereitstellen können. Es gibt jedoch Zeiten, in denen Sie Zugriff auf plattformspezifischen Code erhalten möchten. Wenn Sie beispielsweise Leaderboards und Erfolge in Ihrem Spiel haben, möchten Sie möglicherweise plattformspezifische Tools (wie Google Play Games) zusätzlich zum lokalen Speichern verwenden. Oder Sie möchten eine Datenbank oder etwas völlig anderes verwenden.
Sie können diese Art von Code nicht zum Kernmodul hinzufügen. Der erste Schritt ist also die Erstellung einer Schnittstelle. Erstellen Sie es im Kernmodul. Diese erste ist ein Dienstprogramm zum Verwalten anderer Schnittstellen:
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
}
Dann müssen wir eine zweite Schnittstelle erstellen, den SQLWrapper. Diese geht auch in das Kernmodul.
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
}
Jetzt müssen Sie in jedes Projekt einsteigen und eine Klasse erstellen, um PlatformWrapper zu implementieren, und eine, um SQLWrapper zu implementieren. In jedem Projekt fügen Sie den erforderlichen Code wie Instanzen, Konstruktoren usw. hinzu.
Nachdem Sie alle von Ihnen erstellten Schnittstellen überschrieben haben, stellen Sie sicher, dass alle über eine Instanz in der Klasse verfügen, die PlatformWrapper implementiert (und ein Getter vorhanden ist). Schließlich ändern Sie den Konstruktor in der Hauptklasse. Die Hauptklasse ist die Klasse, auf die Sie vom Startprogramm aus referenzieren. Es erweitert entweder ApplicationAdapter, implementiert ApplicationListener oder erweitert Game. Bearbeiten Sie den Konstruktor und fügen Sie PlatformWrapper als Argument hinzu. Innerhalb des Plattform-Wrappers gibt es zusätzlich zu allen anderen Wrappern (SQL, Erfolge oder andere hinzugefügte Tools) einige Hilfsprogramme (falls Sie welche hinzugefügt haben).
Wenn nun alles korrekt eingerichtet ist, können Sie den PlatformWrapper anrufen und eine der plattformübergreifenden Schnittstellen aufrufen. Rufen Sie eine beliebige Methode auf, und (vorausgesetzt, der ausgeführte Code ist korrekt), werden Sie auf jeder Plattform angezeigt. Er tut, was er mit plattformspezifischem Code tun soll
Vermögensverwalter
Der AssetManager ist eine Klasse, mit der Sie Ihre Assets verwalten können.
Zunächst müssen Sie eine Instanz erstellen:
AssetManager am = new AssetManager();
Nachdem dies initialisiert wurde und Sie etwas rendern möchten, möchten Sie die Ressourcen abrufen:
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();
Nun, wo immer Sie Lust haben, badlogic.jpg
bekommen:
Texture texture = am.get("badlogic.jpg");
//Ready to render! The rendering itself is in the normal way
Wenn Sie AssetManager verwenden, können Sie sie einmal in den Speicher des AssetManagers laden und dann beliebig oft abrufen.
Warum AssetManager verwenden? (aus dem Wiki ):
AssetManager (Code) unterstützt Sie beim Laden und Verwalten Ihrer Assets. Es ist die empfohlene Methode, um Ihre Assets aufgrund der folgenden Verhaltensweisen zu laden:
- Das Laden der meisten Ressourcen erfolgt asynchron, sodass Sie während des Ladevorgangs einen reaktiven Ladebildschirm anzeigen können
- Assets werden nach Referenz gezählt. Wenn zwei Vermögenswerte A und B beide von einem anderen Vermögen C abhängen, wird C erst dann entsorgt, wenn A und B verkauft wurden. Dies bedeutet auch, dass wenn Sie ein Asset mehrmals laden, es tatsächlich geteilt wird und nur einmal Speicher beansprucht!
- Ein einziger Ort, um alle Ihre Vermögenswerte zu speichern.
- Ermöglicht die transparente Implementierung von Caches (siehe FileHandleResolver unten)
Das 2D-Szenendiagramm
Wenn Sie mit Java oder Android beginnen, erfahren Sie schnell, dass (0,0) in der oberen linken Ecke angezeigt wird. In LibGDX steht jedoch (0,0) standardmäßig in der unteren linken Ecke.
Mit einer orthographischen Kamera können Sie (0, 0) in der oberen linken Ecke anzeigen. Standardmäßig befindet sich (0, 0) in der unteren linken Ecke. Dies ist etwas, das zu wissen wichtig ist, da es auch ändert, welche Ecke der Texturen die X- und Y-Koordinaten hat.