Spiele-App „Reactions“ – Teil 3: Single Player

Spiele-App „Reactions“ – Teil 3: Single Player

Weiter geht’s mit unserem „Reactions“-Spiel.

Views initialisieren

Im letzten Teil hatten wir das Layout für den Single-Player-Modus entworfen. Als nächstes müssen wir die Views im Layout anhand ihrer ID finden und als Attribute unserer SingleActivity-Klasse deklarieren. Dazu rufen wir in der onCreate-Methode eine neue Methode auf, die wir initViews nennen.

Am besten ist es, wenn wir für den Punktestand noch eine Variable deklarieren. Wir nennen sie score und sie ist vom Typ int, also eine ganze Zahl.

CountDownTimer

Das Spiel funktioniert so, dass sich alle paar Millisekunden die Farbe und die Aufschrift des Buttons ändern. Um das zu ermöglichen, nutzen wir einen CountDownTimer. Das hatten wir in der Bumm-App schon einmal gemacht. Mit dem CountDownTimer können wir eine Aktion regelmäßig in einem bestimmten Intervall ausführen.

Dazu deklarieren wir eine neue Variable.

CountDownTimer countDownTimer;

Und wir schreiben eine neue Methode, nennen sie initGame und rufen sie auch in der onCreate-Methode auf, direkt nachdem wir die Views initialisiert haben.

Wir erstellen einen neuen CountDownTimer mit dem Schlüsselwort „new“ und übergeben dabei zwei Argumente. Das erste Argument gibt an, wie lange das Spiel laufen soll. Wir nennen das GAME_TIME. Das ist eine Konstante, die wir ganz oben in der Klasse definieren. Wir multiplizieren den Wert noch mit 1000, weil sie in Millisekunden angegeben werden muss. Das zweite Argument gibt das Intervall an, also nach wieviel Millisekunden eine Aktion ausgeführt werden soll. Auch hier verwenden wir eine Konstante. Wir nennen sie DECISION_TIME. Decision steht für „Entscheidung“, also wieviel Zeit hat der Spieler, um zu entscheiden, ob er auf den Button tippt.

Beide Konstanten werden oben in der Klasse definiert.

Die GAME_TIME Konstante habe ich auf 24 Stunden gesetzt, also 24 Stunden multipliziert mit 60 Minuten multipliziert mit 60 Sekunden. Das ergibt 86400 Sekunden. Soviel Sekunden hat ein ganzer Tag. Warum das ganze? Wir wollen eigentlich, dass das Spiel solange läuft bis der Spieler einen Fehler macht und den Button drückt, obwohl der Button eine Farbe und einen Text zeigt, die nicht zusammen passen. Wir müssen unserem CountDownTimer aber eine Endzeit mitgeben. Ich denke, dass 24 Stunden ausreichen. Falls du es schaffst, das Spiel einen ganzen Tag lang fehlerfrei zu spielen und das Spiel durch diese Konstante plötzlich endet, gib mir Bescheid. :-p

Der CountDownTimer ist eine abstrakte Klasse und hat zwei Methoden, die wir noch implementieren müssen. Die eine heißt onTick, die andere heißt onFinish. Die onTick-Methode wird mit jedem Intervall aufgerufen, also immer nach 800 Millisekunden, so wie wir es mit der DECISION_TIME Konstante definiert haben. Alle 800 Millisekunden wollen wir die Farbe des Buttons ändern. Daher rufen wir eine neue Methode auf, die wir changeColor nennen. Die onFinish-Methode wird aufgerufen, wenn GAME_TIME abgelaufen ist. Dann soll das Spiel beendet werden. Hier rufen wir also eine Methode auf, die wir einfach stopGame nennnen.

Die changeColor-Methode erstellen wir, aber lassen wir erstmal leer. Darum kümmern wir uns beim nächsten Mal.

Spiel starten

Um das Spiel zu starten, schreiben wir eine neue Methode, die wir startGame nennen. Die rufen wir auch in der onCreate-Methode auf, und zwar nachdem wir das Spiel initialisiert haben, also unter initGame. Hier müssen wir nur den CountDownTimer starten.

Spiel beenden

Kümmern wir uns mal um die stopGame-Methode. Die wird aufgerufen, wenn das Spiel beendet wird. Das passiert entweder, wenn der Spieler einen Fehler macht, oder wenn die maximale Spielzeit von 24 Stunden abgelaufen ist. Wir brechen erstmal den CountDownTimer ab, falls der noch läuft. Und dann wollen wir dem Nutzer einen Dialog anzeigen, um ihm den erreichten Punktestand nochmal mitzuteilen. Außerdem bieten wir in dem Dialog zwei Buttons an, einen zum Beenden des Spiels, so dass er zum Hauptmenü zurückkehrt, und einen zum Neustarten des Spiels.

Um einen Dialog zu bauen, nutzen wir den AlertDialog.Builder. Mit dem Schlüsselwort „new“ erzeugen wir einen und übergeben „this“, also die SinglePlayerActivity selbst. Das ist erforderlich, weil der Dialog den sogenannten Context benötigt. Die SinglePlayerActivity ist in diesem Fall der Context. Dann rufen wir mehrere Methoden auf, um das Aussehen des Dialogs zu bestimmen. Wir setzen einen Titel, wir setzen eine Nachricht, und wir definieren zwei Buttons. Die Texte kannst du übrigens auch wieder in die strings.xml auslagern und wie gewohnt referenzieren.

In einem Dialog können bis zu 3 Buttons definiert werden. Der eine heißt Negativ-Button, der zweite Neutral-Button und der dritte Positiv-Button. Die unterschiedlichen Namen geben an, wo sich der Button im Dialog befindet. In unserem Fall ist der Negativ-Button der zum Beenden des Spiels.

alertDialogBuilder.setNegativeButton("Beenden", (dialog, which) -> finish());

Wird der Beenden-Button geklickt, soll die finish-Methode aufgerufen werden. Damit wird die SinglePlayerActivity beendet und verschwindet vom Bildschirm. Weil die MainActivity darunterliegt, sieht der Spieler in diesem Fall wieder das Hauptmenü. So soll es sein.

Der Positiv-Button ist der Button, mit dem wir das Spiel wiederholen wollen.

alertDialogBuilder.setPositiveButton("Nochmal", (dialog, which) -> restartGame());

Klickt der Spieler auf diesen Button, rufen wir die restartGame-Methode auf. Die existiert noch nicht, also schreiben wir sie. Beim Neustart des Spiels setzen wir den Punktestand zurück auf 0 und starten einfach das Spiel. Die Methode sieht dann so aus:

Nun könnten wir den Dialog anzeigen. Aber eine Sache sollten wir vorher noch bedenken: Wenn man einen Dialog anzeigt, kann der Nutzer diesen Dialog auch einfach wieder schließen, indem er den Zurück-Button vom Handy klickt oder den Bildschirm außerhalb des Dialogs berührt. Wir wollen aber, dass sich der Nutzer für einen der beiden Buttons entscheidet. Um also zu verhindern, dass er den Dialog über andere Wege schließen kann, sagen wir, dass man den Dialog nicht abbrechen kann. Das geht so:

alertDialogBuilder.setCancelable(false);

Erst danach zeigen wir den Dialog an.

alertDialogBuilder.show();

Das war’s für diesen Teil erstmal. Im nächsten Teil füllen wir noch die changeColor-Methode. Dazu werden wir einen Zufallsgenerator verwenden. Also: Fortsetzung folgt! 😉