Το κεφάλαιο σε pdf.
Κατεβάστε το
Για να εισάγουμε στον κόσμο το σκορ, θα χρειαστούμε μια νέα κλάση αντικειμένων. Θα την ονομάσουμε Scoreboard. Μέσα σε αυτή την κλάση θα χρησιμοποιήσουμε τον παρακάτω κώδικα.
Kώδικας 9.1:
public class Scoreboard extends Actor { private static final Color TEXT_COLOR = new Color(200, 0, 0); private static final Color TRANSPARENT_COLOR = new Color(0, 0, 0, 0); public Scoreboard() { updateImage(); } public void act() { updateImage(); } private void updateImage() { String text = "Score:"; GreenfootImage image = new GreenfootImage(text, 30, TEXT_COLOR, TRANSPARENT_COLOR); setImage(image); } }
Στο Greenfoot μπορεί να δημιουργηθεί η εικόνα ενός κειμένου με την εντολή GreenfootImage αρκεί αυτή να έχει ορίσματα το κείμενο (text), το μέγεθος του κειμένου (30 στη συγκεκριμένη περίπτωση) και δύο χρώματα ένα για το χρώμα των γραμμάτων και ένα για το χρώμα που θα φαίνεται στον φόντο. Τα χρώματα είναι αντικείμενα της κλάσης Color: new Color(200, 0, 0);
Η εντολή αυτή σημαίνει πως δημιουργείται ένα χρώμα με πολύ κόκκινο χρώμα (τιμή 200 με μέγιστη τιμή 255), καθόλου πράσινο και καθόλου μπλε (μοντέλο RGB). Το χρώμα πίσω από τα γράμματα ορίζεται σε διαφανές αφού η τέταρτη τιμή που είναι το κατά πόσο το χρώμα είναι ορατό, είναι 0. Η εντολή setImage βάζει αυτή την εικόνα που δημιουργήθηκε σαν εικόνα της μορφής.
Μπορείτε να βάλετε ένα αντικείμενο Scoreboard μέσα στον κόσμο και θα δείτε ότι όπου το τοποθετήσετε θα εμφανιστεί η λέξη Score. Αν θέλετε να εμφανίζεται αυτόματα θα πρέπει να εισάγετε μέσα στον κώδικα του κόσμου την εντολή: addObject(new Scoreboard(),500,350);
Σε αυτή τη φάση το αντικείμενο Scoreboard δεν εμφανίζει το πραγματικό σκορ αλλά μόνο την λέξη Score. Χρειάζεται να πάρουμε το score από την κλάση star για να εμφανίζεται και αυτό. Μια λύση θα μπορούσε να ήταν να αλλάξουμε την δήλωση της μεταβλητής score από private σε public και να αλλάξουμε την γραμμή String text = "Score: "; σε String text = "Score: " + star.score;
Μια τέτοια λύση δεν προτείνεται στον αντικειμενοστραφή προγραμματισμό με την Java όπου προσπαθούμε να περιορίσουμε τα πιθανά προβλήματα. Δεδομένου ότι το σκορ αλλάζει μόνο από αντικείμενα της κλάσης star, δεν είναι ανάγκη να δώσουμε την δυνατότητα σε άλλα αντικείμενα να αλλάξουν αυτή την μεταβλητή, χρησιμοποιώντας public μεταβλητές. Μια καλύτερη λύση είναι να γυρίσουμε στην κλάση star και να υλοποιήσουμε μια νέα μέθοδο, την getScore.
Kώδικας 9.2:
public static int getScore() { return score; }
Μια μέθοδος μπορεί να επιστρέφει μια τιμή. Η μέθοδος getScore επιστρέφει τιμή ακεραίου και συγκεκριμένα την τιμή score (return score). Μάλιστα αφού η μεταβλητή score αφορά την κλάση star και όχι κάθε αντικείμενο ξεχωριστά το ίδιο δηλώνουμε και για την συνάρτηση getScore (δήλωση static). Τέλος η συνάρτηση getScore θέλουμε να καλείται και από άλλα αντικείμενα και γι’ αυτό τον λόγο την ορίζουμε public. Η τελική συνάρτηση updateImage της κλάσης Scoreboard φαίνεται παρακάτω:
Kώδικας 9.3:
private void updateImage() { String text = "Score: " + star.getScore(); GreenfootImage image = new GreenfootImage(text, 30, TEXT_COLOR, TRANSPARENT_COLOR); setImage(image); }
Δεδομένου ότι η συνάρτηση getScore είναι δημόσια και στατική μπορούμε να την καλέσουμε με star.getScore().