Κεφάλαιο+9

=Το ολοκληρωμένο βιβλίο για το Microsoft Kodu βρίσκεται στη διεύθυνση http://www.koduplay.gr=

Ομάδα 5 Γιαννόπουλος Μενέλαος Κράντα Μαριέτα

include component="comments" page="Κεφάλαιο 9" limit="10"

Κεφάλαιο 9 :

09_games :

__9.1 Aλλαγή συμπεριφοράς__

Ως τώρα, η συμπεριφορά που δίνατε στα αντικείμενα του κόσμου σας ήταν σταθερή, δηλαδή, τα αντικείμενα είχαν την ίδια συμπεριφορά σε όλη τη διάρκεια του προγράμματος. Εμείς προγραμματίζαμε ένα σύνολο ενεργειών που προκαλούνταν εφόσον ενεργοποιούνταν οι αντίστοιχοι αισθητήρες και οι συμπεριφορές αυτές παρέμεναν καθ’όλη τη διάρκεια των παιχνιδιών μας. Αν όμως θέλαμε να αλλάξουμε τη συμπεριφορά κάποιου αντικειμένου κατά τη διάρκεια του παιχνιδιού (π.χ. ο χρήστης να χάνει τον έλεγχο του Kodu για λίγα δευτερόλεπτα όταν αυτός φάει ένα δηλητηριασμένο μήλο), πώς θα μπορούσαμε να το κάνουμε? Ένα παράδειγμα, για να καταλάβετε καλύτερα την αλλαγή της συμπεριφοράς είναι να θυμηθείτε το παιχνίδι super mario που αναφέρθηκε και στο πρώτο κεφάλαιο. Όταν ο super mario τρώει ένα λουλούδι, αποκτά τη δυνατότητα να πετάει σφαίρες. Πώς θα μπορούσαμε να προσθέσουμε αυτή τη συμπεριφορά σε ένα αντίστοιχο αντικείμενο του δικού μας προγραμματιστικού περιβάλλοντος; Χμ..δεν είναι εύκολο και αυτό γιατί εμείς ορίζουμε συμπεριφορές χρησιμοποιώντας αισθητήρες (//Bλέπω (see)//, //Ακούω (hear)//, //Πέφτω πάνω (bump)// κτλ) που ενεργοποιούνται επαναλαμβανόμενα κατά τη διάρκεια του έργου. Δεν μπορούμε να δώσουμε στις συμπεριφορές μας κάποιο χρόνο ζωής και μετά να τις αλλάξουμε…Ή μήπως μπορούμε; Πράγματι, το MSΚodu έχει μηχανισμό που να επιτρέπει την αλλαγή συμπεριφοράς των αντικειμένων σε διαφορετικές στιγμές του προγράμματος. Σύμφωνα με το μηχανισμό αυτό, Α) κάθε αντικείμενο μπορεί να έχει διαφορετικά σύνολα συμπεριφορών. Κάθε σύνολο συμπεριφορών δημιουργείται μέσα σε μια «//σελίδα//» (//page//) συμπεριφοράς . Το MSΚodu επιτρέπει σε ένα αντικείμενο να έχει μέχρι δώδεκα διαφορετικά σύνολα εντολών δηλαδή μέχρι δώδεκα σελίδες συμπεριφορών. Β) κάθε στιγμή στο πρόγραμμα εκτελείται μια και μόνο σελίδα συμπεριφορών για κάθε αντικείμενο, δηλαδή κάθε αντικείμενο έχει ένα από τα δώδεκα δυνατά σύνολα συμπεριφορών, Γ) ο προγραμματιστής μπορεί να ορίζει ποιο σύνολο συμπεριφορών θέλει να ενεργοποιείται κάθε στιγμή με τη χρήση της ενέργειας «//Αλλαγή σελίδας//» (//Switch Page//) και προσδιοριστικό την αντίστοιχη σελίδα εντολών που επιθυμεί.

Ας δούμε αυτά τα τρία στοιχεία λίγο πιο αναλυτικά. Όταν προγραμματίζετε κάποιο αντικείμενο έχετε δει πάνω πάνω στο παράθυρο ένα εικονίδιο που περιέχει έναν αριθμό και δύο βελάκια, ένα που δείχνει προς τα δεξιά και ένα άλλο που δείχνει προς τα αριστερά; 

Αυτό το παράθυρο μας υποδηλώνει ότι βρισκόμαστε στη σελίδα συμπεριφορών με τον αριθμό ένα. Δηλαδή σε όλα τα προηγούμενα κεφάλαια, προγραμματίζαμε τα αντικείμενά μας στην πρώτη σελίδα συμπεριφορών τους, αυτή που εκτελείται πάντα πρώτη όταν ξεκινά ένα παιχνίδι. Γι'αυτό και όπως βλέπουμε η πρώτη σελίδα περιέχει κάποιες γραμμές κώδικα. Πατήστε τα βελάκια για να μετακινηθείτε στην επόμενη ή στην προηγούμενη σελίδα. Αν πατήσετε το δεξί βέλος θα δείτε την επόμενη εικόνα, τη σελίδα με τον αριθμό δύο :



ενώ αν πατήστε το αριστερό θα μετακινηθείτε τελευταία σελίδα που έχει το Kodu, και είναι η σελίδα δώδεκα :



Παρατηρήστε, ότι όταν αλλάζετε σελίδα, ο επεξεργαστής εντολών μένει κενός, ενώ όταν επιστρέφετε στη σελίδα ένα, παρουσιάζει τις εντολές που είχατε εισάγει. Λογικό; Μα φυσικά, αφού δεν έχουμε ορίσει άλλα σύνολα συμπεριφορών μέχρι αυτό το κεφάλαιο.

Ας δούμε μερικά παραδείγματα για να καταλάβουμε καλύτερα την //Aλλαγή σελίδας// (//Switch page//). Έστω ότι ο Kodu βρίσκεται σε ένα δάσος με δηλητηριώδη πράσινα //Μήλα (apple)// και αθώα νόστιμα κόκκινα //Μήλα (apple)//. Ο Kodu θα πρέπει να μετακινείται με τα βελάκια του πληκτρολογίου. Όταν //Πέσει πάνω (bump)// σε ένα κόκκινο μήλο θα το μαζεύει, ενώ αν πέσει πάνω σε ένα δηλητηριασμένο πράσινο μήλο ο παίχτης θα χάνει τον έλεγχο για λίγο (δηλαδή ο Kodu δεν θα μετακινείται με βάση τα βελάκια) και ο ήρωάς μας θα //Περιφέρεται (wander)// τυχαία στο δάσος. Το παιχνίδι θα είναι δύσκολο καθώς τα καλά και τα δηλητηριασμένα μήλα θα είναι τόσο κοντά που θα είναι αρκετά δύσκολο ο Kodu να πέσει πάνω σε ένα κόκκινο μήλο αποφεύγοντας το δηλητηριασμένο. Στόχος του Kodu είναι να μαζέψει όλα τα καλά μήλα και να αποφύγει τα δηλητηριασμένα μέσα σε ένα λεπτό. Πως θα μπορούσαμε να υλοποιήσουμε το συγκεκριμένο παιχνίδι; Πως θα μπορούσαμε να προγραμματίσουμε τον Kodu ώστε να μην «αισθάνεται» το πληκτρολόγιο για κάποιο χρονικό διάστημα; Μήπως τώρα βλέπετε την ανάγκη της αλλαγής σελίδας? Ας κάνουμε το παράδειγμα να το κατανοήσετε πιο καλά.

//__Δημιουργία κόσμου :__//Αρχικά βλέπουμε ότι το παιχνίδι μας αποτελείται από τρία αντικείμενα : ωφέλιμα κόκκινα μήλα, τα δηλητηριώδη πράσινα μήλα και τον Κodu. Σε αυτή τη φάση δε μας απασχολεί ο κόσμος του παιχνιδιού, απλά θα τοποθετήσουμε τα αντικείμενα σε μια επίπεδη πίστα. Ξεκινάμε λοιπόν και γεμίζουμε τον κόσμο με μήλα. Θα πρέπει ωστόσο να τηρήσουμε τη μικρή λεπτομέρεια που αναφέραμε παραπάνω, τα πράσινα με τα κόκκινα μήλα να είναι σε σχετικά κοντινή απόσταση μεταξύ τους ώστε να δυσκολευτεί ο παίχτης να πάρει το κόκκινα μήλα χωρίς να ακουμπήσει τα πράσινα. Τέλος τοποθετούμε στον κόσμο και τον Κodu. Οπότε ο κόσμος του παιχνιδιού θα πρέπει να μοιάζει κάπως έτσι :



Στα μήλα δε θα δώσουμε κάποια συμπεριφορά. Έτσι επόμενο βήμα είναι να προγραμματίσουμε τον Κodu.

__//Προγραμματισμός Κodu ://__ O Κodu έχει αρχικά τη συμπεριφορά που περιγράψαμε προηγουμένως. Θα πρέπει να μετακινείται με τα βελάκια του πληκτρολογίου και κάθε φορά που θα πέφτει σε ένα κόκκινο μήλο θα το εξαφανίζει (άρα χρειαζόμαστε το προσδιοριστικό ενέργειας //Ιt//(//αυτό//)). Το παιχνίδι θα τελειώνει όταν δεν υπάρχουν άλλα κόκκινα μήλα, άρα όταν ο Kodu δεν βλέπει άλλα μήλα. Συνεπώς, οι πρώτες γραμμές του κώδικα θα είναι οι εξής :



Υπάρχει όμως και η περίπτωση ο Κodu να πέσει πάνω σε πράσινο μήλο. Τότε, θέλουμε να αλλάζει η συμπεριφορά του δηλαδή θέλουμε να αλλάξουμε σελίδα συμπεριφοράς στο MSKodu! Θα χρειαστεί να χρησιμοποιήσουμε την ενέργεια //Άλλαξε σελίδα// (//Switch Page//). Όταν [σύγκρουση] [πράσινο μήλο] Τότε [άλλαξε σελίδα] [σελίδα δύο]

Ποια σελίδα εντολών θέλουμε όμως να ενεργοποιήσουμε; Η ενέργεια //Άλλαξε Σελίδα (Switch Page)// συνοδεύεται πάντα από το προσδιοριστικό της σελίδας που θέλουμε να ενεργοποιήσουμε.



Για να προσθέσουμε την αντίστοιχη ενέργεια επιλέγουμε Switch:



και στη συνέχεια επιλέγουμε τη σελίδα στην όποια θα προσθέσουμε τη νέα συμπεριφορά του Kodu. Στη συγκεκριμένη περίπτωση θα περιγράψουμε τη νέα συμπεριφορά του Kodu στη σελίδα δύο. Οπότε στο νέο παράθυρο που εμφανίζεται επιλέγουμε τη σελίδα δύο, όπως φαίνεται παρακάτω :



Έτσι στην πέμπτη γραμμή της πρώτης σελίδας, η ολοκληρωμένη εντολή θα είναι :



Μόλις δηλώσαμε στο πρόγραμμα μας ότι, όταν ο Kodu //πέσει πάνω (bump)// σε πράσινο μήλο, η συμπεριφορά του θα ορίζεται στη δεύτερη από τις δώδεκα σελίδες συμπεριφορών. Στη συνέχεια πηγαίνουμε στη δεύτερη σελίδα για να γράψουμε τη νέα συμπεριφορά του Kodu. Όπως παρατηρείτε είναι κενή. Αν παίξουμε το παιχνίδι μας χωρίς να προσθέσουμε τίποτε στη δεύτερη σελίδα, τότε όταν ο Kodu ακουμπήσει ένα πράσινο μήλο, θα ακινητοποιείται καθώς δε θα έχει καμία συμπεριφορά (μη ξεχνάτε ότι οι εντολές της πρώτης σελίδας δεν εκτελούνται πλέον για τον Kodu, μόνο αυτές της δεύτερης που είναι κενή). Πως θα προγραμματίσουμε τη δεύτερη σελίδα; Όταν //πέφτει πάνω (bump)// σε πράσινο μήλο ο παίχτης θα χάνει τον έλεγχο του Κodu, ο οποίος για δέκα δευτερόλεπτα θα //περιφέρεται (wander)// μέσα στο κόσμο του παιχνιδιού και ύστερα θα επιστρέφει στην αρχική σελίδα για να συνεχίσει να μαζεύει κόκκινα μήλα. Ο νέος κώδικας περιγράφεται στις παρακάτω γραμμές :



Στην πρώτη γραμμή η συνθήκη when είναι άδεια (μη ξεχνάτε ότι αυτό αντιστοιχεί στην ενέργεια //Πάντα// (//Always//)), διότι θέλουμε σε όλη τη διάρκεια της συμπεριφοράς του στη δεύτερη σελίδα να περιφέρεται. Χρησιμοποιώντας τον αισθητήρα του χρόνου και προσδιοριστικό τα δέκα δευτερόλεπτα, εκτελούμε την ενέργεια αλλαγής της συμπεριφοράς στη σελίδα ένα μετά από δέκα δευτερόλεπτα, οπότε και θα ξανα-αποκτήσει ο Kodu την αρχική του συμπεριφορά.

Μήπως καταλάβατε λίγο καλύτερα τη χρησιμότητα και την ανάγκη της //Αλλαγής σελίδας// (//Switch page//); Ας κάνουμε άλλο ένα μικρό παράδειγμα για σας λυθούν όλες οι απορίες. Αυτή τη φορά ο ήρωας του παιχνιδιού μας δεν είναι ο Kodu αλλά ο Ύπο. Ένα //Yποβρύχιο (sub)// που βρίσκεται σε έναν πολύ όμορφο βυθό λίμνης, γεμάτο από //Αστέρια (star)//, //Καρδιές (heart)// αλλά και πολλά //Ψάρια (fish)//.Ο ήρωας μας πάλι επιλέγουμε, όπως και στο προηγούμενο παιχνίδι, να κινέιται με τα βελάκαι του πληκτρολογίου. Κάθε καρδούλα και κάθε αστέρι δίνει στον Ύπο ένα βαθμό. Στόχος του Ύπο είναι να συγκεντρώσει είκοσι βαθμούς σε χρόνο δύο μιση λεπτών. Σε περίπτωση που ο Ύπο //Πέσει πάνω (bump)// σε κάποιο ψάρι, ακινητοποιείται και ο Ύπο και το ψάρι στο οποίο έπεσε πάνω. Ο Ύπο θα ακινητοποιηθεί για δέκα δευτερόπλεπτα ενώ το ψάρι μόνιμα. Δεν θα ξανακουνηθεί. Υπάρχει όμως και ένα μεγάλο πρόβλημα. Κάθε φορά που ο ήρωάς μας πέφτει πάνω σε κάποιο ψάρι, το ψάρι εκείνο εξαφανίζει είτε μία καρδούλα είτε ένα αστέρι από τον βυθό, μία φορά, με αποτέλεσμα ο Ύπο να έχει λιγότερες πιθανότητες να καταφέρει να κερδίσει το παιχνίδι και τα ψαράκια. Στο βυθό μαζί με τον Ύπο βρίσκονται είκοσι ψάρια, δεκαοκτώ καρδούλες και δεκατρία αστεράκια. Τι λέτε θα τα καταφέρει ο Ύπο; Πάμε να δημιουργήσουμε το παιχνίδι μας.

__//Δημιουργία κόσμου//__ : O ήρωας μας βρίσκεται σε υδάτινο περιβάλλον. Όποτε δημιουργούμε ένα όμορφο //τεραίν//(//terrain//), εδώ χρησιμοποιήσαμε την έβδομη επιλογή που δίνει το MSKodu, και το γεμίσαμε μέχρι πάνω με νερό. Μέχρι πάνω εννoούμε μέχρι να καλύψει πλήρως όλα τα αντικείμενα του κόσμου μας. Αλήθεια πόσα είναι τα αντικείμενα του κόσμου μας; Μέσα στο βυθό μαζί με τον Ύπο έχουμε τα ψάρια, τις καρδούλες και τα αστέρακια. Άρα ο κόσμος μας αποτελείται από τέσσερα αντικείμενα. Αφού δημιουργήσαμε την πίστα ας τοποθετήσουμε αρχικά τον Ύπο και στην συνέχεια τα είκοσι ψάρια, τις δεκαοκτώ καρδούλες και τα δεκατρία αστεράκια. Πρέπει να θυμόμαστε να μετράμε τα αντικείμενα που είναι περισσότερα του ενός, όταν θέλουμε συγκεκριμένο αριθμό, γιατί όπως έχουμε πει το MSKodu δε διαθέτει κάποιο μηχανισμό που να μετράει το πλήθος των αντικειμένων που έχουμε στο περιβάλλον του παιχνιδιού μας. Και αυτός είναι ο κόσμος του Ύπο:



Και τώρα ας προγραμματίσουμε τα αντικείμενά μας.

__//Προγραμματισμός Ύπο://__ Ο Ύπο θα κινείται με τα βελάκια, που προτιμάμε γιατί δηλώνουν κίνηση, οπότε είναι πιο εύκολο στον παίχτη να χειριστή τον ήρωά μας. Επίσης όταν θα πέφτει πάνω σε κάποια καρδιά ή αστέρι θα το εξαφανίζει και θα κερδίζει ένα πόντο για κάθε ένα απο τα δύο αντικείμενα που εξαφανίζει. Θα μπορούσαμε να δώσουμε εντολές στις καρδιές και στα αστέρια όταν πέφτουν πάνω στον Ύπο να εξαφανίζονται μόνα τους, έτσι δεν είναι; Απλά εμείς εδώ επιλέγουμε να δώσουμε αυτή τη συμπεριφορά στον Ύπο. Εσείς αν θέλετε μπορείτε να την δώσετε στα αντικείμενα του βυθού(καρδιές,αστέρια). Επίσης όταν ο Ύπο //πέφτει πάνω//(//bump//) σε κάποιο ψάρι, αλλάζει η συμπεριφορά του. Ακινητοποιείτε και τον βάζουμε να λάμπει. Αυτό γιατί μπορεί να το κάνουμε; Αυτή τη συμπεριφορά τη δίνουμε στον Ύπο για να ενημερώσει τον παίχτη, πως όση ώρα θα λάμπει, τόση ώρα θα είναι και ο ήρωας του παιχνιδιού μας ακινητοποιημένος. Οπότε ο παίχτης θα μπορέσει να ανακτήσει τον έλεγχο του Ύπο όταν περάσει ο χρόνος των δέκα δευτερολέπτων. Τότε και ο Ύπο θα σταματήσει να λάμπει. Συνεπώς αλλαγή συμπεριφοράς τι σημαίνει; //Αλλαγή σελίδας//(//Switch page//), φυσικά. Έτσι οι ενέργειες του υδρόβιου ήρωα μας εκφράζονται στις παρακάτω γραμμές της πρώτης σελίδας:



Πρίν πάμε να δώσουμε στη δεύτερη σελίδα τη νέα συμπεριφορά του 'Υπο ας ολοκληρώσουμε καλύτερα την πρώτη σελίδα. Τώρα οι μόνες εντολές που λέιπουν είναι αυτές που εκφράζουν πότε χάνει και πότε κερδίζει το παιχνίδι ο Ύπο. Κερδίζει όταν συγκεντρώσει είκοσι βαθμούς //πέφτωντας πάνω// (//bump//) σε καρδούλες ή αστεράκια, και χάνει το παιχνίδι όταν δεν καταφέρνει να συγκεντρώσει τους απαραίτητους βαθμούς σε χρόνο δυόμιση λεπτών. Συνεπώς η πρώτη σελίδα ολοκληρωμένη είναι:



Τώρα που ολοκληρώσαμε την πρώτη σελίδα του Ύπο ας πάμε να του δώσουμε και τις κατάλληλες εντολές για τη νέα του συμπεριφορα. Όταν πέφτει πάνω σε κάποιο ψάρι λάμπει και ακινητοποιείτε. Δηλαδή δε θα δωσουμε στον παίχτη τη δυνατότητα να κινεί τον Ύπο, ότι κουμπί και να πατήσει. Άρα δε θα έχουμε καμία εντολή που να επιτρέπει κίνηση. Επίσης για δέκα δευτερόλεπτα θα λάμπει και έπειτα θα επιστρέψει στην αρχική σελίδα για συνεχίσει προς την επίτευξη του στόχου του αφού πρώτα σταματήσει να λάμπει, για να ειδοποιήσει και τον παίχτη ότι έχει ξανά τον έλεγχο του ήρωα μας:

Και ο Ύπο είναι έτοιμος να κάνει παιχνίδι !!!!

Εκτός από τον Ύπο όμως και τα ψάρια έχουν συμπεριφορά στο παιχνίδι μας. Τα υπόλοιπα αντικείμενα δεν έχουν, αν και όπως αναφέραμε πιο πάνω θα μπορούσαν να έχουν. Αυτό είναι καθαρά στο χέρι του προγραμματιστή. Τα ψάρια όταν έρχονται σε επαφή με το υποβρύχιο ακινητοποιούνται και με τον αισθητήτα //βλέπω(see)// όταν δουνε κάποια καρδία ή αστέρι το εξαφανίζουν μία φορά. Δεν εξαφανίζει ένα ψάρι και τα δύο αντικείμενα. Κάποια από τα ψάρια θα εξαφανίζουν τις καρδούλες και κάποια τα αστεράκια. Για λόγους και εδώ διασκεδάσης, μη ξεχνάμε ότι γι'αυτο φτιάχνουμε τα παιχνίδια εκτός από το να μάθουμε, τα ψάρια όταν ακινητοποιούνται βγάζουν αστεράκια απο το κεφάλι τους !!! Μετά την εποφή με τον Ύπο τα ψάρια παραμένουν ακινητοποιημένα. Αλλά αν ο Ύπο ξαναπέσει πάνω τους θα ακινητοποιηθεί και πάλι και θα εξαφανιστεί και ένα από τα θεμιτά αντικείμενα για τον ήρωα μας. Στο παιχνίδι μας από τα είκοσι ψάρια, τα δεκατρία εξαφανίζουν καρδούλες και τα υπόλοιπα αστεράκια. Παρατηρούμε ότι και τα ψάρια αλλάζουν συμπεριφορά. Έτσι σε αυτό το παιχνίδι εκτός από τον Ύπο και τα ψάρια χρησιμοποιούν την //Aλλαγή σελίδας//(//Switch page//). Η πρώτη σελίδα σε όλα τα ψάρια θα είναι ίδια όπως επισημάναμε :



H δεύτερη σελίδα θα διαφέρει όπως είπαμε σε κάποια ψάρια. Σε αυτά που εξαφανίζουν τις καρδούλες η συμπεριφοράς τους εκφράζεται:



Ένω αυτά που εξαφανίζουν τα αστεράκια η συμπεριφορά τους είναι :



Και εδώ θα πρέπει να προγραμματίσετε ένα ένα και τα είκοσι ψάρια, όπως είπαμε: δεκαοκτώ εξαφανίζουν καρδούλες και δεκατρία αστεράκια. Τελικά θα κερδίσει ο ΎΠΟ; Για να δούμε....

Σε αυτό το κεφάλαιο ήρθαμε σε επαφή με μία καινούργια έννοια. Την έννοια της //Αλλαγή σελίδας// (//Switch page//). Ενώ μέχρι τώρα δίναμε στα αντικείμενα των παιχνιδιών μας σταθερές συμπεριφορές, είδαμε ότι μπορούμε να δώσουμε διαφορετικές συμπεριφορές στα αντικείμενα μας, αναλόγως με την αλληλεπίδραση που επιθυμούμε να έχουν μεταξύ τους. Δημιουργήσαμε λίγο πιο περίπλοκα παιχνίδια και είδαμε τα αντικείμενα να αλλάζουν τον κόσμο γύρω τους αλλά και τις ενεργειές τους. Τι λέτε; Πάμε να δημιουργήσουμε και να γεμίσουμε και άλλες σελίδες;

 9.2 Κατασκευή κλώνων (Creatables)

Οι περισσότεροι από εσάς θα έχετε ήδη παίξει τουλάχιστον ένα παιχνίδι στο οποίο οι εχθροί πολλαπλασιάζονται καθώς εσείς καθυστερείτε να επιτύχετε το στόχο σας! 'Eχετε αναρωτηθεί πώς θα μπορούσαμε να προγραμματίσουμε να εμφανίζονται νέα αντικείμενα και στο περιβάλλον του MSKodu;

Έστω ότι θέλετε να φτιάξετε ένα κλασικό παιχνίδι στο οποίο πρέπει να χτυπήσετε όλους τους αναδυόμενους «εχθρούς» που αυξάνονται με το πέρασμα του χρόνου (shoot ‘em up). Έχετε δημιουργήσει τον κόσμο του παιχνιδιού σας και έχετε προγραμματίσει τον κεντρικό ήρωα (Κodu). Ήρθε η ώρα να βάλετε τους εχθρούς. Μέχρι στιγμής, κάθε αντικείμενο που εμφανιζόταν στα παιχνίδια μας, είχε προηγουμένως δημιουργηθεί από εμάς κατά το σχεδιασμό του μέσω του εργαλείου Αντικειμένων. Δεν ήμασταν σε θέση να προγραμματίσουμε την εμφάνιση νέων αντικειμένων. Αν ένα αντικείμενο εξολοθρευόταν, τότε απλά έμεναν λιγότεροι εχθροί για τον ήρωά μας. Το Kodu όμως μας δίνει τη δυνατότητα να δημιουργήσουμε «αρχέτυπα» αντικείμενα, δηλαδή «πρότυπα» αντικείμενα τα οποία μπορούμε να αναπαράγουμε προγραμματιστικά μέσα στο παιχνίδι μας! Είμαστε δηλαδή σε θέση να δημιουργήσουμε έναν «πρότυπο» εχθρό» και στη συνέχεια να προγραμματίσουμε την επαναλαμβανόμενη εμφάνιση νέων εχθρών αυτού του τύπου κάτω από οποιεσδήποτε συνθήκες το επιθυμούμε!

Βασικές μας έννοιες για να τα καταφέρουμε είναι: Α) Το αρχέτυπο αντικείμενο. Για να φτιάξουμε ένα πρότυπο αντικείμενo το μόνο που χρειάζεται να κάνουμε στο αντικείμενο είναι να ενεργοποιήσουμε την ιδιότητα "creatable" σε αυτό και να προγραμματίσουμε την συμπεριφορά του όπως επιθυμούμε. Β) Η ενέργεια Δημιούργησε (Create). Η ενέργεια αυτή μπορεί να χρησιμοποιηθεί από οποιοδήποτε άλλο αντικείμενο του παιχνιδιού μας και να προκαλέσει τη δημιουργία αρχέτυπων αντικειμένων και όχι μόνο!

