Tag 1 – Die Grundlagen

veröffentlicht am: 1. Dezember 2012


Heyho,

es ist der 1. Dezember und der „bitowl lernt libgdx“-Adventskalender startet nun 🙂
Ich hoffe du hast, wie im ersten Post beschrieben, dir schon Eclipse mit dem Android-SDK runtergeladen.
Wenn du das gemacht hast, können wir libgdx installieren.

Lade dir dafür den neusten Release-Build (momentan 0.9.9) auf http://libgdx.badlogicgames.com/download.html runter.
Du hast nun eine zip-Datei, die du abspeicherst und entpackst sie in ein neues Verzeichnis „libgdx“.

Nun öffnest du dieses Verzeichnis und startest dort die gdx-setup-ui.jar (ob via Doppelklick oder per Konsole ist egal :P).
Mitterweile liefert libgdx dieses coole Programm, dass für das Aufsetzen der verschiedenen Projekte (Desktop, Android) übernimmt.

In der linken Spalte füllst du einfach alle Felder entsprechend deines Projektnames aus. (wir wollen kein HTML5-Projekt) In der mittleren Spalte klickst du rechts von „LibGDX“ auf den Ordner und wählst die runtergeladene Zip-Datei aus.
Nun kannst du im vierten Feld dein Projekt generieren.

Dieses Programm hat nun die Projekte für uns generiert und alle nötigen Eigenschaften gesetzt, aber wir müssen sie noch in Eclipse importieren.
Dafür starten wir Eclipse und gehen ins Menü „File“ >> „Import“. Im Dialog wählen wir nun „General“ >> „Existing Projects into Workspace“. Im nächsten Fenster wählen wir nun als „root directory“ das Verzeichnis aus, in das wir unsere Projekte generiert haben. Jetzt sollten unter „Projects“ die drei Projekte erscheinen und wir klicken auf „Finish“.

Wir haben nun drei verschiedene Projekte. „testgame“ als Hauptprojekt, in dem unser gesamter Code untergebracht ist. In „testgame-android“ und „testgame-desktop“ sind nur Starter-Klassen, die unser Spiel auf den verschiedenen Systemen starten.

Wichtig für uns sind zwei Ordner: in testgame der Ordner src in dem alle unsere Klassen, die wir innerhalb des Spiels verwenden, abgelegt sind und in testgame-android der Ordner assets in den wir alle Dateien (Bilder, Schriften, Sounds) packen, die mit unserem Spiel zusammen ausgeliefert werden sollen.

Schauen wir uns die wichtigste Datei an. Die TestGame (oder wie auch immer du sie genannt hast)-Klasse im testgame-Projekt:

package de.bitowl.libgdxtest;

import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.Texture.TextureFilter;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;

public class TestGame implements ApplicationListener {
	private OrthographicCamera camera;
	private SpriteBatch batch;
	private Texture texture;
	private Sprite sprite;
	
	@Override
	public void create() {		
		float w = Gdx.graphics.getWidth();
		float h = Gdx.graphics.getHeight();
		
		camera = new OrthographicCamera(1, h/w);
		batch = new SpriteBatch();
		
		texture = new Texture(Gdx.files.internal("data/libgdx.png"));
		texture.setFilter(TextureFilter.Linear, TextureFilter.Linear);
		
		TextureRegion region = new TextureRegion(texture, 0, 0, 512, 275);
		
		sprite = new Sprite(region);
		sprite.setSize(0.9f, 0.9f * sprite.getHeight() / sprite.getWidth());
		sprite.setOrigin(sprite.getWidth()/2, sprite.getHeight()/2);
		sprite.setPosition(-sprite.getWidth()/2, -sprite.getHeight()/2);
	}

	@Override
	public void dispose() {
		batch.dispose();
		texture.dispose();
	}

	@Override
	public void render() {		
		Gdx.gl.glClearColor(1, 1, 1, 1);
		Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
		
		batch.setProjectionMatrix(camera.combined);
		batch.begin();
		sprite.draw(batch);
		batch.end();
	}

	@Override
	public void resize(int width, int height) {
	}

