Wie kann ich ein Stage-basiertes HUD von einem anderen Stage-Darsteller in libGDX aktualisieren?

7

Ich denke, dies ist ein einfaches Problem, aber ich habe Probleme, die richtigen Suchbegriffe zu finden.

Ich habe eine Screen, die zwei Stages enthält.

  1. Das erste stageenthält eine Reihe von Objekten, die vom ActorStandard abgeleitet und über diesen hinzugefügt wurden stage.addActor(Actor). Dies gilt für die eigentlichen Spielobjekte.

  2. Der zweite hudStagebesteht aus einem einzelnen TableSchauspieler. Diese Tabelle enthält eine Schaltfläche sowie zwei Labels. Dies ist für die statische Benutzeroberfläche / HUD.

Ich behandle Touch-Ereignisse für meine benutzerdefinierten Schauspieler in der Spielphase wie folgt:

public class GameObject extends Actor {
    private final static String TAG = GameObject.class.getName();
    // ...

    public GameObject() {
        // ...

        addListener(new InputListener() {
            @Override
            public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
                Gdx.app.log(TAG, "touchDown on GameObject actor: <" + x + "," + y + ">");
                return super.touchDown(event, x, y, pointer, button);
            }
        });
    }

Dies funktioniert perfekt und protokolliert, was ich brauche. Jetzt möchte ich jedoch das HUD mit Informationen zu dem Objekt aktualisieren, das der Benutzer berührt hat.

Mein Bildschirm hat das definiert, das Labelich aktualisieren möchte (hinzugefügt über hudStage), aber ich bin nicht sicher, wie ich von einem Schauspieler stagezum Bildschirm oder zum hudStageLabel gelangen soll.

public class GameScreen implements Screen {
    Stage stage;
    Stage hudStage;
    // This is the label I want to update.
    Label infoLabel;
    // ...
}

Ich weiß, dass ich setText(String)auf dem Etikett anrufen kann , bin mir aber nicht sicher, wie ich den Klick am besten in die Luft sprudeln lassen kann. Viele Beispiele haben vereinfachte Versionen, in denen Objekte in der Hauptklasse definiert sind (in meinem Fall GameScreen) und auf diese Weise auf sie verweisen können, aber ich habe diese bereits auseinander gebrochen.

Ich fing an, ein benutzerdefiniertes Ereignis zu erstellen, das mein Schauspieler auslösen könnte und das die Bühne handhaben würde, aber die Dokumentation ist spärlich und ich bin nicht sicher, ob dies erforderlich ist.

Ich habe auch darüber nachgedacht, die Idee zu verwerfen, ein Etikett im zu haben hudStageund stattdessen meinen Schauspieler Text zeichnen zu lassen, wo das HUD hätte. Nach dem, was ich weiterhin sehe, denke ich jedoch, dass Scene2D die richtige Richtung für die Benutzeroberfläche ist.

Vielen Dank!

EDIT: Was ich suche:

  1. Ein Schauspieler in GameScreen.stageist das Ziel eines touchDownEreignisses.
  2. Logic in Actor feuert und aktualisiert das Objekt.
  3. Landungs - Veranstaltung in Schauspieler beendet durch die Aktualisierung infoLabelin GameScreen.hudStage oder aktualisiert String - Wert in GameScreen(falls einfacher, ich diesen Weg gehen werde).
James Skemp
quelle
Haben die Bühnen keinen Zugang zueinander? Und wenn nicht, warum nicht?
StrongJoshua
Gute Frage. Ich denke, die Antwort ist nein, zumindest wenn Sie nicht durchgehen GameScreen. Es sieht so aus, als ob das einzige Fenster, das ich geöffnet habe, diese Antwort auf SO über mehrere Stufen ist. Beachten Sie, dass meine Kameras unterschiedlich sind, was mich zu der Annahme veranlasste, dass zwei Geschwisterphasen erforderlich wären.
James Skemp
Aber Sie verwenden bereits zwei Stufen (eine für Hud und eine für das Spiel). Wie unterscheidet sich das von der Antwort, die Sie verlinkt haben?
StrongJoshua
Es ist nicht anders, es ist eigentlich der Grund, warum ich zwei Stufen durchlaufen habe ... Entschuldigung, das war ein Versuch, Ihre Frage zu beantworten: "Wenn sie es nicht tun, warum nicht?" / warum ich das so codiert habe wie ich. Ich nahm an, dass sie Zugang zueinander haben würden, wenn einer das Kind eines anderen wäre.
James Skemp
Ok, was ist das Problem mit Ihrer aktuellen Implementierung? Was möchten Sie, damit das Klickereignis sprudelt? Was soll passieren?
StrongJoshua

Antworten:

1

Damit dies funktioniert, benötigen Sie zwei Kommunikationsstufen. Es gibt zwei Möglichkeiten, wie Sie das gewünschte Ergebnis erzielen können.

  1. Lassen Sie jeden von Ihnen erstellten (berührbaren) Akteur einen Verweis auf die HUD-Stufe enthalten. Wenn der Akteur berührt wird, aktualisieren Sie einfach das HUD, indem Sie eine Methode mit dem Akteur als Parameter aufrufen ( hudStage.update(thisActor)).
  2. Weisen Sie Ihren Schauspielern keine Zuhörer zu. Weisen Sie stattdessen Ihrer HUD-Stufe (nicht der darin enthaltenen Tabelle) einen Listener zu, der auf Klicks auf dem gesamten Bildschirm wartet. Wenn ein Klick registriert ist, rufen Sie an hit(x, y, true)und sehen Sie, welcher Schauspieler getroffen wird. Rufen Sie die Aktualisierungsmethode dieses Schauspielers auf (oder was auch immer Sie tun möchten, wenn ein Schauspieler berührt wird) und aktualisieren Sie die HUD-Informationen mit diesem Schauspieler.

Ich denke, dies wäre der einfachste Weg, um das zu erreichen, was Sie wollen, aber natürlich können Sie diese beiden Ideen nach Bedarf variieren.

StrongJoshua
quelle