Ας δούμε πως μπορούμε να αξιοποιήσουμε αυτές τις δυνατότητες συνεχίζοντας το παιχνίδι μας!

Θα φτιάξουμε ένα εργοστάσιο το οποίο θα παράγει μοτοσυκλέτες. Θα το προγραμματίσουμε έτσι ώστε κάθε 10 δευτερόλεπτα να παράγεται μία μοτοσυκλέτα η οποία θα ακολουθεί προκαθορισμένη κυκλική πορεία στο περιβάλλον, γύρω από τον Kodu. Για να το επιτύχουμε αυτό πρέπει να κάνουμε τα εξής:

Α) Πρέπει να δημιουργήσουμε το αντικείμενο-πρότυπο Πρώτα, τοποθετείτε ένα μηχανάκια στο περιβάλλον που έχετε ήδη δημιουργήσει. Για να ορίσουμε το συγκεκριμένο αντικείμενο ως πρότυπο θα πρέπει να αλλάξουμε την ιδιότητα "creatable" πατώντας δεξί κλικ πάνω στο αντικείμενο και επιλέγοντας "change settings". Εκεί θα βρούμε την ιδιότητα "creatable", και αφού πατήσουμε πάνω της το αντίστοιχο εικονίδιο θα γίνει πράσινο και η ιδιότητα θα ενεργοποιηθεί.

