Libgdx buttons zufügen?

... komplette Frage anzeigen

1 Antwort

LibGDX hat einen 2d SceneGraph (Scene2D), welcher die Ganzen UI-Elemente mit sich bringt (Scene2D.ui https://github.com/libgdx/libgdx/wiki/Scene2d.ui).

In Scene2D verwaltest du alle deine Elemente in einer Stage ("Bühne"). Die Elemente werden Actors ("Schauspieler") genannt.  

Die Stage ist ein InputProcessor, was bedeutet, dass sie auf InputEvents reagieren kann. Sie gibt diese Events an die Actors weiter, welche diese dann abhandeln können.

Damit ein Actor ein InputEvent abhandeln kann, musst du ihm einen InputListener hinzufügen (actor.addListener(new InputListener{...}).

Dieser InputListener hat mehrere Methoden (touchDown, touchUp), welche jeweils einen boolean zurückliefern. Dieser sagt aus, ob das Event abgehandelt wurde (true) oder nicht (false). Falls die Rückgabe "true" ist, wird das Event keinem weiteren Actor zugeteilt, ansonsten schon.

Damit die Stage selbst überhaupt Inputs bekommt, musst du sie als den aktiven InputProcessor setzen. Das machst du mit "Gdx.input.setInputProcessor(stage)". Falls du mehrere InputProcessor hast, kannst du den InputMultiplexer verwenden.

Die Tables hingegen sind dann vollkommen optional. Sie sind nur eine von vielen UI-Componenten, welche als Container für andere Componenten dient. Der Table ermöglicht es dir sozusagen deine Elemente in einer Tabelle anzuordnen.

Wenn du jedoch nur einen einfachen Button hinzufügen möchtest, kannst du diesen einfach deiner Stage hinzufügen.

Wichtig ist, dass du die Position und Größe setzt, denn dadurch weiß die Stage wo sich der Actor befindet und ob ein Event (z.B. Touch) diesen Actor betrifft oder nicht.

In deiner "render" Methode musst du dann nur noch "stage.act(Gdx.graphics.getDelta())" und anschließend "stage.draw()" aufrufen.

Die "act" Methode ruft dabei die "act"-Methode aller Actors auf, welche darin ihre Logik ausführen (z.B. werden die "Actions" aktuallisiert u.s.w.).

Die "draw" Methode ruft "draw" jedes Actors auf, welcher sich dann selbst zeichnet.

LG

Antwort bewerten Vielen Dank für Deine Bewertung