Schlange: Meldungen der Reihe nach
Dein Spiel soll etwas sagen: „Eine Münze!", „Die Tür ist verschlossen.", „Alle Münzen gefunden!". Eine Zeile am unteren Rand reicht dafür. Schwierig wird es erst, wenn zwei Meldungen fast gleichzeitig kommen. Zeigst du jede sofort an, überschreibt die zweite die erste, und niemand hat sie gelesen.
Die Lösung: Meldungen stellen sich an. Jede bleibt eine Weile stehen, dann kommt die nächste dran, und zwar die, die zuerst kam. Das ist eine Warteschlange.
So sieht es aus
Starte das Beispiel und sammle zwei Münzen kurz hintereinander ein. Achte auf die untere Zeile.
Was dazugekommen ist
Geändert hat sich nur Welt. Sie bekommt eine Schlange aus Zeichenketten und eine zweite Textzeile:
private Queue<String> meldungen = new Queue<String>();
private Text meldungszeile;
private int restBilder = 0;
Wer etwas sagen will, reiht seine Meldung hinten ein. Angezeigt wird hier noch nichts:
public void melde(String pText) {
meldungen.enqueue(pText);
}
Gezeigt wird in run(), also etwa 60-mal in der Sekunde. Solange die aktuelle Meldung noch stehen bleiben soll, zählt restBilder herunter. Ist die Zeit um, kommt die vorderste Meldung dran und wird aus der Schlange genommen:
public void run() {
if (restBilder > 0) {
restBilder = restBilder - 1;
} else if (!meldungen.isEmpty()) {
meldungszeile.showText(meldungen.front());
meldungen.dequeue();
restBilder = 120; // etwa zwei Sekunden
} else {
meldungszeile.showText("");
}
}
Gemeldet wird beim Start und in punkten():
this.melde("Eine Münze! Jetzt hast du " + punkte + ".");
if (this.count(Muenze.class) == 0) {
this.melde("Alle Münzen gefunden!");
}
Warum eine Schlange und kein Stapel? Die Meldungen sollen in der Reihenfolge erscheinen, in der sie passiert sind. Was zuerst eingereiht wurde, kommt zuerst dran: FIFO. Ein Stapel würde die neueste Meldung zuerst zeigen. Aus „Eine Münze!" und „Alle Münzen gefunden!" würde dann eine Geschichte, die rückwärts erzählt wird.
In deinem Spiel
Aufgabe 1: Übernimm die Meldungen
Baue die Meldungszeile in dein eigenes Spiel ein, unten in deiner Werkstatt. Du brauchst die drei Attribute, die Methode melde, die Methode run und die Textzeile im Konstruktor. Prüfe danach: Erscheinen zwei schnell eingesammelte Münzen nacheinander?
Aufgabe 2: Autsch!
Lass den Spieler „Autsch!" melden, wenn er gegen eine Wand läuft. Probiere es aus und halte eine Pfeiltaste gegen eine Wand gedrückt.
a) Was passiert mit der Schlange? Erkläre, woran das liegt.
b) Repariere es so, dass jeder Stoß nur eine Meldung erzeugt.
Tipp zu Aufgabe 2
run() läuft 60-mal in der Sekunde. Solange du gegen die Wand drückst, stößt der Spieler in jedem Bild an, und jedes Mal kommt eine neue Meldung in die Schlange. Nach zwei Sekunden warten schon 120 „Autsch!" darauf, gezeigt zu werden.
Merke dir in einem Attribut, ob der Spieler im letzten Bild schon an der Wand stand. Gemeldet wird nur, wenn er es vorher nicht tat.
Aufgabe 3: Eine Anleitung zum Start
Erkläre beim Start in drei oder vier Meldungen, worum es in deinem Spiel geht und wie man es steuert. Wie lange darf eine Meldung stehen, damit man sie lesen kann? Passe restBilder an.
Weitere Ideen mit der Schlange
Überall, wo Dinge in der Reihenfolge ihres Eintreffens drankommen sollen, passt eine Schlange:
| Idee | Was in der Schlange steht |
|---|---|
| Gegnerwellen: Ist ein Raum leer, kommt die nächste Welle. | die Wellen, zum Beispiel als Zeichenkette "SSB" für zwei Schleime und eine Fledermaus |
Befehle programmieren: Der Spieler plant erst Schritte (↑ ↑ → →), dann läuft die Figur sie ab. |
die geplanten Schritte |
Gespräch mit einer Figur: Eine Figur sagt mehrere Sätze nacheinander, jeder mit say(…). |
die Sätze |
| Lieferaufträge: Bewohner bestellen Dinge, die du der Reihe nach bringst. | die Aufträge |
Deine Werkstatt
Hier arbeitest du an deinem eigenen Spiel weiter. Es ist derselbe Arbeitsbereich wie auf allen anderen Seiten der Werkstatt.