libgdxAan de slag met libgdx


versies

Versie Publicatiedatum
1.9.3 2016/05/16
1.9.5 2016/12/11

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)

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: Voorbeeld van LibGDX-projectgenerator
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 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.

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:

Hallo wereld draaien op desktop

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:

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:

Voer een configuratievoorbeeld uit

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:

Uitvoeren pictogram

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)

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.