Spiele-App „Reactions“ – Teil 6: Dual Player

Spiele-App „Reactions“ – Teil 6: Dual Player

Im letzten Teil der Video-Serie haben wir das Design für den 2-Spieler-Modus gebaut. Heute geht’s mir der Implementierung des Codes voran.

Spielprinzip

Der 2-Spieler-Modus unterscheidet sich etwas vom 1-Spieler-Modus. Wenn Farbe und Aufschrift des Buttons übereinstimmen, muss man so schnell wie möglich auf den Button tippen. Ist man schnell genug und stimmt alles, bekommt man einen Punkt. Macht man einen Fehler, geht das Spiel zwar weiter, aber man verliert alle bisher erreichten Punkten. So bleibt das Spiel spannend. Es endet nach einer Minute automatisch.

Neue Activity erstellen

Zunächst erstellen wir eine neue Activity. Also rechte Maustaste auf den Package Name links in der Projektstruktur. Dann klicken wir auf „New“, „Java Class“. Dann müssen wir den Namen der neuen Activity eingeben. Wir nennen sie „DualPlayerActivity“. Die neue Activity sollte public sein und von der AppCompatActivity erben.

public class DualPlayerActivity extends AppCompatActivity {...}

Wichtig: Immer wenn du eine neue Activity erstellst, musst du sie auch im so genannten Manifest deklarieren. Du öffnest im Ordner „manifests“ die AndroidManifest.xml und fügst diese Zeile innerhalb des Application-Tags hinzu:

<activity android:name=".DualPlayerActivity" />

Konstanten definieren

Zuerst definieren wir zwei Konstanten. Die erste Konstante definiert die Länge des Spiels. Das Spiel soll 60 Sekunden lang dauern.

public final static int GAME_TIME = 20; //60 seconds

Die zweite Konstante definiert die Geschwindigkeit des Spiels. Alle 800 Millisekunden, also alle 0,8 Sekunden, soll sich die Farbe des Buttons ändern.

public final static int DECISION_TIME = 800; //800 ms

Views initialisieren

Wir müssen alle Views zunächst deklarieren, also oben in der Klasse für jede View den Typ und den Variablennamen angeben.

Am besten fügst du noch zwei Variablen für die Punktzahl des jeweiligen Spielers hinzu. Die sollten jeweils vom Typ int sein, also ganze Zahlen

int score1;
int score2;

Dann erzeugen wir die onCreate-Methode. Immer wenn die Activity gestartet wird, wird diese Methode automatisch aufgerufen. In dieser Methode rufen wir initViews auf. In initViews suchen wir uns die Views anhand ihrer IDs aus dem Layout und weisen sie den oben deklarierten Variablen zu. Beides sieht dann so aus:

Spiel initialisieren

Wir benötigen wieder unseren ColorShuffler für die zufällige Auswahl der Farben. Und wir benötigen den CountDownTimer, damit sich die Farben ständig ändern. Beide deklarieren wir als Variablen oben in der Klasse.

ColorShuffler colorShuffler;
CountDownTimer countDownTimer;

Dann erzeugen wir eine Methode initGame, die wir auch in onCreate aufrufen.

In dieser Methode erzeugen wir eine neue Instanz vom ColorShuffler und eine neue Instanz vom CountDownTimer. Wenn wir den CountDownTimer instanziieren, müssen wir dem Konstruktor zwei Argumente übergeben. Als erstes die Dauer des Spiels, also unsere Konstante GAME_TIME. Und als zweites die andere Konstante (DECISION_TIME), die angibt, alle wieviel Millisekunden etwas passieren soll. Wichtig ist, dass wir GAME_TIME mit 1000 multiplizieren, weil der CountDownTimer auch die Spielzeit in Millisekunden angegeben haben möchte.

Der CountDownTimer hat zwei abstrakte Methoden, die wir implementieren müssen. Die erste heißt „onTick“. Die wird bei jedem „Tick“ aufgerufen, also alle 800 Millisekunden. Da wir bei jedem Tick die Farbe des Buttons zufällig ändern wollen, rufen wir folglich in onTick eine Methode auf, die wir „changeColor“ nennen. Die zweite Methode heißt „onFinish“. Die wird am Ende der Spielzeit aufgerufen. Wir implementieren sie mit „stopGame“.

Farben wechseln

Wir müssen die Methode „changeColor“ schreiben.

In dieser Methode würfeln wir zufällig die nächste Farbe aus. Das machen wir, indem wir shuffle auf dem colorShuffler aufrufen. Dann setzen wir die Farbe und den Text für beide Buttons. Beide Buttons sollen dieselbe Farbe und denselben Text erhalten. Außerdem setzen wir auf jeden Button einen OnClickListener, so dass wir reagieren können, wenn die Nutzer ihre Buttons antippen.

Spiel beenden

Die „stopGame“ Methode sieht so aus:

Wenn das Spiel vorbei ist, beenden wir sicherheitshalber den CountDownTimer. Anschließend ermitteln wir den Gewinner. Ist der Punktestand von Spieler 1 größer als der Punktestand von Spieler 2, dann hat der erste Spieler gewonnen. Ist der Punktestand von Spieler 2 höher als der Punktestand von Spieler 2, dann hat der zweite Spieler gewonnen. Andernfalls hat niemand gewonnen, das Spiel ist dann unentschieden.

Wir zeigen einen Dialog an. Dabei erzeugen wir die Nachricht in den Dialog dynamisch. Dann nutzen wir den AlertDialog.Builder, um den Dialog zu bauen.

Der Dialog soll 2 Buttons haben. Mit dem „Beenden“ Button wird unsere Activity geschlossen, der Nutzer kehrt in diesem Fall zur Startseite zurück. Dazu rufen wir die Methode „finish“ auf. Die bringt die AppCompatActivity schon mit, müssen wir also nicht selbst implementieren.

Mit dem „Nochmal“ Button soll das Spiel neu starten, dabei sollen die Punkte beider Spieler wieder auf 0 zurückgesetzt werden. Hierzu rufen wir „restartGame“ auf, das müssen wir aber noch implementieren.

Spiel starten

Wir haben eine Methode zum Beenden des Spiels, die „stopGame“ Methode. Wir brauchen auch eine Methode zum Starten des Spiels. Die nennen wir „startGame“.

Hier starten wir einfach den CountDownTimer. Das reicht.

Wichtig ist natürlich, dass wir startGame ebenfalls in der onCreate-Methode aufrufen. Das Spiel soll ja sofort starten, sobald die Activity erzeugt wird.

Die onCreate-Methode sieht dann also so aus:

Was ist noch zu tun?

Wir sind fast fertig. Es fehlen nur noch wenige Methoden. Das sind:

  • „onButton1Click“: Die wird aufgerufen, wenn Spieler 1 auf seinen Button klickt.
  • „onButton2Click“: Die wird aufgerufen, wenn Spieler 2 auf seinen Button klickt.
  • „restartGame“: Die wird aufgerufen, wenn das Spiel neugestartet werden soll.

Schaffst du es, die 3 Methoden selbst zu implementieren? Probier’s aus! Man lernt am besten, indem man selbst experimentiert und tüftelt. Aber keine Sorge, im nächsten Teil zeige ich dir, wie’s funktioniert. 🙂