Θα παρατηρήσετε ότι και η μοτοσυκλέτα-creatable αποκτά μία πράσινη σκιά που υποδηλώνει ότι είναι αντικείμενο-πρότυπο. Αν τρέξετε εκείνη τη στιγμή το παιχνίδι σας, θα δείτε ότι ο μηχανάκιας δεν εμφανίζεται στον κόσμο μας. Δεν θα πρέπει να ξεχνάμε ότι τα αρχέτυπα αντικείμενα δεν εμφανίζονται στα παιχνίδια μας, μόνο τα αντίγραφά τους αφού χρησιμοποιηθεί η ενέργεια Δημιούργησε (Create). Στην συνέχεια θα προγραμματίσετε το πως θέλετε να συμπεριφέρονται οι μοτοσυκλέτες μέσα στο περιβάλλον σας. Αφού χαράξουμε την πορεία που θέλουμε να ακολουθούν τα μηχανάκια που θα δημιουργηθούν χρησιμοποιώντας το εργαλείο Μονοπάτι (Path), προσδιορίζουμε ως παντοτινή ενέργειά τους την κίνησή τους πάνω σε αυτό. Επίσης προσθέτουμε μια δεύτερη εντολή ώστε όποτε χάνει την ζωή του με τον Kodu μία μοτοσυκλέτα να παίρνουμε ένα πόντο.

