Βελώνης Γεώργιος Καθηγητής Πληροφορικής ΠΕ20 1 ο ΕΠΑΛ Κατερίνης Έκδοση 1 η Απρίλιος 2017
Τι είναι το Greenfoot Το Greenfoot είναι ένα Ολοκληρωμένο Περιβάλλον Ανάπτυξης Εφαρμογών (IDE) που έχει ως σκοπό τη διδασκαλία του Αντικειμενοστρεφούς προγραμματισμού με τη γλώσσα Java. Με το Greenfoot μπορεί να δημιουργηθεί ένας κόσμος (world), μέσα στον οποίο αλληλεπιδρούν μορφές (actors), με τις οποίες μπορούν να προγραμματιστούν παιχνίδια, προσομοιώσεις και άλλα προγράμματα με γραφικά.
Βασικές κλάσεις (1/2) Οι βασικές κλάσεις που συναντάμε στον προγραμματισμό παιχνιδιών & προσομοιώσεων με το Greenfoot είναι οι παρακάτω: World: περιλαμβάνει μεθόδους για τη δημιουργία και διαχείριση του κόσμου (επιπέδων) του παιχνιδιού. Actor: περιλαμβάνει μεθόδους για τη διαχείριση των χαρακτήρων του παιχνιδιού. GreenfootImage: περιλαμβάνει μεθόδους για την αναπαράσταση και τη διαχείριση εικόνων, οι οποίες μπορεί να χρησιμοποιούνται είτε για τα επίπεδα του παιχνιδιού είτε για τους χαρακτήρες, τη δημιουργία κίνησης και εφέ.
Βασικές κλάσεις (2/2) GreenfootSound: περιλαμβάνει μεθόδους για τον χειρισμό της αναπαραγωγής ήχου. Greenfoot: περιλαμβάνει μεθόδους για την επικοινωνία με το ίδιο το περιβάλλον προγραμματισμού. MouseInfo: χειρισμός των συμβάντων του παιχνιδιού.
Επιπρόσθετες κλάσεις Επιπλέον, έχουν δημιουργηθεί επιπρόσθετες κλάσεις που μπορούν να ενσωματωθούν σε ένα project και παρέχουν δυνατότητες, όπως: χρήση χαρτών Google Maps είτε για τον κόσμο του παιχνιδιού είτε ως χαρακτήρες. χρήση πληροφοριών καιρού για την τρέχουσα τοποθεσία ή οποιαδήποτε πόλη στον κόσμο, οι οποίες μπορούν ακόμα και να επηρεάσουν τη συμπεριφορά των χαρακτήρων του παιχνιδιού.
Περιβάλλον του Greenfoot (1/5) Όπως προαναφέρθηκε, το Greenfoot αποτελείται από έναν «κόσμο» (World) και τους «ηθοποιούς» ή «μορφές» (Actors) που δρουν πάνω σε αυτόν. Ο κόσμος καταλαμβάνει το μεγαλύτερο μέρος του παραθύρου, και ουσιαστικά αποτελεί τη βάση πάνω στην οποία ενεργούν οι ηθοποιοί. Στην άκρη του παραθύρου βλέπουμε την ιεραρχική δομή των κλάσεων (classes), στην οποία οργανώνονται ο κόσμος και οι μορφές.
Περιβάλλον του Greenfoot (2/5) Οι κλάσεις είναι σύνολα αντικείμενων με ίδιες ιδιότητες, τα οποία μπορούν να ανήκουν σε ένα άλλο σύνολο με κοινές ιδιότητες. Για παράδειγμα σε μια τάξη «όχημα», μπορούμε να δημιουργήσουμε υπο-κλάσεις «αυτοκίνητο» και «μοτοσικλέτα». Αυτές οι δύο υπο-κλάσεις θα έχουν όλες τις ιδιότητες του οχήματος συν τις δικές τους. Πατώντας πάνω σε μία κλάση, μπορούμε να την εισάγουμε χειροκίνητα στον κόσμο (γίνεται και αυτόματα με κώδικα), να τη διαγράψουμε, ή να προσθέσουμε κώδικα.
Περιβάλλον του Greenfoot (3/5) Τελευταίο μέρος του παραθύρου είναι η κονσόλα χειρισμού, που βρίσκεται στο κάτω μέρος της οθόνης και διαθέτει διάφορες επιλογές: Run: εκτέλεση του σεναρίου Speed (Μπάρα κύλισης ταχύτητας): ορισμός της ταχύτητας εκτέλεσης Act: εκτέλεση ενός συγκεκριμένου τμήματος εντολών Reset: εκκίνηση της εκτέλεσης από την αρχή
Περιβάλλον του Greenfoot (4/5) Ένας πεπερασμένος χώρος όπου το πρόγραμμά μας τρέχει. Χώρος όπου μπορούμε να εισαγάγουμε κάποιες μορφές (actors). Επιτρέπει τις μορφές να αλληλεπιδρούν. Κόσμος (World) Διάγραμμα Κλάσεων (Class Diagram) Εργαλεία Εκτέλεσης (Execution Controls)
Περιβάλλον του Greenfoot (5/5) Η υπερκλάση World υπάρχει πάντα στα σενάρια Greenfoot και είναι ενσωματωμένη. Η TurtleWorld (υποκλάση) αντιπροσωπεύει έναν συγκεκριμένο κόσμο γι αυτό το σενάριο Τα βέλη δείχνουν σχέσεις Οι Lettuce, Animal και Counter είναι υποκλάσεις της Actor (υπερκλάση) Οι Snake, Turtle και Bug είναι υποκλάσεις της Animal
Αντικείμενα και Κλάσεις 3. Κλικ στον κόσμο Στιγμή της κλάσης Wombat 2. Κλικ new Wombat() Κλάση Wombat 1. Δεξί κλικ πάνω στο Wombat Κατασκευαστής
Πολλαπλά Αντικείμενα Μπορούμε να δημιουργήσουμε πολλές στιγμές της ίδιας κλάσης. Για να τοποθετήσουμε περισσότερα από ένα αντικείμενα (μορφές) της ίδιας κλάσης, πατάμε το Shift (εμφανίζει τη μορφή) και στη συνέχεια κάνουμε κλικ στις θέσεις που επιθυμούμε να τοποθετηθούν. Η θέση μιας μορφής μπορεί να αλλάξει αν τη σύρουμε με το ποντίκι.
Προβολή Κατάστασης (Ιδιότητες) Object Inspector Εμφάνιση παραθύρου ιδιοτήτων
Προβολή μεθόδων Μέθοδοι που κληρονομούνται από την κλάση Actor Μέθοδοι της κλάσης Wombat
Μορφές (Actors) Η προκαθορισμένη κατάσταση των «Actors» είναι: Εικόνα Θέση στον κόσμο (ως προς τους άξονες x και y) Περιστροφή Εικόνα Θέση Περιστροφή
Αλλαγής της γλώσσας διεπαφής Μενού του Greenfoot Edit Preferences καρτέλα Interface και από το αναδυόμενο μενού Language Greek και ΟΚ. Κλείνουμε το Greenfoot και το ξανανοίγουμε.
Δημιουργία νέου σεναρίου Scenario New πηγαίνουμε στο φάκελο που θέλουμε και δίνουμε το όνομα του σεναρίου μας (στην πραγματικότητα δημιουργείται φάκελος που θα περιέχει όλα τα απαραίτητα αρχεία για το σενάριό μας) πατάμε το κουμπί Create.
Δημιουργία νέου κόσμου Για να δημιουργήσουμε έναν νέο Κόσμο: δεξί κλικ πάνω στο World New Subclass δίνουμε όνομα διαλέγουμε εικόνα ΟΚ. Αρχικά το πλαίσιο έχει αυτή τη μορφή Κλικ στο κουμπί Compile Η εικόνα μπαίνει στο φόντο του κόσμου και το πλαίσιο αλλάζει μορφή
Δημιουργία νέας μορφής Για να δημιουργήσουμε μία «μορφή» - κλάση: δεξί κλικ πάνω στο Actor New Subclass δίνουμε όνομα διαλέγουμε εικόνα ΟΚ. Επαναλαμβάνουμε την παραπάνω διαδικασία για όλες τις κλάσεις που θέλουμε να δημιουργήσουμε. Κλικ στο κουμπί Compile Πλέον είμαστε έτοιμοι να δημιουργήσουμε όσες στιγμές της κλάσης επιθυμούμε
Αποθήκευση Κόσμου Για να μη χάνονται οι μορφές μέσα στον Κόσμο κάθε φορά που κάνουμε Compile, πρέπει αυτός να αποθηκευτεί. Μενού Controls Save the World
Αποθήκευση σεναρίου Για να αποθηκεύσουμε ένα σενάριο, πηγαίνουμε στο μενού Scenario Save. Αν θέλουμε να αποθηκεύσουμε ένα αντίγραφο του σεναρίου, τότε κάνουμε χρήση της επιλογής Save As, όπου θα επιλέξουμε τη θέση και το όνομα του σεναρίου. Τέλος θα κάνουμε κλικ στο κουμπί Save.
Άνοιγμα σεναρίου Για να ανοίξουμε ένα υπάρχων σενάριο, πηγαίνουμε στο μενού Scenario Open επιλέγουμε το σενάριο κλικ στο κουμπί Open. Μπορούμε να ανοίξουμε πιο γρήγορα πρόσφατα σενάριά μας από το μενού Scenario Open recent
Κλείσιμο σεναρίου Για το κλείσιμο ενός σεναρίου πηγαίνουμε στο μενού Scenario Close.
Ορισμός και χρήση Μεθόδων (1/2) Οι μέθοδοι είναι μικρές προγραμματιστικές μονάδες (modules) που καθορίζουν την συμπεριφορά ενός αντικειμένου. Τα βασικά μέρη από τα οποία αποτελείται μία μέθοδος είναι τα εξής: Το όνομα της μεθόδου H λίστα των παραμέτρων Ο τύπος της τιμής που επιστρέφει η μέθοδος. Aν η μέθοδος δεν επιστρέφει τιμή ο τύπος της είναι void. Το κυρίως σώμα της μεθόδου (που είναι μέσα σε άγκιστρα) Σύνταξη: τύπος όνομα_μεθόδου(λίστα_παραμέτρων) { } δηλώσεις και εντολές
Ορισμός και χρήση Μεθόδων (2/2) Η εντολή που επιστρέφει τιμή Παράδειγμα: public boolean atworldedge() { if(getx() < 20 getx() > getworld().getwidth() - 20) return true; if(gety() < 20 gety() > getworld().getheight() - 20) return true; else return false; }
Μέθοδος act() Η μέθοδος act() υπάρχει στον πηγαίο κώδικα όλων των αντικειμένων του Greenfoot και καλείται (εκτελείται) για όλα τα αντικείμενα του Κόσμου κάθε φορά που κάνουμε κλικ στο κουμπί εκτέλεσης Act ή Run. Το κουμπί Act εκτελεί τον κώδικα μία φορά, ενώ το κουμπί Run επαναλαμβάνει τον κώδικα της μεθόδου Act μέχρι να πατήσουμε το κουμπί Pause. public void act() { //Εδώ γράφουμε τις εντολές που καθορίζουν τις ενέργειες // που το αντικείμενο πρέπει να πραγματοποιεί όταν // εκτελείται η act. }
Προσθήκη κώδικα σε αντικείμενο Διπλό κλικ στο πλαίσιο της κλάσης ή δεξί κλικ Open editor Τοποθετούμε π.χ. την εντολή move() (κινήσου) μέσα στη μέθοδο act() και μετά κλικ στο κουμπί Compile Πως θα αυξήσουμε την ταχύτητα του αντικειμένου;
Προβολή τεκμηρίωσης Σύνοψη μεθόδων Εναλλαγή μεταξύ πηγαίου κώδικα και τεκμηρίωσης
Μεταγλώττιση (Compilation) (1/2) Για κάθε συγγραφή ή αλλαγή κώδικα πρέπει να πατήσουμε Compile για να δούμε αν έχουμε συντακτικά λάθη και να τα διορθώσουμε. Πιθανά συντακτικά λάθη: Μη κλείσιμο αγκυλών {} ή παρενθέσεων (), οι οποίες πρέπει να είναι ζευγάρια. Κάθε εντολή πρέπει να υπακούει στο συντακτικό και τη γραμματική του Greenfoot, π.χ. move(1) και όχι Move(1) (δηλ. τα γράμματα πρέπει να είναι πεζά ή κεφαλαία όπου ακριβώς πρέπει) και να τελειώνει με το χαρακτήρα «;». Όταν κάνουμε μεταγλώττιση, στο κάτω μέρος της οθόνης το Greenfoot εμφανίζει τυχόν συντακτικά λάθη, τα οποία μπορούμε να διορθώσουμε και να μεταγλωττίσουμε ξανά το πρόγραμμά μας.
Μεταγλώττιση (Compilation) (2/2) Compilation με συντακτικά λάθη Compilation χωρίς συντακτικά λάθη
Εκτέλεση προγράμματος Όπως προαναφέραμε, το πρόγραμμα (αφού πρώτα γίνει Compile) εκτελείται με τα κουμπιά Act ή Run. Πατώντας Run, η πασχαλίτσα μετακινείται ως το τέλος του Κόσμου
Εντολές: Δημιουργία πλέγματος στο υπόβαθρο Η μέθοδος super, δημιουργεί πλέγμα στο υπόβαθρο (κόσμο) με χαρακτηριστικά αυτά που δηλώνονται μέσα στην παρένθεση (παράμετροι). Σύνταξη: super(αριθμός κελιών οριζοντίως, αριθμός κελιών καθέτως, μέγεθος κελιών); Ανοίγουμε τον editor για το υπόβαθρο (εντολή Open editor) και αλλάζουμε τις παραμέτρους της εντολής super. Παράδειγμα: public background() { } super(600, 400, 1);
Εντολές: Μετακίνηση αντικειμένου Με την μέθοδο move(), το αντικείμενο μετακινείται προς την κατεύθυνση που κοιτάει, τόσες μονάδες όσες δηλώνει η παράμετρος. Η μονάδα εκφράζεται σε σχέση το μέγεθος του κελιού, π.χ. η move(1); κινεί το αντικείμενο κατά 1 κελί. Η αρνητική τιμή παραμέτρου, το μετακινεί προς την αντίθετη κατεύθυνση. Σύνταξη: move(αριθμός κελιών); Παράδειγμα: public class ladybug extends Actor { } public void act() { } move(5);
Εντολές: Στροφή αντικειμένου Με την μέθοδο turn() μπορούμε να καθορίσουμε πόσες μοίρες θα περιστραφεί η μορφή (δεξιόστροφα). Η κατεύθυνση περιστροφής αλλάζει βάζοντας αρνητικές τιμές στις παραμέτρους. Σύνταξη: turn(μοίρες); Παράδειγμα: public class ladybug extends Actor { } public void act() { } turn(90); https://www.dreamstime.com/stock-photo-compass-image289770
Εντολές: Εμφάνιση τιμών Η εντολή System.out.println(), εμφανίζει ένα παράθυρο με τίτλο «Greenfoot: Terminal Window» και παίρνει ως παράμετρο μια έκφραση (μεταβλητή, σταθερά κ.λπ.), της οποίας εμφανίζει την τιμή. Σύνταξη: System.out.println(έκφραση); Παράδειγμα: public class ladybug extends Actor { } public void act() { } System.out.println( Hello!!! );
Εντολές: Παραγωγή τυχαίων αριθμών Η εντολή Greenfoot.getRandomNumber(), επιστρέφει έναν τυχαίο αριθμό από το μηδέν μέχρι το όριο που ορίζεται ως τιμή της παραμέτρου και είναι ένας ακέραιος αριθμός (int). Μπορούμε να δούμε πώς λειτουργεί η εντολή αυτή χρησιμοποιώντας την εντολή System.out.println. Σύνταξη: Greenfoot.getRandomNumber(όριο); Παράδειγμα: public class ladybug extends Actor { public void act() { System.out.println(Greenfoot.getRandomNumber(60)); } }
Εντολές: Επιλογή (1/2) Η εντολή χρησιμοποιεί τις δεσμευμένες λέξεις ( if και else ). Η δομή επιλογής if / else επιτρέπει στο προγραμματιστή να καθορίσει μια ενέργεια που θα εκτελεστεί όταν η συνθήκη είναι αληθής και μια διαφορετική ενέργεια που θα εκτελεστεί όταν η συνθήκη θα είναι ψευδής. Σύνταξη: if (συνθήκη){ if (συνθήκη){ εντολή-ές; εντολή-ές; } } else { εντολή-ές; } Τελεστές σύγκρισης: > (μεγαλύτερο) < (μικρότερο) >= (μεγαλύτερο ή ίσο) <= (μικρότερο ή ίσο) == (ίσο)!= (διάφορο)
Εντολές: Επιλογή (2/2) Παράδειγμα: public class ladybug extends Actor { } public void act() { } move(5); if (Greenfoot.getRandomNumber(100)>50) { } turn(90); Η πασχαλίτσα στρίβει μόνο αν ο τυχαίος αριθμός είναι μεγαλύτερος του 50. Όμως αυτό δεν ξέρουμε πότε θα συμβεί δεδομένου ότι η μέθοδος Greenfoot.getRandomNumber() παράγει έναν τυχαίο αριθμό κάθε φορά. Έτσι, η πασχαλίτσα κάνει μια τυχαία κίνηση μέσα στο πλέγμα.
Εντολές: Έλεγχος επαφής Η μέθοδος istouching(), παίρνει τιμή «αλήθεια» αν το αντικείμενό μας ακουμπά ένα άλλο αντικείμενο. Σύνταξη: istouching(όνομα_κλάσης.class); Παράδειγμα: move(5); if (Greenfoot.getRandomNumber(100)>80) { } turn(90); if (istouching(bomb.class)){ } System.out.println("Επαφή με αντικείμενο!!!");
Εντολές: Εξαφάνιση αντικειμένου Η μέθοδος removetouching(), εξαφανίζει το αντικείμενο που έρχεται σε επαφή με το αντικείμενό μας. Σύνταξη: removetouching(όνομα_κλάσης.class); Παράδειγμα: move(5); if (Greenfoot.getRandomNumber(100)>80) { } turn(90); if (istouching(bomb.class)){ } removetouching(bomb.class);
Εντολές: Δημιουργία νέου αντικειμένου (1/2) Η μέθοδος addobject(), δημιουργεί ένα αντικείμενο μιας κλάσης και το τοποθετείται σε συγκεκριμένη θέση στο πλέγμα. Με την εντολή αυτή δεν θα χρειάζεται να βάζουμε τα αντικείμενα χειροκίνητα κάθε φορά αλλά θα εμφανίζονται αυτόματα κάθε φορά που πατάμε Compile. Η εντολή addobject εκτελείται μέσα στον κατασκευαστή του world (δεξί κλικ στην υποκλάση του world και επιλέγουμε Open Editor). Σύνταξη: addobject(new όνομα_κλάσης(), θέση x, θέση y);
Εντολές: Δημιουργία νέου αντικειμένου (2/2) Παράδειγμα: public class background extends World{ public background() { super(600, 400, 1); addobject(new bomb(), 150, 150); prepare(); }. }
Εντολές: Τοποθέτηση αντικειμένου σε συγκεκριμένη θέση Η μέθοδος setlocation(), τοποθετείται το αντικείμενο που εκτελεί τον κώδικα στη συγκεκριμένη θέση. Σύνταξη: setlocation(θέση οριζόντια, θέση κατακόρυφα); Παράδειγμα: public class ladybug extends Actor { public void act() { 50 int x = getx(); int y = gety(); //move 50 to right setlocation(x + 50, y); } Έχει οριστεί 1 κελί = 1 pixel }
Εντολές: Έλεγχος πληκτρολογίου (1/3) Για την ανάκτηση εισόδου από το πληκτρολόγιο, χρησιμοποιούνται οι μέθοδοι getkey() και iskeydown(), οι οποίες επιστρέφουν/κατανοούν τα ακόλουθα ονόματα πλήκτρων: "a", "b",.., "z" (αλφαβητικά πλήκτρα), "0".."9" (ψηφία), τα περισσότερα σημεία στίξης. Η getkey() επιστρέφει επίσης κεφαλαίους χαρακτήρες όταν χρειάζεται. "up", "down", "left", "right" (τα cursor keys) "enter", "space", "tab", "escape", "backspace", "shift", "control" "F1", "F2",.., "F12" (τα function keys)
Εντολές: Έλεγχος πληκτρολογίου (2/3) Η εντολή που επιτρέπει τη χρήση του πληκτρολογίου είναι η Greenfoot.isKeyDown(). Η μέθοδος iskeydown() σημαίνει «Είναι το πλήκτρο πατημένο» χωρίς να αναφέρεται σε κάποιο πλήκτρο συγκεκριμένα. Το πλήκτρο δηλώνεται μέσα στην παρένθεση και μπορεί να είναι οποιοδήποτε πλήκτρο του πληκτρολογίου. Για να χρησιμοποιήσουμε για παράδειγμα τα βελάκια, μέσα στην παρένθεση θα πρέπει να βάλουμε τις λέξεις: "up", "down", "left" και "right". Σύνταξη: Greenfoot.isKeyDown("String key"); Παράδειγμα: if (Greenfoot.isKeyDown("left")) { } turn(-90);
Εντολές: Έλεγχος πληκτρολογίου (3/3) Η μέθοδος getkey() επιστρέφει την τιμή του πλήκτρου που έχει πατηθεί. Αν δε πατηθεί κάποιο πλήκτρο η τιμή που επιστρέφει είναι null. Σύνταξη: Greenfoot.getKey(); Παράδειγμα: if (Greenfoot.getKey() == "up") { } setlocation(getx(), gety() - 1); setrotation(270);
Εντολές: Αναπαραγωγή ήχου Η μέθοδος για την αναπαραγωγή ήχου στο Greenfoot είναι η playsound(). Σύνταξη: Greenfoot.playSound("path/όνομα_αρχείου"); Παράδειγμα: if (istouching(bomb.class)){ removetouching(bomb.class); Greenfoot.playSound("blow.wav"); }
Εντολές: Τερματισμός προγράμματος Μπορούμε να σταματήσουμε την εκτέλεση της εφαρμογής μας οποιαδήποτε στιγμή επιθυμούμε. Αυτό μπορεί να γίνει με την μέθοδο stop(). Σύνταξη: Greenfoot.stop(); Παράδειγμα: void touchingbomb(){ } if (istouching(bomb.class)) { } removetouching(bomb.class); Greenfoot.stop();
Εκτέλεση κώδικα συγκεκριμένης μεθόδου 1. Δεξί κλικ στη ladybug Το αντικείμενο θα εκτελέσει τις εντολές που περιέχει η μέθοδος act(), δηλαδή θα κινηθεί, θα στρίψει κ.λπ. 2. Επιλογή μεθόδου act()
Επιστροφή τιμών 1. Δεξί κλικ στη ladybug κατάδειξη Inherit from Actor 3. Επιστροφή της θέσης του αντικειμένου στο πλέγμα στον άξονα x 2. Επιλογή μεθόδου getx()
Αλληλεπίδραση με αντικείμενα 1. Δεξί κλικ στη ladybug κατάδειξη Inherit from Actor 3. Ορισμός περιστροφής του αντικειμένου κατά 180 ο 2. Επιλογή μεθόδου turn()
Διαγραφή αντικειμένου Διαγραφή μορφής
Σύνοψη μεθόδων: Κλάση World (1/2)
Σύνοψη μεθόδων: Κλάση World (2/2)
Σύνοψη μεθόδων: Κλάση Actor (1/2)
Σύνοψη μεθόδων: Κλάση Actor (2/2)
Σύνοψη μεθόδων: Κλάση Greenfoot (1/2)
Σύνοψη μεθόδων: Κλάση Greenfoot (2/2)
Σύνοψη μεθόδων: Κλάση MouseInfo
Σύνοψη μεθόδων: Κλάση GreenfootImage (1/3)
Σύνοψη μεθόδων: Κλάση GreenfootImage (2/3)
Σύνοψη μεθόδων: Κλάση GreenfootImage (3/3)
Πηγές Greenfoot (https://www.greenfoot.org/home) Τα πρώτα βήματα με το Greenfoot Νικολός Δημήτριος Introduction to Programming - Greenfoot by Michael Kölling Greenfoot API - Michael Kölling Greenfoot: An Introduction to OOP Adrienne Decker, Stephanie Hoeppner, Fran Trees PCSTEPS (https://www.pcsteps.gr/130637-εισαγωγήστη-java-για-αρχάριους/)