Ich denke, dies ist ein einfaches Problem, aber ich habe Probleme, die richtigen Suchbegriffe zu finden.
Ich habe eine Screen
, die zwei Stage
s enthält.
Das erste
stage
enthält eine Reihe von Objekten, die vomActor
Standard abgeleitet und über diesen hinzugefügt wurdenstage.addActor(Actor)
. Dies gilt für die eigentlichen Spielobjekte.Der zweite
hudStage
besteht aus einem einzelnenTable
Schauspieler. Diese Tabelle enthält eine Schaltfläche sowie zweiLabel
s. 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 Label
ich aktualisieren möchte (hinzugefügt über hudStage
), aber ich bin nicht sicher, wie ich von einem Schauspieler stage
zum Bildschirm oder zum hudStage
Label 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 hudStage
und 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:
- Ein Schauspieler in
GameScreen.stage
ist das Ziel einestouchDown
Ereignisses. - Logic in Actor feuert und aktualisiert das Objekt.
- Landungs - Veranstaltung in Schauspieler beendet durch die Aktualisierung
infoLabel
inGameScreen.hudStage
oder aktualisiert String - Wert inGameScreen
(falls einfacher, ich diesen Weg gehen werde).
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.Antworten:
Damit dies funktioniert, benötigen Sie zwei Kommunikationsstufen. Es gibt zwei Möglichkeiten, wie Sie das gewünschte Ergebnis erzielen können.
hudStage.update(thisActor)
).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.
quelle