2) Πρέπει να αποφασίσουμε ποιο αντικείμενο θα δημιουργεί κλώνους του Μηχανάκια! Ένα εργοστάσιο μήπως θα ήταν μια αρκετά πιστευτή ιδέα; Εισάγετε ως αντικείμενο στον κόσμο μας ένα εργαστάσιο. Κάτω από ποιες συνθήκες θέλουμε να δημιουργούνται τα αντίγραφα. Συνήθως, κάτι τέτοιο συμβαίνει ανάλογα με το πέρασμα του χρόνου. Επομένως χρησιμοποιώντας τον αισθητήρα χρονόμετρο με προσδιοριστικό τα 10 δευτερόλεπτα, θα μπορούσαμε να δημιουργούμε νέους κλώνους που θα κινούνται πάνω στο μονοπάτι μας κάθε 10 δευτερόλεπτα! Για να δημιουργήσουμε τους νέους κλώνους θα χρησιμοποιήσουμε την ενέργεια Δημιούργησε (Create) και θα παρατηρήσετε ότι στην πίτα που εμφανίζεται για το προσδιοριστικό υπάρχει η επιλογή Creatables που περιέχει μέσα το αντικείμενο που ορίσαμε ως πρότυπο προηγουμένως.

Άρα η εντολή μας έχει ως εξής

Τρέχοντας το παιχνίδι μπορούμε να παρατηρήσουμε ότι οι κλώνοι εμφανίζονται αρχικά δίπλα στο αντικείμενο που τους παράγει και στη συνέχεια κατευθύνονται προς το μονοπάτι στο οποίο θα κινούνται.

Είναι ενδιαφέρον να δούμε τι επιπλέον προσδιοριστικά έχει η ενέργεια Δημιούργησε (Create). Πατώντας το + για να εμφανιστούν τα επιπλέον προσδιοριστικά, θα δούμε ότι μπορούμε να ορίσουμε τι χρώμα θέλουμε να έχουν οι μοτοσικλέτες. Αυτό φαίνεται να έχει ενδιαφέρον καθώς θα μπορούσαμε με ένα "creatable" να δημιουργήσουμε κατηγορίες μηχανών με διαφορετικά χρώματα. Επίσης υπάρχει η επιλογή "once", που αν επιλεγεί σημαίνει ότι η συγκεκριμένη ενέργεια θα εκτελεστεί μόνο μια φορά και συνεπώς θα εμφανιστεί μόνο μία μοτοσυκλέτα

Τρέχοντας το παράδειγμα θα διαπιστώσουμε ότι μετά από κάποιο χρονικό διάστημα προκύπτει πρόβλημα υπερφόρτωσης επειδή δημιουργούνται πολλά αντικείμενα. Θα εμφανιστεί στην οθόνη ένα θερμόμετρο το οποίο θα δείχνει την θερμοκρασία να πιάνει "κόκκινο". Είναι το θερμόμετρο χρήσης των πόρων του υπολογιστή μας, που συζητήσαμε στο 7 κεφάλαιο. Το παιχνίδι θα γίνει πολύ αργό και κάποια στιγμή που θα εξαντληθούν τελείως οι πόροι θα πάψουν να δημιουργούνται νέες μοτοσυκλέτες από το εργοστάσιο. Αν έχετε ενεργοποιήσει την ιδιότητα Περιορισμού των Πόρων, τότε οι μοτοσυκλέτες κάποια στιγμή θα σταματήσουν να δημιουργούνται, καθώς το παιχνίδι μας δεν μπορεί να σηκώσει άλλους πόρους. Καλό όμως είναι να μην αφήνετε τους κλώνους να πολλαπλασιάζονται ανεξέλεγκτα. Στο παράδειγμα μας ένας τρόπος να λύσουμε αυτό το πρόβλημα είναι να επιλέξουμε το πρότυπο αντικείμενό μας και να προσθέσουμε την συμπεριφορά που φαίνεται στην εικόνα.

