11. Αντίστροφη μέτρηση

Το κεφάλαιο σε pdf.
Κατεβάστε το

Στα περισσότερα παιχνίδια, όταν ο χρήστης δεν κάνει τίποτε τότε μετά από κάποιο χρόνο χάνει. Αυτό δεν συμβαίνει ακόμη στο δικό μας παιχνίδι. Για να υλοποιήσουμε αυτή τη λειτουργία θα εισάγουμε αντίστροφη μέτρηση στο παιχνίδι μας. Θα εισάγουμε μια νέα υποκλάση Timer η οποία θα μετράει κάποια δευτερόλεπτα αντίστροφα και όταν αυτά τα δευτερόλεπτα περάσουν, το παιχνίδι θα τελειώσει. Η υποκλάση αυτή θα δείχνει τα δευτερόλεπτα στην οθόνη οπότε ο κώδικας που θα υλοποιήσουμε θα μοιάζει με αυτόν της κλάσης Scoreboard.

Kώδικας 11.1:

private static final Color TEXT_COLOR = new Color(200, 0, 0);
private static final Color TRANSPARENT_COLOR = new Color(0, 0, 0, 0);
 
   public Timer()
   {
        updateImage();
   }
   public void act() {
       updateImage();
   }
   private void updateImage()
   {
    String text = "Seconds left: ";
    GreenfootImage image = new GreenfootImage(text, 30, TEXT_COLOR, TRANSPARENT_COLOR);
    setImage(image);
   }

Για να υπολογίσουμε τον χρόνο του ενός δευτερολέπτου υπάρχει η μέθοδος currentTimeMillis που ανήκει στην κλάση System. long System.currentTimeMillis()

Η μέθοδος αυτή επιστρέφει αριθμούς τύπου long δηλαδή πολύ μεγάλους ακεραίους, συγκεκριμένα επιστρέφει τα χιλιοστά του δευτερολέπτου που έχουν περάσει από τα μεσάνυχτα της 1/1/1970. Αρχικά σε μια μεταβλητή θα αποθηκευτεί ο τρέχων χρόνος που θα είναι ο αρχικός χρόνος. timeStarted = System.currentTimeMillis();

Σε κάθε act θα ελέγχουμε αν η διαφορά μεταξύ του τρέχοντος χρόνου και του αρχικού χρόνου είναι 1000 milliseconds. Όταν η διαφορά θα είναι μεγαλύτερη από 1000 milliseconds αυτό θα σημαίνει ότι έχει περάσει ένα δευτερόλεπτο. Θα πρέπει τότε να ορίσουμε τον αρχικό χρόνο στον τρέχων χρόνο για να μπορέσουμε να μετρήσουμε ένα νέο δευτερόλεπτο.

if (System.currentTimeMillis()-timeStarted>1000){
           timeStarted = System.currentTimeMillis();
        }

Για να μετρήσουμε δέκα δευτερόλεπτα θα χρειαστούμε μια δεύτερη μεταβλητή με όνομα seconds. Την αρχικοποιούμε στο 10 και κάθε φορά που περνάει ένα δευτερόλεπτο τη μειώνουμε κατά 1. O χρήστης θα πρέπει να ενημερωθεί για την τιμή του μετρητή, για αυτό το λόγο θα πρέπει να αλλάξει η εντολή String text = "Seconds left: " σε String text = "Seconds left: " + seconds; ώστε να φαίνονται και τα δευτερόλεπτα που έχουν περάσει.

Kώδικας 11.2:

   private static final Color TEXT_COLOR = new Color(200, 0, 0);
   private static final Color TRANSPARENT_COLOR = new Color(0, 0, 0, 0);
   private long timeStarted;
   private int seconds = 10;
   public Timer()
   {
        updateImage();
        timeStarted = System.currentTimeMillis();
   }
   public void act() {
       updateImage();
       if (System.currentTimeMillis()-timeStarted>1000){
           seconds--;
           timeStarted = System.currentTimeMillis();
        }
   }
   private void updateImage()
   {
       String text = "Seconds left: " + seconds;
       GreenfootImage image = new GreenfootImage(text, 30, TEXT_COLOR, TRANSPARENT_COLOR);
       setImage(image);
   }

Παρατηρούμε ότι το παιχνίδι δεν τελειώνει ποτέ, καθώς ο μετρητής συνεχίζει να μετράει αρνητικούς αριθμούς. Χρειάζεται να προσθέσουμε έναν τελευταίο έλεγχο στο παιχνίδι μας. Αν η μεταβλητή seconds γίνει 0 τότε θα πρέπει το παιχνίδι να σταματήσει. Το παιχνίδι σταματάει με την εντολή Greenfoot.stop().

Kώδικας 11.3:
   public void act() {
       updateImage();
       if (System.currentTimeMillis()-timeStarted>1000){
           seconds--;
        if (seconds == 0)
        {
                Greenfoot.stop();
}
           timeStarted = System.currentTimeMillis();
        }
   }

Επέκταση 11.1

Δώστε περισσότερο χρόνο στον παίκτη. Τι θα αλλάξετε ώστε ο παίκτης να παίζει για 20 δευτερόλεπτα.
comments powered by Disqus