libgdx Zelfstudie
Aan de slag met libgdx
Zoeken…
versies
Installatie of instellingen
LibGDX heeft een vrij eenvoudige installatie, met behulp van een eenvoudig Java-programma. Je kunt de download hier vinden . Wanneer u de toepassing start, ziet deze er ongeveer zo uit:
Opmerking: deze schermafbeelding is gemaakt op Linux en toont een pad dat verschilt van een Windows-installatie. Het formulier is echter hetzelfde op elk besturingssysteem dat compatibel is met deze installatietoepassing
Invoervakken
In het invoervak "Naam" staat de naam van de game voor uw project. Het invoervak "Pakket" is het pakket voor uw hoofdklasse. Het invoervak "Game Class" is de hoofdklasse die wordt opgeroepen wanneer uw game wordt uitgevoerd. Het invoervak "Bestemming" is de bestemming waarnaar uw project zal worden gegenereerd. Het invoervak "Andriod SDK", het pad naar waar uw Android SDK is. Dit invoervak is volledig optioneel, dus als u uw toepassing niet op Android wilt implementeren, hoeft u zich hier geen zorgen over te maken.
Subprojecten
Subprojecten zijn slechts de platforms waarop moet worden ingezet. Dat deel is vrij duidelijk. Als u het bijvoorbeeld niet in HTML wilt implementeren, schakelt u het selectievakje gewoon uit.
uitbreidingen
Extensies zijn de officiële LibGDX-extensies. Hier is een tabel die u vertelt wat elk is:
Naam extensie | Beschrijving |
---|---|
Kogel | Bullet is een 3D Collision Detection en Rigid Body Dynamics Library. |
Freetype | Met Freetype kunt u .ttf-lettertypen gebruiken in plaats van Bitmap-lettertypen te gebruiken |
Gereedschap | Hiermee kunt u de uitvoer van LibGDX-tools implementeren. |
Controllers | Hiermee kunt u controllers zoals XBox 360-controllers implementeren. |
box2d | Een fysica-bibliotheek voor 2D-spellen. |
Box2dlights | Biedt een gemakkelijke manier om zachte dynamische lichten toe te voegen aan een physics-spel. |
Ashley | Een klein entiteitskader |
Ai | Een kunstmatige intelligentie kader. |
U kunt extensies van derden toevoegen, maar hun details of namen worden hier niet weergegeven.
Geavanceerd
In het gedeelte Geavanceerd kunt u verschillende instellingen instellen en extra projectbestanden genereren voor Eclipse en IDEA IDE.
Naam instellen | Beschrijving |
---|---|
Maven Mirror URL | Vervangt Maven Central door de opgegeven Maven-URL |
IDEE | Genereert Intellij IDEA-projectbestanden |
Verduistering | Genereert Eclipse-projectbestanden |
Offline modus | Forceer downloadafhankelijkheden niet |
Generatie
Nadat u al uw instellingen correct hebt ingesteld, kunt u op de knop "Genereren" drukken. Dit kan enkele seconden duren, maar het genereert de basisbestanden en Gradle die nodig zijn voor uw project. Als je daarmee klaar bent, is het tijd om het project naar je IDE te importeren.
LibGDX Hallo wereld
Basics
De gegenereerde projecten bevatten een reeds geïmplementeerde basis Hello World-achtige applicatie.
Het hoofdproject is het kernproject, dat alle platformonafhankelijke code bevat. Dit is verplicht, maar op basis van uw generatie-instellingen kunt u meerdere projecten hebben voor elk platform dat u hebt geselecteerd.
Het voorbeeld
Open com.mygdx.game.MyGdxGame.java
in de core
project. U ziet de volgende 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();
}
}
Hoewel dit uw hoofdproject is, zult u het niet rechtstreeks uitvoeren, u moet altijd de platformspecifieke Launcher uitvoeren, voor desktop wordt dit com.mygdx.game.desktop.DesktopLauncher.java
in het desktop
.
public class DesktopLauncher {
public static void main (String[] arg) {
LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
new LwjglApplication(new MyGdxGame(), config);
}
}
In deze klasse kunt u platformspecifieke instellingen instellen.
Je spel draaien
Eclipse en Intellij gebruiken twee verschillende methoden om uw project uit te voeren. Vind hieronder de IDE die u gebruikt.
Hardlopen met Eclipse
Met eclipse kunt u uw toepassing uitvoeren door deze klasse uit te voeren als een Java-toepassing (klik met de rechtermuisknop op project -> Uitvoeren als -> Java-toepassing). U ziet het volgende venster:
Hardlopen met behulp van Intellij Idea
In Intellij moet u een runconfiguratie maken. Om dit te doen, moet je op de knop rechtsboven klikken die eruit ziet als een neerwaartse wortel:
Klik vervolgens op de knop "Configuraties bewerken ...". U krijgt een scherm te zien met al uw huidige runconfiguraties. Klik op de "+" linksboven in dat venster en selecteer de optie "Toepassing". Selecteer van daaruit het bestand "DesktopLauncher" voor de optie "Hoofdklasse", stel het "Classpath-module gebruiken" in op de kernoptie en stel "Werkmap" in op de map met activa in uw kernmap. Het eindproduct zou er ongeveer zo uit moeten zien:
Nadat u dat hebt gedaan, kunt u een naam voor uw runconfiguratie selecteren en op "Toepassen" en vervolgens op "OK" klikken. Als je daarmee klaar bent, klik je rechtsboven op het groene pictogram Uitvoeren:
Wat gebeurt er in de klasse MyGdxGame?
Eerst wordt de create
methode aangeroepen, die de batch die naar het scherm tekent initialiseert. Vervolgens laadt de methode badlogic.jpg in het geheugen.
Hierna wordt de render
methode herhaaldelijk aangeroepen totdat de toepassing wordt gestopt. Deze methode wordt teruggezet naar de achtergrondkleur naar rood en tekent de afbeelding op het scherm. Zoals je kunt zien, moet je de batchtekening altijd beginnen en eindigen. Ten slotte wordt de dispose
aangeroepen wanneer de toepassing op het punt staat te stoppen, waardoor de geheugenruimte wordt vrijgemaakt die wordt gebruikt door de textuur en de batch.
(Het is goed om te weten dat verwijdering ook tijdens runtime op andere platforms kan gebeuren, bijvoorbeeld Android, omdat Android geheugenruimte kan vrijmaken wanneer applicaties op de achtergrond staan, maar dit is een geavanceerder onderwerp)
Opmerking: als u een foutmelding krijgt zoals hieronder, controleer dan deze vraag voor antwoord!
Bestand niet gevonden: badlogic.jpg (intern)
LibGDX Algemeen overzicht
LibGDX is een gratis, open-source game-ontwikkelingsbibliotheek ontwikkeld in Java. Het doel is om gebruikers platformonafhankelijke games te laten ontwikkelen die draaien op desktop, Android, iOS en webbrowsers. Schrijf eenmaal code en implementeer deze op een van de belangrijkste platforms.
Ondersteuning toevoegen voor platformspecifieke code
LibGDX is zo ontworpen dat u dezelfde code kunt schrijven en op verschillende platforms kunt implementeren. Toch zijn er momenten waarop u toegang wilt krijgen tot platformspecifieke code. Als u bijvoorbeeld leaderboards en prestaties in uw game heeft, wilt u misschien platformspecifieke tools (zoals Google Play Games) gebruiken en deze lokaal opslaan. Of u wilt een database gebruiken, of iets heel anders.
U kunt dit soort code niet toevoegen aan de kernmodule. Dus de eerste stap is het maken van een interface. Maak het in de kernmodule. Deze eerste is een hulpprogramma om andere interfaces te beheren:
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
}
Vervolgens moeten we een tweede interface maken, de SQLWrapper. Deze gaat ook in de kernmodule.
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
}
Nu moet u in elk project gaan en een klasse maken om PlatformWrapper te implementeren en een klasse om SQLWrapper te implementeren. In elk project voegt u de benodigde code toe, zoals instanties, constructeurs, enzovoort.
Nadat u alle door u gemaakte interfaces hebt overschreven, moet u ervoor zorgen dat ze allemaal een instantie in de klasse hebben die PlatformWrapper implementeert (en dat er een getter is). Ten slotte verandert u de constructor in de hoofdklasse. De hoofdklasse is de klasse waarnaar u verwijst vanuit het opstartprogramma. Het verlengt ApplicationAdapter, implementeert ApplicationListener of breidt Game uit. Bewerk de constructor en voeg PlatformWrapper toe als argument. In de platformwrapper staan enkele hulpprogramma's (als je die hebt toegevoegd) naast alle andere wrappers (sql, prestaties of andere dingen die je hebt toegevoegd).
Als alles goed is ingesteld, kunt u de PlatformWrapper bellen en een van de platformonafhankelijke interfaces ophalen. Roep elke methode aan en (ervan uitgaande dat de uitgevoerde code correct is) ziet u op elk platform, het doet wat het moet doen met platformspecifieke code
Vermogensbeheerder
De AssetManager is een klasse die u helpt uw activa te beheren.
Allereerst moet u een instantie maken:
AssetManager am = new AssetManager();
Nadat dit is geïnitialiseerd en voordat u iets rendert, wilt u de bronnen ophalen:
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();
badlogic.jpg
je ook zin hebt om badlogic.jpg
krijgen:
Texture texture = am.get("badlogic.jpg");
//Ready to render! The rendering itself is in the normal way
Met AssetManager kunt u ze eenmaal in het geheugen van de AssetManager laden en ze vervolgens zo vaak als u wilt ophalen.
Waarom AssetManager gebruiken? (van de wiki ):
AssetManager (code) helpt u bij het laden en beheren van uw activa. Het is de aanbevolen manier om uw activa te laden, vanwege het volgende leuke gedrag:
- Het laden van de meeste bronnen gebeurt asynchroon, zodat u tijdens het laden een reactief laadscherm kunt weergeven
- Activa worden geteld als referentie. Als twee activa A en B beide afhankelijk zijn van een ander actief C, wordt C niet vervreemd voordat A en B zijn vervreemd. Dit betekent ook dat als u een item meerdere keren laadt, het daadwerkelijk wordt gedeeld en slechts eenmaal geheugen in beslag neemt!
- Eén plek om al uw bezittingen op te slaan.
- Maakt het mogelijk om dingen zoals caches transparant te implementeren (zie FileHandleResolver hieronder)
De 2D-scènegrafiek
Wanneer u aan de slag gaat met Java of Android, leert u snel dat (0,0) zich in de linkerbovenhoek bevindt. In LibGDX staat standaard echter (0,0) in de linkerbenedenhoek.
Met een orthografische camera kunt u (0, 0) in de linkerbovenhoek krijgen. Hoewel standaard (0, 0) zich linksonder bevindt. Dit is iets dat belangrijk is om te weten, omdat het ook verandert welke hoek van de structuren de X- en Y-coördinaten hebben.