	@Override
	public void pause() {
	}

	@Override
	public void resume() {
	}
}


Diese Klasse sorgt momentan dafür, dass ein Test-Bild angezeigt wird, was aber für uns schon viel zu kompliziert aussieht. Deshalb werfen wir zuerst mal alles raus, was wir noch nicht brauchen und was uns nur irritieren würde:

package de.bitowl.libgdxtest;

import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL10;

public class TestGame implements ApplicationListener {
	
	@Override
	public void create() {		
	
	}

	@Override
	public void render() {		
		Gdx.gl.glClearColor((float) Math.random(),(float) Math.random(), (float) Math.random(), 1);
		Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
		
	}

	@Override
	public void resize(int width, int height) {
	}

	@Override
	public void pause() {
	}

	@Override
	public void resume() {
	}
	
	@Override
	public void dispose() {
	}

}

Jetzt sieht das Ganze schon einfacher aus.

Wenn unser Spiel gestartet wird, wird die Methode create() unserer Game-Klasse aufgerufen.
Die Methode resize immer, wenn die Bildgröße verändert wird (beim Desktop, falls man im Fenstermodus ist und bei android falls man das Gerät kippt)
Unter android werden zusätzlich noch die Methoden pause() und resume() aufgerufen, falls man die app in den Hintergrund schiebt (auf den Homebutton klickt)
dispose() wird aufgerufen, wenn das Spiel beendet wird und alle Ressourcen vernichtet werden können.

render() wird nun in jedem Frame einmal aufgerufen.

Gdx.gl.glClearColor((float) Math.random(),(float) Math.random(), (float) Math.random(), 1);
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

Das sind OpenGL-Befehle, die den Bildschirm mit einer bestimmten Farbe füllen (zufällig, damit wir etwas zu sehen haben).
Wir können unser „Spiel“ nun starten, indem wir im „Project Explorer“ testgame-desktop auswählen und oben in der Zeile auf „Run“ (den grünen Pfeil) klicken.

Man sollte es trotzdem schnell wieder beenden, da es relativ schlimm aussieht (60 Mal ändert sich die Farbe zufällig pro Sekunde):P

Den kompletten momentanen Quelltext findest du auch immer auf GitHub.

Im morgigen Tutorial werden wir ein erstes Bild auf den Bildschirm malen.

Schreib Verbesserungsvorschläge, Rechtschreibfehler, Beschwerden, Ideen, was für ein Spiel ich programmieren soll, usw. in die Kommentare.

geposted in libgdx

6 Antworten zu “Tag 1 – Die Grundlagen”

  1. der_schelm sagt:

    Damn. Bin richtig begeistert. Optisch gut gestaltet, inhaltlich klar und nachvollziehbar und sogar zweisprachig verfügbar. Könnte eine der besten Tutorial-Reihen des Netzes werden 😀 Werde das Projekt auf jeden Fall weiter verfolgen!

    Greetings, der_schelm

  2. m4gu5 sagt:

    Sehr gute Einführung in libGDX.
    Ich werde die Reihe auf jeden Fall weiterverfolgen 🙂

    Viele Grüße

  3. paraside sagt:

    Klasse Tutorial!
    Ich bin wirklich begeistert. Du erklärst alles, was wichtig ist, kurz aber genau und dank der Bilder ist alles leicht nachzuvollziehen.
    Ich bin gespannt auf die folgenden Einträge =D

  4. AgenoDrei sagt:

    Erstmal vorab: Super Tutorial!!
    Für mich als Hobby-Progammierer mit Java als Hauptsprache sind prinzipiell alle Game-Development Anleitungen interessant, aber leider gibt es nur wenige wirklich gute…. Das hier sieht ziemlich vielversprechend aus! Gut erklärt und auf die wichtigsten Dinge reduziert. Freue mich schon auf die nächsten Teile :p Ach und dein Blog sieht epic aus(Ich mag die Eule^^).

    Gruß AgenoDrei

  5. Ewald sagt:

    Great tutorials, thank you – I really enjoy learning LibGDX. Thank you for making it easier!

  6. degea sagt:

    many thanks for this tutorial !

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.