Κάθε μοτοσυκλέτα έχει διάρκεια ζωής από την στιγμή που δημιουργείται 2 λεπτά όπου και εκρήγνυται. Αυτό βάζει ένα όριο στον αριθμό των μοτοσυκλετών που μπορούν να υπάρχουν στον κόσμο μας κατά την διάρκεια του παιχνιδιού και δεν υπάρχει κίνδυνος υπερφόρτωσης. Άρα ο μέγιστος αριθμός από μηχανάκια που μπορούμε να έχουμε κάθε στιγμή στην πίστα μας είναι 12. Για να μην αυξάνονται οι πόντοι μας κάθε φορά που εκρήγνυται ένας μηχανάκιας με αυτόν τον τρόπο, πρέπει προηγουμένως να προσθέσουμε μία εντολή όπου κάθε 2 λεπτά να αφαιρείται ένας πόντος. Οι συμπεριφορές του πρότυπου αντικειμένου τελικά θα είναι ως εξης:

Για να αποκτήσει κάποιο νόημα το παράδειγμα ως παιχνίδι μπορείτε πολύ απλά να τοποθετήσετε τον Kodu στο κέντρο και να του δώσετε την δυνατότητα να πυροβολεί τους μοτοσυκλετιστές μαζεύοντας πόντους. .

Έχοντας καταλάβει πως μπορείτε να χρησιμοποιείτε την ιδιότητα creatable για την δημιουργία αρχέτυπων αντικειμένων, ας δούμε ένα διαφορετικό παράδειγμα όπου τα αντικείμενα που θα δημιουργούμε δεν θα έχουν συμπεριφορά αλλά θα παίζουν κάποιο ρόλο στο παιχνίδι.

O Kodu είναι πεινασμένος! Στον δρόμο του, για καλή του τύχη βρήκε μερικές μηλιές γεμάτες μήλα. Κάθε φορά που πατάμε Space οι μηλιές ρίχνουν από ένα μήλο και ο Κοdu μπορεί να πάει να το φάει. Τα περισσότερα μήλα όμως ειναι είτε άγουρα, είτε χαλασμένα είτε δηλητηριασμένα. Ο Kodu ψάχνει για κόκκινα γινομένα μήλα. Τρώγοντας κόκκινα μήλα παίρνουμε πόντους, ενώ αν φάμε καταλάθος άλλου χρώματος μήλα μας αφαιρούνται πόντοι. Τα μάυρα μήλα είναι τα δηλητηριασμένα και αφαιρούν τους περισσότερους πόντους. Σκοπός του παιχνιδιού είναι μέσα σε 5 λεπτά να μαζεψουμε όσο μπορούμε περισσότερους πόντους.

__//Δημιουργία κόσμου//__ : Δημιουργούμε ένα απλό τεραίν(terrain) με 6 δέντρα, 1 μήλο στο οποίο ενεργοποιούμε την ιδιότητα creatable και τον ηρωά μας, τον πεινασμένο Κodu! Το μήλο δεν θα έχει κάποια συμπεριφορα.

__//Προγραμματισμός Kodu://__ Ο Kodu θα κινείται ευθεία με τα βελάκια. Κάθε φορά που πέφτει πάνω σε ένα μήλο θα το τρώει. Αν το μήλο που έπεσε πάνω του είναι κόκκινο θα παίρνει 100 πόντους, αν είναι μαύρο θα χάνει 100 πόντους, ενώ για όλα τα χρώματα θα χάνει έναν τυχαίο αριθμό πόντων. Μετά από 5 λεπτά το παιχνίδι τερματίζεται και στόχος είναι να έχουμε μαζέψει πολλούς πόντους.

__//Προγραμματισμός Δέντρων://__ Τα δέντρα τα προγραμματίζουμε έτσι ώστε κάθε φορά που πατάμε το κουμπί Space να ρίχνουν ένα μήλο που έχει τυχαίο χρώμα. Αυτό γίνεται με την παρακάτω εντολή. Έτοιμο το παιχνίδι μας! Καλή διασκέδαση!

Σε αυτό το κεφάλαιο γνωρίσαμε μια πολύ χρήσιμη ιδιότητα που προσφέρει το MSKodu. Ενώ μέχρι τώρα όλα τα αντικείμενα που εμφανίζονταν στα παιχνίδια μας, είχαν δημιουργηθεί από εμάς κατά τον σχεδιασμό του παιχνιδιού, πλέον είμαστε στην ευχάριστη θέση να προγραμματίζουμε την εμφάνιση νέων αντικειμένων. Αυτό όπως είπαμε, μπορεί να γίνει κάνοντας 2 βασικές ενέργειες. Πρέπει να δημιουργήσουμε ένα αντικείμενο-πρότυπο και να αποφασίσουμε ποιο αντικείμενο θα δημιουργεί τους κλώνους χρησιμοποιώντας την ενέργεια Δημιούργησε (Create). Έτσι κάποια από τα παιχνίδια μας που έχουμε ήδη δημιουργήσει μπορούν να βελτιωθούν αισθητά και φυσικά μας δίνεται η δυνατότητα να φτιάξουμε πολλά νέα παιχνίδια που δεν μπορούσαμε πριν. Οι εχθροί είναι ατελείωτοι! Είστε έτοιμοι να βγείτε στο πεδίο της μάχης;

//**Παράδειγμα με αλλαγή σελίδας(pages) και creatables :**//

//__Σενάριο :__ Ο Κodu περιφέρεται σε ένα μεγάλο δάσος, το οποίο είναι γεμάτο με Δέντρα (tree), Kέρματα (coin), Mήλα (apple) και Πέτρες (rock). Τα δέντρα κ οι πέτρες είναι διακοσμητικά στο χώρο του πάρκου. Τα κέρματα όμως δίνουν πόντους στον Κodu κάθε φορά που Πέφτει πάνω (bump) τους, και παράλληλα Eξαφανίζονται (vanish), για να μην μπορεί ο Κodu να ξαναπάρει τους αντίστοιχους πόντους. Υπάρχει όμως και ένας κίνδυνος για τον Κodu. Κάθε δεύτερη φορά που πέφτει πάνω σε κάποιο κέρμα, εμφανίζεται ένας εχθρός που στόχο έχει να πέσει πάνω του και να τερματίσει το παιχνίδι του. Και εδώ αποκτούν νόημα τα μήλα. Μόλις πάρω ένα μήλο βλέπω ότι ο Κodu κινείται πιο γρήγορα, αλλάζει χρώμα και από άσπρος γίνεται μπλέ. Το κλειδί είναι ότι μόλις γίνεται μπλέ ο Κodu έχει την ικανότητα να πετάει πυραύλους για να σκοτώνει τους εχθρούς του. ΠΡΟΣΟΧΗ όμως, όταν ο Κodu γίνει μπλέ δεν μπορεί πια να μαζέψει πόντους. Το μόνο που κάνει είναι να πετάει πυραύλους για να σκοτώσει τους εχθρούς του. Ωστόσο για να συνεχίσει να μαζεύει πόντους θα πρέπει να ξαναπάρει μήλο, να αλλάξει πάλι χρώμα(από μπλέ να γίνει άσπρος) και τότε έχει πάλι την δυνατότητα να συγκεντρώσει πόντους. Καθαρά για λόγους διασκέδασης όταν ο Κodu περνάει από ένα βράχο, ο βράχος του λέει κάτι. Στόχος του Kodu είναι να κάνει High score σε λιγότερο απο δύο λεπτά και πριν τον σκοτώσουν οι εχθροί του.//

Πριν δημιουργήσουμε το παιχνίδι, ας κατανοήσουμε λίγο καλύτερα το παραπάνω σενάριο για να μας είναι μετά πιο εύκολη η συγγραφή του κώδικα. Αρχικά αντιλαμβάνεστε ότι ο κόσμος αποτελείται από πέντε διαφορετικά αντικείμενα. Τα μήλα, τις πέτρες, τα νομίσματα, τους εχθρούς του Kodu και τέλος τον Kodu. Ποιά όμως από αυτά τα αντικείμενα έχουν συμπεριφορά; Ας πάρουμε ένα ένα τα αντικείμενα. Η μόνη συμπεριφορά, από την εκφώνηση της άσκησης, που φαίνεται να έχουν οι βράχοι είναι ότι βγάζουν ένα μήνυμα κάθε φορά που χτυπάει πάνω τους ο Kodu. Άλλωστε όπως αναφέραμε παραπάνω οι βράχοι είναι για λόγους διασκέδασης. Το επόμενο αντικείμενο που θα διερευνήσουμε τη συμπεριφορά του είναι το νόμισμα. Τι λέτε θα μπορούσε να έχει συμπεριφορά το νόμισμα; Είπαμε πως, όταν ο Kodu πέφτει πάνω σε ένα νόμισμα το εξαφανίζει και αυξάνει τους πόντους του κατά 10. Παρατηρείτε ότι τη συγκεκριμένη συμπεριφορά θα μπορούσε να την έχει και ο Kodu αλλά και το νόμισμα. Ο Kodu θα μπορούσε να περιέχει τις παρακάτω γραμμές κώδικα :

