Κεφάλαιο 12 ο : Σώστε την Kodula 12.1 Περιγραφή Πιάσανε τη φίλη του Kodu!! Στο παιχνίδι που θα σχεδιάσουμε θα πρέπει ο Kodu να περάσει από μια σειρά δοκιμασιών για να σώσει τη φίλη του, τη Kodula! Έστω ότι βρισκόμαστε σε έναν κόσμο που αρχικά περιέχει μία πίστα για αγώνα δρόμου, ένα κλουβί στο οποίο μπορούμε να κρύψουμε αντικείμενα, ένα βουνό, μία λιμνούλα πίσω από το βουνό και το μέρος όπου είναι φυλακισμένη η Kodula. Έχουμε στο μυαλό μας την πίστα που θα σχεδιάσουμε, κάπως έτσι: Δείτε το παράδειγμα 12_01.kodu Στόχος του παίκτη είναι να σώσει την Kodula περνώντας από διάφορα εμπόδια και στάδια δυσκολίας και έχοντας ως πρωταγωνιστή τον Kodu. Στάδιο Α: Αγώνας δρόμου Η πρώτη πρόκληση αφορά έναν αγώνα ταχύτητας: Πώς θα σας φαινόταν αν αρχικά ο Kodu έκανε έναν αγώνα με τη μηχανή του; Θα σκεφτείτε αμέσως... μα ο Kodu δεν έχει μηχανή! Σωστά, αλλά θα υπάρχει κάποιος τρόπος για να αποκτήσει! Ο χρήστης λοιπόν, αφού αποκτήσει τον έλεγχο του Μηχανάκια, θα πρέπει να τρέξει 3 γύρους στην πίστα και να τερματίσει πρώτος με αντίπαλο τον μαύρο Μηχανάκια, που έχει ακριβώς τον ίδιο στόχο. Ο χρήστης πρέπει να κάνει τους γύρους στην πίστα αριστερόστροφα (αντίθετα των δεικτών του ρολογιού). Αν κάποιος προσπαθήσει να κλέψει κάνοντας ανάποδα γύρους και περνώντας πάνω από τη γραμμή τερματισμού, θα πρέπει να τιμωρείται εγκαταλείποντας το παιχνίδι. Στην πίστα θα υπάρχουν 3 Πιατάκια σε σταθερά σημεία τα οποία θα πυροβολούν τον Kodu όταν τον βλέπουν και θα μειώνουν την ενέργειά του. Όταν όμως ο Kodu ακουμπά μία κόκκινη Καρδιά, θα ανακτά μέρος της χαμένης του ενέργειας! Χαμός! Φυσικά, αν η ενέργεια μηδενιστεί, τότε ο παίκτης χάνει. Υπάρχει όμως ακόμη ένα πρόβλημα για τον Kodu! Ο μαύρος Μηχανάκια είναι πιο γρήγορος από αυτόν! Γι αυτό, κατά τη διάρκεια του αγώνα ο χρήστης θα πρέπει να μαζεύει υγρό το οποίο θα του δίνει επιτάχυνση όταν πατηθεί το κατάλληλο πλήκτρο! Βασικά χαρακτηριστικά αγώνα δρόμου: 3 γύροι μόνο αριστερόστροφα επιτάχυνση στον Kodu γρηγορότερος ο μαύρος Μηχανάκιας τιμωρία σε όποιον κλέψει Πιατάκια που ρίχνουν πυραύλους στον Kodu Καρδιές που δίνουν ενέργεια στον Kodu 228
νικάει όποιος τερματίσει πρώτος χάνει όποιος δεν έχει ενέργεια. Στάδιο Β: Μάχη για την Μπάλα Αν ο χρήστης ξεφύγει από τον μαύρο Μηχανάκια στον αγώνα, τότε θα πρέπει να πάρει τη Μπάλα από το κλουβί και να την πετάξει στο κάστρο μπροστά από την Kodula για να την ελευθερώσει. Για να μπει στο κλουβί ο Kodu θα αφήσει το μηχανάκι και θα πάρει το αεροπλάνο, πιο συγκεκριμένα το Τζετ! Τύφλα να χει ο πράκτορας 007! Άρα, μόλις βγει από την πίστα αγώνα ο Kodu και μετατραπεί σε Τζετ (αυτόματα), αρχίζει το δεύτερο μέρος του παιχνιδιού. Δεν θα είναι όμως τόσο εύκολα τα πράγματα, καθώς θα πρέπει να αποφύγει τους εχθρικούς Δορυφόρους, που εμφανίζονται και εξαφανίζονται σε τυχαία χρονικά διαστήματα πυροβολώντας τον Kodu. Κρατήστε αυτό το χαρακτηριστικό της τυχαιότητας, θα μας απασχολήσει ιδιαίτερα στον προγραμματισμό του παιχνιδιού. Τι λέτε; Θα αφήσουμε μόνο του το Τζετ να παλεύει με τόσους Δορυφόρους; Όχι φυσικά! Ο παίκτης θα μπορεί να ανεβάσει τους πόντους ζωής του πηγαίνοντας κοντά σε ένα φιλικό Αερόπλοιο που προσφέρει δωρεάν ενέργεια! Επίσης θα μπορεί να τους πυροβολεί και να τους σκοτώνει για να ξεμπερδεύει μια και καλή! Αφού φύγουν οι Δορυφόροι από τη μέση ο δρόμος θα είναι ελεύθερος για να κουβαλήσουμε με το Τζετ τη μεγάλη Μπάλα που θα ρίξει το Κάστρο! Το παιχνίδι τελειώνει μόλις πέσει το Κάστρο και ελευθερωθεί η Κodula! Βασικά χαρακτηριστικά 2 ου σταδίου: χειρισμός Τζετ τυχαία εμφάνιση και εξαφάνιση Δορυφόρων γέμισμα ενέργειας του Τζετ από το Αερόπλοιο απογείωση - προσγείωση Τζετ και κουβάλημα Μπάλας νίκη παιχνιδιού αν πέσει το Κάστρο ήττα αν τελειώσει η ενέργεια 12.2 Αντικείμενα και συμπεριφορές Ποια θα είναι τα αντικείμενα στο παιχνίδι μας; Ας προσθέσουμε αρχικά τους δύο βασικούς μας ήρωες, την Κodula (γι' αυτήν γίνονται όλα): και τον Κodu! (μάλλον δεν του αρέσει η δημοσιότητα): 229
Ο Kodu θα μετακινείται με τα βέλη του πληκτρολογίου. Θα πρέπει μόλις ακουμπήσει το πρώτο Εργοστάσιο να μετατρέπεται σε κόκκινο Μηχανάκια. Ουσιαστικά δηλαδή δε θα τον χρειαστούμε και για πολύ στο παιχνίδι μας. Απλά θα βοηθήσει στην αλυσιδωτή αντίδραση των μετατροπών Kodu > κόκκινος Μηχανάκια > Τζετ. Ο κόκκινος Μηχανάκιας (ο Kodu με κόκκινη μηχανή και κράνος): θα χειριζόμαστε τον κόκκινο Μηχανάκια από το πληκτρολόγιο και θα μπορεί να πυροβολεί με το γράμμα Z του πληκτρολογίου. Όταν περάσει πάνω από τη γραμμή τερματισμού με τη σωστή φορά (αριστερόστροφα) πρέπει να προστίθεται ένας πόντος στο κόκκινο σκορ. Όταν χτυπήσει μία Καρδιά, θα αυξάνεται η ενέργειά του κατά 10 πόντους. Όταν ακουμπήσει την Καλύβα, θα μετατρέπεται σε κόκκινο Τζετ. Αν βρίσκεται πάνω από το κίτρινο υγρό της πίστας, θα παίρνει πόντους επιτάχυνσης. Την επιτάχυνση θα μπορεί να τη χρησιμοποιήσει ο χρήστης πατώντας το αριστερό πλήκτρο Shift. Αν μηδενιστεί η ενέργειά του, θα καταστρέφεται. Το κόκκινο Τζετ: 230
θα το χειριζόμαστε από το πληκτρολόγιο και θα μπορεί να απογειώνεται και να προσγειώνεται με τα πλήκτρα «αριστερό Shift» και «αριστερό Ctrl» αντίστοιχα. Όταν ακουμπά την Μπάλα θα την κουβαλά και όταν πατάμε Space θα την αφήνει. Όταν πλησιάζει το Αερόπλοιο θα παίρνει +100 πόντους ενέργειας. Θα πυροβολεί και αυτό με το πλήκτρο Z. Οι Καρδιές: θα είναι τυχαία διατεταγμένες στη διαδρομή της πίστας αγώνα, θα δίνουν +10 πόντους ζωής στον κόκκινο Μηχανάκια και μετά θα εξαφανίζονται. Η Καλύβα η οποία θα χρησιμοποιηθεί για τη μετατροπή του κόκκινου Μηχανάκια σε Τζετ μόλις την ακουμπήσει: 231
Έπειτα θα εξαφανίζεται για να ελευθερώσει την έξοδο προς τον υπόλοιπο κόσμο. Προσοχή! Αν ο κόκκινος Μηχανάκιας την ακουμπήσει πριν τελειώσει ο αγώνας, δεν πρέπει να αλλάζει τίποτα! Οι Δορυφόροι: θα κινούνται μπροστά από το κλουβί σε ένα μονοπάτι. Θα εμφανίζονται και θα εξαφανίζονται σε τυχαία διαστήματα. Σκοπός τους είναι να ρίχνουν πυραύλους στο Τζετ έτσι ώστε να το καταρρίψουν. Τα Πιάτα: 232
θα τοποθετηθούν στην πίστα αγώνα και θα πυροβολούν τον κόκκινο Μηχανάκια όταν τον βλέπουν προς το μέρος τους. Σκοπός τους θα είναι να μειώσουν την ενέργεια του κόκκινου Μηχανάκια. Το Αερόπλοιο: θα κινείται σε ένα συγκεκριμένο κυκλικό μονοπάτι και θα δίνει ενέργεια στο Τζετ μόλις αυτό βρεθεί κοντά του. Αν χτυπηθεί από έναν πύραυλο ή αν πυροβοληθεί από το Τζετ καταστρέφεται. 12.3 Δημιουργώντας την πίστα Σε έναν κενό κόσμο αρχίζουμε να σχεδιάσουμε την πίστα του αγώνα. Είδαμε ότι ο κόκκινος Μηχανάκιας πρέπει πρώτα να ολοκληρώσει τον αγώνα και μετά να περάσει στον υπόλοιπο κόσμο. Αν θυμάστε, στο 4.2 είχαμε σχεδιάσει μία πίστα αγώνα και αμέσως μετά ένα Κάστρο. Θα χρησιμοποιήσουμε ένα συνδυασμό των δύο τεχνικών για να σχεδιάσουμε μία κλειστή πίστα αγώνα! Μπορούμε αρχικά να ζωγραφίσουμε και μετά να σηκώσουμε τα τείχη έτσι ώστε να έχουμε ένα καλύτερο και πιο γρήγορο αποτέλεσμα. 233
Τώρα, μέσα στην πίστα πρέπει να προσθέσουμε το υγρό που μας δίνει πόντους επιτάχυνσης. Σε ποιο σημείο θα δημιουργούσατε τη λιμνούλα εσείς; Θα τη βάζατε σε μία στροφή της πίστας; Μάλλον όχι, γιατί έτσι θα δυσκολεύαμε αρκετά το χρήστη. Ας την προσθέσουμε σε μία ευθεία της πίστας. Το ίδιο πρόβλημα υπάρχει και με τα Πιατάκια. Αν τα βάλουμε στο δρόμο της πίστας, θα χάνει πολύ εύκολα ενέργεια ο χρήστης, άρα σχεδιάζουμε την πίστα έτσι ώστε να υπάρχει κενός χώρος στη μέση για να τοποθετήσουμε εκεί τα Πιατάκια. Ο υπόλοιπος κόσμος μας περιέχει τα κλειδιά για να καταφέρουμε να ανοίξουμε το Κάστρο και να σώσουμε την Kodula. Άρα, έξω από την πίστα αγώνα σχεδιάζουμε ένα μέρος όπου ο Kodu μπορεί να πάει μόνο από αέρος (ναι! θα τον κάνουμε να πετάξει!) και το κλείνουμε με κοφτερές κορυφές. 234
Προσθέτουμε και το βουνό που βλέπετε στο βάθος της προηγούμενης εικόνας με τέτοιον τρόπο ώστε από πίσω να κάνουμε μία λίμνη όπου θα μπορούμε να κρύψουμε στοιχεία που θα χρειαστεί ο Kodu για την απελευθέρωση! Τέλος, εισάγουμε τη θέση που θα φυλάσσεται η Kodula (απομονωμένη με μοναδική είσοδο/έξοδο μπροστά από το Κάστρο): 235
Θαυμάστε τον τελικό κόσμο μας και φύγαμε για προγραμματισμό! 12.4 Συμπεριφορές αντικειμένων και ανάλυση εντολών Kodu, συμπεριφορά και ανάλυση εντολών Ο αρχικός χαρακτήρας Kodu θα μας απασχολήσει για λίγο στο παιχνίδι καθώς θα μετατραπεί σε κόκκινο Μηχανάκια μόλις ακουμπήσει το Εργοστάσιο. Αφού βάλουμε τις εντολές κίνησης, πρέπει να τον προγραμματίσουμε ώστε μόλις ακουμπήσει το Εργοστάσιο, να εξαφανίζεται και να δημιουργεί στη θέση του τον κόκκινο Μηχανάκια. Είστε σε θέση πλέον να κατανοήσετε μόνοι σας τις συμπεριφορές που εμφανίζονται στην επόμενη εικόνα: 236
Λείπει κάτι; Λειτουργεί όπως θέλουμε ο Kodu; Αν όχι, πως μπορείτε να βελτιώσετε τις συμπεριφορές αυτές; Κόκκινος Μηχανάκιας Όπως φαίνεται από τη συμπεριφορά του Kodu, ο κόκκινος Μηχανάκιας είναι ένα αρχέτυπο αντικείμενο. Για να χρησιμοποιήσουμε αυτό το αντικείμενο, όπως μάθαμε στο κεφάλαιο 9, το μαρκάρουμε ως κλώνο (creatable). Από την αρχική περιγραφή του προβλήματος συμπεραίνουμε ότι στον κόκκινο Μηχανάκια θα χρειαστεί να υλοποιήσουμε αρκετές ενέργειες και συμπεριφορές τις οποίες μπορούμε να οργανώσουμε ως εξής: Σελίδα 1: κυρίως πρόγραμμα, βασικές ενέργειες, μεταβάσεις προς τις άλλες σελίδες Σελίδα 2: μετρητής γύρων Σελίδα 3: μετρητής πόντων επιτάχυνσης Σελίδα 4: τιμωρία σε κλέψιμο γύρων Σελίδα 5: μετατροπή σε Τζετ Σελίδα 6: χρήση επιτάχυνσης με Shift Αρχικά, για να μπορεί να κινείται με τα βέλη και να πυροβολεί με το Ζ: 237
Πώς θα καταφέρουμε να υλοποιήσουμε ένα ακριβή μετρητή γύρων; Είναι σωστό να βάλουμε απλά μία άσπρη γραμμή και να προγραμματίσουμε τα Μηχανάκια με τη συμπεριφορά: ΟΤΑΝ είσαι πάνω από έδαφος τύπου άσπρο, ΤΟΤΕ αύξησε την τιμή του σκορ κατά ένα; Όχι, γιατί μπορεί κάποιος χρήστης να κλέψει, αυξάνοντας το μετρητή κάνοντας μπρος πίσω ή να περιμένει πάνω στην άσπρη γραμμή ή ακόμα και να κάνει τους γύρους ανάποδα! Μια λύση είναι να βάλουμε μία δικλείδα ασφαλείας, ζωγραφίζοντας μία κόκκινη γραμμή μετά την άσπρη έτσι ώστε αν ο χρήστης προσπαθήσει να κάνει ανάποδα το γύρο, να αναγκαστεί να περάσει πρώτα από την κόκκινη γραμμή. Αυτό το χαρακτηριστικό θα το εκμεταλλευτούμε σε μία σελίδα (page) εισάγοντας τις κατάλληλες εντολές! Επίσης, για να μην επιτρέψουμε στο χρήστη να παίρνει πόντους απλά περιμένοντας πάνω στην άσπρη γραμμή, πρέπει να πάρουμε προγραμματιστικά τον έλεγχο του χαρακτήρα και να τον αναγκάσουμε να φύγει από την άσπρη γραμμή. Για παράδειγμα μπορούμε να ζητήσουμε από τον πρωταγωνιστή μας να ακολουθήσει ένα μονοπάτι μόλις βρεθεί πάνω στην άσπρη γραμμή που θα τον οδηγεί μετά από αυτή. Έπειτα θα του ξαναδώσουμε τον έλεγχο. Στο παραπάνω σκεπτικό βοηθά η εικόνα της πίστας στο σημείο τερματισμού: (παρατηρήστε τα διαφορετικά είδη εδαφών: άσπρο, γκρι, μαύρο) Σύμφωνα με τα παραπάνω, πρέπει να προγραμματίσουμε τον κόκκινο Μηχανάκια να αυξάνει το κόκκινο σκορ (μετρητής γύρων) κατά ένα, όταν περνά από την άσπρη γραμμή και ταυτόχρονα να μεταβαίνει ο έλεγχος προσωρινά από το χρήστη στο σύστημα. Μεταβαίνουμε στη σελίδα 2, όταν είμαστε πάνω από την άσπρη γραμμή τερματισμού. Στη σελίδα 2 θέλουμε να πάρουμε τον έλεγχο από το χρήστη, να αυξήσουμε το κόκκινο σκορ κατά ένα και να του ξαναδώσουμε τον έλεγχο όταν περάσει στο έδαφος μετά την άσπρη γραμμή επιστρέφοντας στη σελίδα 1. Η σελίδα 1 θα διατηρήσει όλα τα χαρακτηριστικά που είχε και πριν με την προσθήκη της παρακάτω συμπεριφοράς: Η σελίδα 2: 238
Σκεφτείτε τι πρόβλημα θα είχαμε αν αφήναμε μόνο την πρώτη εντολή. Όταν η ροή εκτέλεσης περάσει στη σελίδα 2, το σκορ θα αυξηθεί κατά ένα, αλλά ο χρήστης δε θα μπορεί να ελέγχει το Μηχανάκια! Το μόνο που θα ήξερε ο Μηχανάκιας στη σελίδα 2 είναι να αυξάνει το σκορ κατά ένα! Δε θα είχε προγραμματιστεί για κάτι διαφορετικό. Τώρα πρέπει να αποτρέψουμε το χρήστη από το να κλέβει γύρους. Είχαμε βρει έναν τρόπο βάζοντας μία κόκκινη γραμμή μετά την άσπρη. Πώς θα προγραμματίσουμε το Μηχανάκια έτσι ώστε, αν περάσει πρώτα την κόκκινη γραμμή χωρίς να έχει περάσει την άσπρη, να τιμωρείται ο παίκτης; Θα τον ακινητοποιήσουμε! Δηλαδή, κάθε φορά που θα πατάει την κόκκινη γραμμή, θα το στέλνουμε στη σελίδα 4 όπου θα χάνει τον έλεγχο, εκτός κι αν αμέσως μετά πατήσει σε έδαφος της πίστας (μαύρο). Προσθέτουμε στο κυρίως πρόγραμμα (σελίδα 1) μία μετάβαση για τη σελίδα 4 ΟΤΑΝ είσαι σε έδαφος <τύπος κόκκινο> ΤΟΤΕ μετάβαση σε σελίδα 4 και στη σελίδα 4 μια συμπεριφορά ΟΤΑΝ είσαι σε έδαφος <τύπος μαύρο> ΤΟΤΕ μετάβαση σε σελίδα 1 όπως φαίνεται στις δυο παρακάτω εικόνες: Τι κερδίσαμε; Δείτε το σενάριο όπου ο χρήστης προσπαθεί να κλέψει κάνοντας ανάποδα τους γύρους: Πατάει στην κόκκινη γραμμή, άρα πάει στη σελίδα 4 και αμέσως μετά πατάει σε γκρι έδαφος ανάμεσα στην κόκκινη και άσπρη γραμμή. Μένει για πάντα στη σελίδα 4 όπου δεν μπορεί να κουνηθεί! Δεν επιστρέφει ποτέ! Τον τιμωρήσαμε γιατί πήγε να παραβιάσει τους κανόνες του παιχνιδιού! Σκεφτείτε το λίγο, είναι απλό και δουλεύει! Η επόμενη ενέργεια που θα προγραμματίσουμε για το Μηχανάκια είναι να παίρνει πόντους επιτάχυνσης όταν περνάει πάνω από το νερό της πίστας. Πρέπει να αποθηκεύουμε κάπου αυτούς τους πόντους. Θα χρειαστούμε μία μεταβλητή (έστω το πράσινο σκορ) η οποία θα αυξάνει τιμή μόλις ο τύπος του υγρού είναι ίδιος με αυτόν που έχουμε ορίσει για την επιτάχυνση. Επίσης θα δώσουμε αρχικά 100 μονάδες επιτάχυνσης στο χρήστη. 239
Όπως και στα προηγούμενα παραδείγματα, πρέπει να αλλάξουμε συμπεριφορά στο χαρακτήρα μας, άρα θα χρησιμοποιήσουμε μία νέα σελίδα. Παρατηρήστε ότι κατά τη χρονική διάρκεια (εδώ 3 δευτερόλεπτα) στην οποία αυξάνουμε το μετρητή, δεν μπορούμε να επιταχύνουμε με το Shift. Στην πρώτη σελίδα βάζουμε μία μετάβαση για την τρίτη όταν ο Μηχανάκιας είναι πάνω στο υγρό: Όταν περάσουν τα 3 δευτερόλεπτα που χρειάζεται για να γεμίσει ενέργεια ο Μηχανάκιας, επιστρέφουμε πίσω στην αρχική σελίδα συμπεριφορών: Επίσης, οι πόντοι επιτάχυνσης πρέπει να μειώνονται όταν ο χρήστης πατάει το Shift. Θα σκεφτείτε... εύκολο αυτό, ας βάλουμε στην αρχική σελίδα μία εντολή ΟΤΑΝ πατηθεί στο Πληκτρολόγιο το Shift, ΤΟΤΕ Μείωσε το πράσινο σκορ κατά ένα. Φυσικά, αυτός ο τρόπος δε μας επιτρέπει να κινούμαστε γρηγορότερα! Για να λύσουμε το πρόβλημα θα χρησιμοποιήσουμε μία νέα σελίδα στην οποία θα υλοποιήσουμε την επιτάχυνση. Πρέπει όμως να προσέξουμε το πότε επιστρέφουμε στη σελίδα 1 και την κανονική ροή εκτέλεσης. Σκεφτείτε: επιστρέφουμε στη σελίδα 1 όταν δεν πατάμε το Shift ή όταν οι πόντοι πέσουν κάτω από το μηδέν. Στην πρώτη περίπτωση είναι απαίτηση του χρήστη να μη χρησιμοποιήσει τους πόντους του, ενώ στη δεύτερη δεν έχει δικαίωμα να επιταχύνει. Σε αυτό το σημείο μπορεί κάποιος να αναρωτηθεί τι θα γίνει αν ο χρήστης έχει συνεχώς πατημένο το Shift ενώ οι πόντοι επιτάχυνσης είναι μηδέν; Θα μεταπηδάμε συνεχώς από την πρώτη σελίδα στην τρίτη, με αποτέλεσμα να μειώνονται οι πόντοι και κάτω από το μηδέν! 240
Η μετατροπή του Μηχανάκια σε Tζετ όταν χτυπήσει την Kαλύβα είναι πια κάτι απλό για εμάς! Με τόση εξάσκηση στην αλλαγή συμπεριφορών και στην ανακατεύθυνση σε άλλα κομμάτια κώδικα η υλοποίηση είναι πια παιχνιδάκι! Τέλος, δύο ακόμα χαρακτηριστικά που είχαμε βάλει στην περιγραφή είναι η αύξηση της ενέργειας του Μηχανάκια όταν παίρνει μία Kαρδιά και το Ζάλισμα (Stun) στο μαύρο Μηχανάκια όταν τον πυροβολούμε. Παρατηρήστε ότι από τα παραδείγματα που κάναμε μέχρι τώρα προκύπτει πως, αν οι χαρακτήρες μας θέλουμε να αποκτούν ιδιαίτερα χαρακτηριστικά σε κάποια στιγμή του παιχνιδιού, αρκεί να αντιγράψουμε τις βασικές συμπεριφορές τους σε μια νέα σελίδα, να προσθέσουμε τις νέες συμπεριφορές και μετά προγραμματιστικά να ελέγχουμε πότε θα τρέχει κάθε σελίδα! 241
Καρδιές Ένα ζήτημα που δεν έχουμε ασχοληθεί μέχρι τώρα είναι το πού θα εισάγουμε τις συμπεριφορές που θα επιτρέπουν στο Τομ να αποκτά ενέργεια από τις Καρδιές. Αν τις βάλουμε στις Καρδιές, θα εισάγουμε μια φορά τις συμπεριφορές, ενώ αν τις εισάγαμε στον Μηχανάκια θα έπρεπε να τις επαναλαμβάνουμε σε κάθε σελίδα συμπεριφορών του. Χμ! Καλύτερα στις καρδιές και στην συνέχεια με αντιγραφή και επικόλληση, θα τοποθετήσουμε Καρδιές σε όποια σημεία της πίστας επιθυμούμε. Επομένως, στην πρώτη σελίδα μιας Καρδιάς: Δορυφόρος Πώς θα προγραμματίσουμε τους Δορυφόρους, έτσι ώστε να εμφανίζονται και να εξαφανίζονται σε τυχαία χρονικά διαστήματα, πυροβολώντας τον Kodu; Σίγουρα θα χρειαστούμε τις εντολές Χρονόμετρο (Timer), Τυχαία (Random) και Έκρηξη (Boom) (ή Εξαφανίζω (Vanish)). Aν όμως κάνουμε το χαρακτήρα μας να εξαφανίζεται, πώς θα τον επαναφέρουμε στη ζωή και σε τυχαίο μάλιστα χρονικό διάστημα; Η λύση ακούει στο όνομα... κλώνοι (creatables)! Δημιουργούμε δύο χαρακτήρες (π.χ. ένα Νόμισμα και το Δορυφόρο μας) σε μορφή κλώνου (creatable) και τους προγραμματίζουμε έτσι ώστε όταν καταστρέφουν τον εαυτό τους, να δημιουργεί νέους! Καταρχήν, όταν ο Δορυφόρος μας είναι "εν ζωή", πρέπει να πυροβολεί το κόκκινο Τζετ που είναι κοντά του. Επίσης, θα το βάλουμε να περιφέρεται σε ένα τρίγωνο κίτρινο μονοπάτι έτσι ώστε να προστατεύει την περιοχή: Για παράδειγμα, έστω ότι ένας δορυφόρος δημιουργεί ένα αόρατο Νόμισμα (γράφουμε εκεί τις εντολές προς εκτέλεση!): 242
Νόμισμα (σε συνδυασμό με το Δορυφόρο) Στο Νόμισμα πρέπει να εισάγουμε την τυχαιότητα. Σίγουρα θα σας έχει τύχει παίζοντας διάφορα παιχνίδια «να μην ξέρετε από πού σας έρχονται»! Και όχι μόνο αυτό, αλλά κάθε φορά που παίζετε την ίδια ακριβώς πίστα στο ίδιο ακριβώς σημείο, «οι εχθροί» σας να είναι σε διαφορετικές θέσεις! Τυχαία! Αυτό θα κάνουμε και εμείς. Όσο ο Δορυφόρος είναι εξαφανισμένος (άρα εκτελείται το πρόγραμμα του Νομίσματος) και με τυχαία καθυστέρηση (ανάμεσα σε 0.25 και 2 δευτερόλεπτα), το Νόμισμα θα δημιουργεί το Δορυφόρο: Παρατηρείτε κάποια έλλειψη; Στον προγραμματισμό πάντα ένα σημαντικό κομμάτι είναι η αρχικοποίηση. Εδώ ποιο αντικείμενο θα τρέξει πρώτο; Ο Δορυφόρος ή το Νόμισμα; Αφού και τα δύο είναι κλώνοι (creatables) και δεν υπάρχουν στο παιχνίδι, πρέπει κάποιος να τα δημιουργήσει. Γι αυτό το σκοπό δημιουργούμε άλλο ένα αντικείμενο (έστω άλλο ένα φανερό Νόμισμα) το οποίο θα κάνει την αρχή της αλυσιδωτής μας αντίδρασης με το που πλησιάσει το Τζετ κοντά του. 243
Τζετ Επιτέλους και ένα αντικείμενο που δε θα μας ταλαιπωρήσει! Οι ενέργειες του Τζετ είναι σχετικά απλές. Το Τζετ πρέπει να μετακινείται με τα βέλη του πληκτρολογίου και να ανεβοκατεβαίνει όποτε το επιθυμεί ο χρήστης (επίσης με το πληκτρολόγιο). Το ιδιαίτερο χαρακτηριστικό του είναι ότι μπορεί να κουβαλήσει την Μπάλα και να την πετάξει όταν του ζητηθεί! Είστε έτοιμοι. 244
Παραλλαγές 1. Στα διάφορα αντικείμενα έχουμε εισάγει περισσότερες σελίδες συμπεριφορών από αυτές που πραγματικά χρειαζόμασταν. Μπορείτε να βρείτε τους αντίστοιχους πλεονασμούς και να τους διορθώσετε; 2. Αποσφαλμάτωση (Debugging) του κώδικα. Στο παιχνίδι μας προγραμματίσαμε τον κόκκινο Μηχανάκια να μετατρέπεται σε Τζετ όταν ακουμπά την Καλύβα και αφού έχει νικήσει στον αγώνα ταχύτητας. Όμως υπάρχει ένα σενάριο εκτέλεσης όπου ο κώδικας δε συμπεριφέρεται σύμφωνα με τις προδιαγραφές που έχουμε θέσει. Στον προγραμματισμό, αυτή η περίπτωση αποτελεί ένα σφάλμα λογισμικού (software bug) του προγράμματος. Συγκεκριμένα στην παραπάνω υλοποίηση του παιχνιδιού υπάρχει ένα σενάριο εκτέλεσης του προγράμματος όπου ο κόκκινος Μηχανάκιας καταφέρνει να βγει εκτός πίστας αγώνα χωρίς να μετατραπεί σε Τζετ. Καλείστε λοιπόν να βρείτε αυτό το σενάριο, να εξηγήσετε γιατί συμβαίνει και να το διορθώσετε. 245