Timer erzeugen und anzeigen – Teil 2
Vorzunehmenden Änderungen an der GameView Klasse
-
Hinzufügen von globalen Variablen:
private long starttime = 0; private long timeleft; private long playTime = 60000; private int secondsLeft; private boolean timeIsUp=false;
-
Initialisiere starttime innerhalb unserer draw() (in früheren Versionen hieß es noch onDraw() ) Methode innerhalb der abfrage if(createSprites):
starttime = System.currentTimeMillis();
-
Das Malen der Zeit auf unseren Canvas in der draw() Methode erreiche ich durch aufrufen der folgenden Methode:
public void drawTime(Canvas canvas, Paint paint, int yTextPos){ int theSeconds, theMinutes; String minuteString, secondsString; int x4 = (int) (30 * getDensity()); long timegone = System.currentTimeMillis() - starttime; timeleft = playTime - timegone + theGameActivity.getPauseTime(); secondsLeft = (int) (timeleft / 1000); theSeconds = (int) (secondsLeft % 60); theMinutes = (int) (secondsLeft / 60); minuteString = String.valueOf(theMinutes); secondsString = String.valueOf(theSeconds); final String theTime; if (theSeconds < 10) { theTime = minuteString + ":0" + secondsString; canvas.drawText(theTime, x4, yTextPos, paint); } else if (theSeconds >= 10) { theTime = minuteString + ":" + secondsString; canvas.drawText(theTime, x4, yTextPos, paint); } if (timeleft <= 0) { timeIsUp = true; } }
-
Dazu sage ich, dass die Zeit die bereits vergangen ist, die momentane minus die Startzeit ist. Dann setze ich timeleft, also die Zeit die noch übrig ist mit der Spielzeit die wir auf 60000 Millisekunden gesetzt haben minus die Zeit die bereits verstrichen ist, plus die Zeit die wir das Spiel pausiert haben. Letzteres mache ich damit die Zeit nicht weiterläuft, wenn der spieler auf Pause drückt. Diese Zeit breche ich dann runter auf Minuten und Sekunden und male sie auf den Bildschirm.Um die Variablen yTextPos, Paint und font nicht nur in der draw() Methode verwenden zu können schneiden wir die Zeilen aus draw aus und fügen sie bei den Globalen Variablen ein.
-
Wir dürfen natürlich nicht vergessen diese Methode dann auch aufzurufen:
drawTime(canvas, paint, yTextPos);
- Um nun die GameOverActivity zu öffnen, wenn die Zeit abgelaufen ist, brauchen wir folgende Methode und müssen diese in der draw() Methode aufrufen:
public void checkIfTimeOver() { if (timeIsUp) { theGameActivity.onGameOver(); } }
-
Damit nun die Übrige Zeit noch von der Fähigkeit des Spielers abhängt, müssen wir noch ein paar Änderungen an unserer onTouchEvent() Methode vornehmen. So soll die Spielzeit um 5 Sekunden verringert werden, wenn der Spieler auf einen falschen Sprite klickt und alle 5 Punkte um 3 Sekunden erhöht werden.
Das sieht dann folgendermaßen aus:
@Override public boolean onTouchEvent(MotionEvent event) { if (System.currentTimeMillis() - lastClick > 300) { lastClick = System.currentTimeMillis(); synchronized (getHolder()) { for (int i = spriteList.size() - 1; i >= 0; i--) { Sprite sprite = spriteList.get(i); if (sprite.isTouched(event.getX(), event.getY())) { if (currentColorNum == spriteListNum.get(i)) { score++; if (theGameActivity.getSoundToggleState()) { theGameActivity.playPoint(); } if ((score % 5 == 0) && (score != 0)) { playTime += 3000; } } else { // lives--; playTime -= 5000; if (theGameActivity.getVibrationToggleState()) { theGameActivity.vibrator(); } if (theGameActivity.getSoundToggleState()) { theGameActivity.playMinusPoint(); } // if (lives == 0) { // theGameActivity.onGameOver(); // } } // if (score == 3) // lives++; rndCreateSprite(); removeSprite(i); changeColor(); break; } } } } return true; }