ΟΤΑΝ [//πέσω πάνω//(//bump//)] [//κέρμα//(//coin//)] ΤΟΤΕ[//εξαφάνισε//(//vanish//)][//it//(//αυτό//)] ΟΤΑΝ [] [] ΤΟΤΕ [//αύξησε//(//score//)] [//βαθμοί//(//points//)]

Επίσης και το κέρμα θα μπορούσε να έχει τον παρακάτω κώδικα : ΟΤΑΝ [//πέσω πάνω//(//bump//)] [Kodu] ΤΟΤΕ [//εξαφάνισε//(//vanish//)] [//εμένα//(//me//)] (το προσδιοριστικό ενέργειας αναφέρετε στο προσδιοριστικό αισθητήρα, δηλαδή στο κέρμα) ΟΤΑΝ [] [] ΤΟΤΕ [//αύξησε//(//score//)] [//βαθμοί//(//points//)]

Όπως παρατηρείτε και τα δύο αντικείμενα θα μπορούσαν να έχουν τη συγκεκριμένη συμπεριφορά. Τώρα είναι στα χέρια του προγραμματιστή, στα χέρια σας, να επιλέξει σε ποιο αντικείμενο τελικά θα την δώσει. Επόμενο αντικείμενο είναι τα μήλα. Θυμόμαστε τι ρόλο παίζουν τα μήλα στο παιχνίδι μας; Όταν πέφτει πάνω τους ο Kodu, τα εξαφανίζει και αποκτά την ικανότητα να //πυροβολεί//(//shoot//) πυραύλους(missiles). Ποιο απο τα δύο αντικείμενα μπορεί να υιοθετήσει τη συγκεκριμένη συμπεριφορά; To βλέπετε το πρόβλημα που θα μπορούσε να προκύψει αν τα μήλα εξέφραζαν την παραπάνω ενέργεια; Γι'αυτό το λόγο η ενέργεια αυτή εκφράζεται από τον Kodu. Kαι τέλος έμειναν οι εχθροί του Kodu που φυσικα μόλις πέσουν πάνω στον Kodu με πολύ μεγάλη ευχαρίστηση τερματίζουν το παιχνίδι του. Ας δημιουργήσουμε το παιχνίδι μας τώρα βήμα-βήμα :

__Δημιουργία του κόσμου :__ //Δημιουργούμε αρχικά το δάσος μας. Θα δημιουργήσετε ένα απλό τεραίν(////terrain////)όπως έχετε μάθει στα προηγούμενα κεφάλαια.Καλό θα ήταν να περιορίσετε τον χώρο που θα κινείται ο Kodu και αισθητικά.Δηλαδή, ο χρήστης να δεί ψηλά βουνά γύρω απο το δάσος, ώστε να του είναι πλήρως κατανοητό ότι ο Kodu θα περιφέρεται μέσα σε αυτό το χώρο. Μέσα σε αυτόν τοποθετείτε σε τυχαίες θέσεις κάποια δέντρα, κάποια νομίσματα σε μεγάλο μέγεθος, για να μπορεί ο Kodu να πέφτει πάνω τους, κάποια μήλα επίσης σε μεγάλο μέγεθος, για να μπορεί έρχεται εύκολα σε επαφή μαζί τους και κάποιους βράχους, έτσι, για πλάκα.!!!!! Σημαντικό είναι όταν τοποθετείτε τα αντικείμενα, επειδή θα είναι πολλά, να μετράτε για να ξέρετε πόσα βάζετε, για να έχει και νόημα το high score που θα πρέπει να κάνει ο// //Kodu.// //Να μην ξεχνάτε όταν δημιουργείτε κάτι, να το διασκεδάζετε πάντα οπότε ότι σας κάνει απλά αστείο βάλτε το στον κόσμο σας, γι'αυτό κ εδώ μπήκαν οι βράχοι. Όταν το Kodu περνάει απο πάνω τους κάθε βράχος θα του λέει και κάτι διαφορετικό. Μη ξεχάσετε να προσθέσετε και τον Kodu φυσικά !!!! Τώρα ο κόσμος σας θα πρέπει να μοιάζει κάπως έτσι ://



__Προγραμματίζοντας τον Kodu :__ //Ας προγραμματίσουμε τώρα τον Kodu. Πρώτο πράγμα που πρέπει να σκεφτούμε είναι πώς θέλουμε να κινεί ο παίχτης τον Kodu. Μπορεί να το κάνει είτε με το ποντίκι είτε με το πληκτρολόγιο. Επειδή συνήθως τα βελάκια από το πληκτρολόγιο παραπέμπουν σε κίνηση, προτιμήστε ο παίχτης να κινεί τον Kodu με αυτά.// //Έτσι ο κώδικας του Kodu θα είναι αρχικά έτσι ://



//Όπως είπαμε παραπάνω, θέλουμε ο Kodu όταν χτυπάει κάποιο κέρμα να εξαφανίζεται και να κερδίζει πόντους από αυτό. Τι παρακάτω γραμμές κώδικα επιλέγουμε να τις δώσουμε στον// //Kodu////. Μπορούμε όμως αν τις δώσουμε και στο κέρμα όπως αναφέραμε παραπάνω. Έστω ότι απο κάθε κέρμα κερδίζει 10 πόντους. Οπότε κάθε φορά που θα πέφτει πάνω σε κάποιο κέρμα θέλουμε ο// //Kodu// //να το εξαφανίζει αλλά και να κερδίζει 10 πόντους.////Οι παρακάτω εντολές υλοποιούν αυτές τις συμπεριφορές ://



//Όπως ήδη γνωρίζουμε, σε οποιαδήποτε σειρά και να μπούν οι παραπάνω εντολές, δεν παίζει ρόλο. Ο// //Kodu// //θα έχει την επιθυμήτη συμπεριφορά. Να προσέξετε ότι αν έχουμε 200 νομίσματα, τότε το παιχνίδι μπορεί να γίνει βαρετό γιατί θα είναι πολύ εύκολο για τον// //Kodu// //να κάνει high score, δεδομένου ότι το high score είναι 200 πόντοι και ο// //Kodu// //θα έχει στη διάθεσή του 200 * 10 = 2000 πόντους !!! Το high score στο παιχνίδι μας έχει σημασία γιατί αυτό κρίνει και το νικητή μας.// //Πώς όμως θα μπορούσατε να κάνετε με τόσα πολλά νομίσματα, το παιχνίδι εξίσου ενδιαφέρον? Ίσως την απάντηση την βρείτε πιο κάτω. Τελειώσαμε και με την αλληλεπίδραση του// //Kodu// //με τα νομίσματα. Ας δούμε τον// //Kodu// //τώρα τι θέλει να κάνει με τα μήλα.//

//Θυμάστε ποιά θέλουμε να είναι η συμπεριφορά του// //Kodu// //όταν πέφτει πάνω στα μήλα? Όταν πέφτει πάνω σε κάποιο μήλο να το τρώει, να αλλάζει χρώμα και μετά ο// //Kodu// //να έχει τη δυνατότητα να πετάει πυραύλους, για να σκοτώσει τα creatables, αλλά τώρα να μην μπορεί να μαζέψει πόντους.... Τι παρατηρείτε? Ο// //Kodu// //αλλάζει συμπεριφορά !!!! Και τι είχαμε πεί ότι κάνουμε όταν θέλουμε να δείξουμε ότι από μία συγκεκριμένη συμπεριφορά(πέφτει πάνω σε νομίσματα και μαζεύει πόντους) σε μία άλλη(πέφτει πάνω σε μήλα, αλλάζει χρώμα, μπορεί να πετάει πυραύλους αλλά δε μπορεί να μαζεύει πόντους)? Αλλαγή σελίδας !!!// //Αρχικά θα πρέπει να πούμε στον// //Kodu// //ότι όταν θα πέφτει πάνω στο μήλο, θα πρέπει να το τρώει και μετά να αλλάζει σελίδα για να εκτελεί τη νέα του συμπεριφορά. Έτσι ο κώδικας μας θα έχει αυτή τη μορφή στην πρώτη σελίδα (page// //)://



Πρίν πάμε να εκφράσουμε τις ενέργειες του //Kodu// στη δεύτερη σελίδα ας ολοκληρώσουμε τις εντολές στην πρώτη σελίδα του παιχνιδιού μας. Σε χρόνο 2 λεπτών όπως είπαμε ο //Kodu// πρέπει να κάνει high score (200 πόντοι) για να κερδίσει το παιχνίδι !!!! Έτσι οι τελευταίες μας εντολές θα είναι : ΟΤΑΝ [//αυξήσει//(//scored//)] [200] KANE [//κέρδισε//(//win//)] [] Ας γράψουμε την εντολή :

μέχρι εδώ τα έχουμε ξανακάνει το βήματα. Το προσδιοριστικό του αισθητήρα μας είναι οι 200 πόντοι. Ας επιλέξουμε το 200 :



Τι παρατηρείτε; Δεν υπάρχει πουθενά η επιλογή 200!!! Αλλά και οποιοσδήποτε μεγαλύτερος αριθμός από το 100. Και όμως .... μην ανησυχείτε το MSKodu έχει τη λύση. Προσθέτοντας στο συγκεκριμένο αισθητήρα πολλά αριθμητικά προσδιοριστικά αισθητήρα, το MSKodu τα προσθέτει. Οπότε για να διαλέξουμε το προσδιοριστικό αισθητήρα 200 αρκεί να επιλέξουμε δύο φορές το 100. Και η ολοκληρωμένη εντολή είναι :



Απλό δεν είναι; Αυτό συμβαίνει με όλα τα αριθμητικά προσδιοριστικά αισθητήρα. Καθώς δεν είναι δυνατό να υπάρχουν όλοι οι πιθανοί αριθμοί που θα μπορούσε κάποιος να χρησιμοποιήσει στις ενέργειες του MSKodu, το MSKodu δίνει αυτή τη δυνατότητα με το να προσθέτουμε εμείς όποιους αριθμούς θέλουμε για να δημιουργήσουμε το επιθυμητό αποτέλεσμα. Το ίδιο θα δούμε και στην τελευταία εντολή την πρώτης σελίδας του //Kodu//. Αν περάσουνε τα δύο λεπτά και ο //Kodu// δεν έχει κάνει high score και δεν τον έχει φάει και κάποιος απο τους εχθρούς του τότε δυστυχώς χάνει. Έτσι η τελευταία εντολή έχει τη μορφή :



Κάνοντας και εδώ το ίδιο με τους χρόνους του //χρονόμετρου//(//timer//). Καθώς ο μεγαλύτερος χρόνος είναι το 60 δευτερόλεπτα = 1 λεπτό. Για να δημιουργήσουμε το δύο λεπτά που θέλουμε για το παιχνίδι μας απλώς επιλέγουμε δύο φορές τα 60 δευτερόλεπτα και το MSKodu κάνει την πρόσθεση και έτσι έχουμε τον επιθυμητό χρόνο των δύο λεπτών. Και τώρα ήρθε η στιγμή να δούμε ολόκληρη την πρώτη σελίδα του παιχνιδιού μας :



//Θα συνεχίσουμε με τις εντολές της δεύτερης σελίδας, για να ολοκληρώσουμε την αλληλεπίδραση του// //Kodu// //με τα μήλα. Καλό θα ήταν όταν γράφεται κώδικα να μην ανακατεύεται πολλές αλληλεπιδράσεις μαζί. Δηλαδή, εκεί που γράφεται κώδικα αλληλεπίδρασης με τα νομίσματα, να μην μπλέκεται κώδικα αλληλεπίδρασης με τα μήλα. Θα είναι πιο εύκολο να δημιουργείτε τις αλληλεπιδράσεις με τη σειρά, όπως κάναμε εδώ. Δηλαδή, σκεφτείτε η πρώτη σελίδα του παιχνιδιού μας να ήταν έτσι ://

Καταλάβατε τι θέλουμε να πούμε; Αν παρατηρήσετε στην αρχική πρώτη σελίδα η συμπεριφορά του //Kodu// όταν //πέφτει πάνω//(//bump//) σε κάποιο μήλο είναι συνεχόμενη στις γραμμές 4 και 5 και η αλληλεπίδραση του με τα νομίσματα είναι στις γραμμές 2 και 3. Που βλέπετε ότι είναι πιο ευανάγνωστες οι συμπεριφορές; Στην πρώτη εικόνα της αρχικής σελίδας φυσικά. Έτσι αν υιοθετήσετε τον πρώτο τρόπο έκφρασης των ενεργειών θα γνωρίζετε ότι στην επόμενη εντολή που θα αλλάξει ο αισθητήρας του αντικειμένου σας και το προσδιοριστικό του αισθητήρα, στη συγκεκριμένη σελίδα δε θα τον ξανασυναντήσετε αφού θα έχετε εκφράσει όλες τις ενέργεις που ρον αφορούν την πρώτη φορά που το συναντήσατε.

//Στη σελίδα 2 θέλουμε να πούμε στον// //Kodu// //να κινείται πιο γρήγορα,να αλλάξει χρώμα, και να μπορεί να πετάει πυραύλου. Γιατί άραγε ο// //Kodu// //να αλλάζει χρώμα? Τι προσφέρει στον παίχτη αυτό? Σας θυμίζει τίποτα αυτό;// //Πυραύλους θα μπορεί να πετάει μόνο όταν θα πατά ο παίχτης το πλήκτρο space. Οπότε στη δεύτερη σελίδα, που πάμε όπως δείξαμε παραπάνω, γράφουμε τη νέα συμπεριφορά του// //Kodu////. Ο νέος κώδικας είναι ://



//Δίνουμε τη δυνατότητα αυτή στον// //Kodu////, να πετάει πυραύλους, για να μπορεί να σκοτώσει τα creatables.// //Αν ο Kodu ξαναφάει κάποιο μήλο, τότε το χρώμα του γίνεται ξανά άσπρο και επιστρέφει στην αρχική σελίδα για να συνεχίσει να μαζέυει πόντους. Παραμένουμε στη σελίδα 2 και πρέπει τώρα να πούμε στον// //Kodu// //αν ξανα πέσει πάνω σε μήλο να αλλάξει χρώμα. Επειδή θέλουμε να αλλάξει πάλι ο// //Kodu// //και για να δούμε λίγο καλύτερα την έννοια της αλλαγής σελίδας, θα του αλλάξουμε χρώμα σε νέα σελίδα. Συνεπώς οι επόμενες εντολές στη 2 σελίδα είναι ://



//Στη σελίδα 3 κάνουμε κάτι διαφορετικό απο ότι έχετε δει μέχρι τώρα. Το μόνο που μας ενδιαφέρει είναι να αλλάξουμε το χρώμα του// //Kodu// //από μπλέ σε άσπρο. Άρα, για να πούμε στον// //Kodu// //να αλλάξει χρώμα ότι και να γίνει μόλις πάει στη σελίδα 3, θα το κάνουμε έχοντας κενή τη συνθήκη "when". Αυτό είναι σαν να λέμε ότι κίνηση και να κάνει ο// //Kodu// //να αλλάξει χρώμα ο// //Kodu// //και να επιστρέψει στην αρχική σελίδα. Ο συγκεκριμένος κώδικας φαίνεται παρακάτω ://



//Μήπως// όμως είναι περιττή, εδώ, η χρήση της σελίδας 3; Μήπως θα μπορούσαμε να υλοποιήσουμε κάπου αλλού τις εντολές της σελίδας 3; Έχετε καμία ιδέα; Τι θα λέγατε αν στην πρώτη σελίδα που εκφράζουμε τη συμπεριφορά του Kodu προσθέταμε στην αρχή άλλη μια εντολή της μορφής//://



Θα άλλαζε κάτι στο παιχνίδι μας; Μπορείτε να την προσθέσετε μόνοι σας την εντολή και να παρατηρήσετε τυχόν διαφορές με αυτό που έχουμε φτιάξει; Χμ.... για να δούμε..... Και μόλις τελείωσε ο προγραμματισμός του Kodu.

__Προγραμματίζοντας τους βράχους:__ Όπως αναφέραμε και στην εκφώνηση της άσκησης, ο μόνος λόγος που βάλαμε τους βράχους στον κόσμο του Kodu, είναι καθαρά για λόγους διασκέδασης. Έτσι λοιπόν οι εντολές που θα εκτελεί κάθε βράχος θα είναι η εξής μια : ΟΤΑΝ [//πέσω πάνω//(//bump//)][Kodu] ΤΟΤΕ [//πες//(//say//)][.......εδώ γράφετε εσείς ότι θέλετε]

Μόλις επιλέξετε την ενέργεια //Πες//(//say//), εμφανίζεται το παρακάτω παράθυρο:



όπου στο κόκκινο βελάκι βλέπετε να έχει σταματήσει ο κέρσορας στο σημείο που τελειώσαμε να γράφουμε τη φράση που θέλουμε. Μπορείτε να γράψετε όσες φράσεις θέλετε για να κάνουμε το παιχνίδι μας ακόμα πιο διασκεδαστικό. Το MSKodu δεν διαθέτει ελληνικά οπότε οι φράσεις σας αναγκαστικά θα είναι γραμμένες με λατινικούς χαρακτήρες. Οπότε ξεκινήστε και κάντε τους βράχους μας να μιλάνε.....

__Δημιουργώντας και προγραμματίζοντας τα creatables :__ //Τώρα ας πάμε να δημιουργήσουμε τους εχθρούς που θα εμφανίζονται κατά την διάρκεια του παιχνιδιού. Αυτό θα το κάνουμε φτιάχνοντας και προγραμματίζοντας ένα creatable.// //Τοποθετήστε ένα Flyfish και ορίστε το ως creatable.Το προγραμματίζετε όταν βλέπει τον Kodu να τρέχει προς τα πάνω του, κι όταν τον ακουμπάει να τερματίζεται το παιχνίδι.Επίσης μπορείτε να του πείτε να αποφεύγει τα δέντρα για να μην πέφτει πάνω σε αυτά και φένεται άσχημα. Αυτό μπορεί να γίνει με την τρίτη συμπεριφορά της εικόνας με την επιλογή avoid μετά την κίνηση (move).//





Τέλος το μόνο που χρειάζεται για να είναι έτοιμο το παιχνίδι είναι να προγραμματίσετε κάποια αντικείμενα του χώρου από τα οποία θα βγαίνουν οι κλώνοι. Επιλέξτε μερικά δέντρα για να κάνουν αυτήν την δουλειά και κάθε κλώνος να βγαίνει από διαφορετικό σημείο. Στο πρώτο δέντρο θα δώσετε την παρακάτω συμπεριφορά. Όταν η βαθμολογία είναι 20 πόντοι να δημιουργηθεί το creatable μία φορά. Στο δεύτερο δέντρο θα το κάνετε για 40 πόντους, στο τρίτο για 60 κ.ο.κ. Συνολικά δηλαδή θα μπορούν να εμφανιστούν μέχρι 9 κλώνοι αφού έχουμε θέσει τους 200 πόντους ως high score.

__Ερωτήσεις Αξιολόγησης__

1.Αναφέρατε τους λόγους που είναι χρήσιμη η //αλλαγή σελίδας (switch page)// και δώστε ένα μικρό δικό σας παράδειγμα, να δικαιολογήσετε τη χρησιμότητα της.

2. Αν στο δεύτερο παιχνίδι που δημιουργήσαμε με τις καρδούλες και τα αστεράκια, δεν δημιουργούσαμε δεύτερη σελίδα συμπεριφορών αλλά μόνο πρώτη σελίδα, η οποία θα ήταν :



Θα άλλαζε καθόλου το παιχνίδι μας; Τα αντικείμενα μας θα είχαν την ίδια συμπεριφορά με αυτή που ορίσαμε μέσα στο κεφάλαιο; Τι διαφορές παρατηρείτε ανάμεσα στο αρχικό παιχνίδι και σε αυτό που δημιουργήσαμε μόλις τώρα; Τελικά είναι χρήσιμη η //αλλαγή σελίδας (switch page)//;Ας σημειωθεί ότι ο κόσμος του Ύπο, καθώς και η συμπεριφορές των άλλων αντικειμένων διατηρούνται όπως ήταν στο αρχικό παιχνίδι.

3. To MSKodu όπως είπαμε διαθέτει δώδεκα σελίδες, δηλαδή μας επιτρέπει να δώσουμε στα αντικείμενα μας δώδεκα διαφορετικές συμπεριφορές. Τι μπορεί να συμβεί αν στο μεγάλο μας παιχνίδι, αντί, στις εντολές του Kodu, να πάμε απο τη σελίδα ένα στη σελίδα δύο, πάμε από τη σελίδα ένα στη σελίδα πέντε; Θα δημιουργηθεί κάποιο πρόβλημα στο παιχνίδι μας; Και αν ναι, ποιό θα είναι αυτό; Αν όχι, εξηγήστε τους λόγους που δεν έχουμε κάποια αλλαγή.

4. Περιγράψτε 5 παιχνίδια που μπορείτε να φτιάξετε χρησιμοποιώντας την ιδιότητα creatable σε αυτά.

5. Στο παράδειγμα με τις μοτοσυκλέτες μπορείτε να βρείτε άλλους τρόπους να λύσετε το πρόβλημα της υπερφόρτωσης εκτός από το να εκρηγνύονται οι μοτοσυκλέτες μετά από κάποιο χρονικό διάστημα;

__Δραστηριότητες__

1. Καλείστε να δημιουργήσετε ένα παιχνίδι με το γνωστό μας //Μηχανάκια (cycle)//. Ο κόσμος σας θα είναι γεμάτος με //Μπάλες (ball)//, //Νάρκες (mine)// και δύο //Κανόνια (cannon)//. Το //Τερραίν (terrain)// είναι της επιλογής σας. Ο //Μηχανάκιας (cycle)// θα κινείται ευθεία με το γράμμα W του πληκτρολογίου, δεξιά με το γράμμα D, αριστερά με το γράμμα Α, και πίσω με το γράμμα Ζ. Το πλήθος των //ναρκών (mine)// θα είναι διπλάσιο απο το πλήθος των //μπαλών (ball)//. Στόχος του Μηχανάκια είναι να εξαφανίσει όλες τις //μπάλες (ball)// χωρίς να //πέσει πάνω (bump)// σε κάποια //νάρκη (mine)//. Όταν πέφτει πάνω σε κάποια //νάρκη (mine)// γίνεται πορτοκαλί και ακινητοποιείται για πέντε δευτερόλεπτα. Ταυτόχρονα τα //κανόνια (cannon)// μόλις δουν το //Μηχανάκια (cycle)// αρχίζουν και κινούνται προς το μέρος του. To παιχνίδι τελειώνει όταν είτε ο μηχανάκιας μαζέψει όλες τις //μπάλες (ball)// είτε όταν κάποιo από τα κανόνια //πέσει πάνω (bump)// στο //Μηχανάκια (cycle)//. Ο //Μηχανάκιας (cycle)// σε όλη τη διάρκεια του παιχνιδιού είναι γκρί, εκτός απο τότε που πέφτει πάνω στις νάρκες.

2. Κατασκευάστε έναν κόσμο σαν αυτόν που φένεται στην εικόνα. Τοποθετείστε στην μία πλευρά πέτρες, στην άλλη ένα μεγάλο χελιδονόψαρο (Fly Fish) και ένα πρότυπο μικρό ψάρι. Το μεγάλο χελιδονόψαρο (Fly Fish) θα κινείται με τα βελάκια και θα τρώει τα μικρά ψάρια συλλέγοντας πόντους. Τα μικρά χελιδονόψαρα (Fly Fish) θα κινούνται προς την πλευρα του μεγάλου χελιδονόψαρου (Fly Fish) πολύ γρήγορα. Οι πέτρες παράγουν τους κλώνους των μικρών χελιδονόψαρων (Fly Fish) ανά μικρό χρονικό διάστημα της επιλογής σας ή τυχαίο(random). Σκοπός του παιχνιδιού είναι το μέγαλο χελιδονόψαρο (Fly Fish) να φάει τα μικρά μαζεύοντας όσους περισσότερους πόντους μπορεί πριν αυτά πέσουν από το Τερραίν (terrain).