Βήμα 7: Πεδία entities, κέρσορες και scripts

 

Πεδία entities

Αν δοκιμάσετε το παιχνίδι θα διαπιστώσετε ότι το γραφείο και η καρέκλα εμφανίζονται ως διαδραστικά αντικείμενα: όταν περάσει ο κέρσορας του ποντικιού πάνω από αυτά τότε θα αλλάξει ο κέρσορας και θα εμφανιστεί η περιγραφή του αντικειμένου. Αυτό συμβαίνει γιατί και τα δύο αυτά αντικείμενα είναι entities και έχουν ορισμένη την παράμετρο "Interactivity" (διαδραστικότητα) στην τιμή "true". Τι γίνεται όμως στην περίπτωση που θέλουμε να προσθέσουμε διαδραστικότητα σε ένα αντικείμενο που είναι τμήμα του φόντου; Χρειάζεται να δημιουργήσουμε νέες entities για όλα τα αντικείμενα; Η απάντηση είναι και ναι και όχι και αυτό γιατί ο SceneEdit μας επιτρέπει να δημιουργήσουμε τα λεγόμενα "πεδία entities". Αυτά λειτουργούν σαν συνηθισμένες entities αλλά δεν χρειάζεται να εισάγουμε μία εικόνα σε αυτές καθώς ορίζονται από ένα απλό πεδίο μέσα στην σκηνή.

Στη συνέχεια θα προσθέσουμε μερικά ακόμα διαδραστικά αντικείμενα στην σκηνή μας όπως η πόρτα, η ντουλάπα και το παράθυρο.

Ανοίξτε την σκηνή στον SceneEdit.

Για να προσθέσετε ένα "πεδίο entity", πατήστε το κουμπί "Add entity -> Add region entity" για να δημιουργηθεί μία νέα entity.

 

Τα υπόλοιπα είναι πολύ εύκολα. Απλώς αλλάξτε το όνομα, την παράμετρο caption και το σχήμα του πεδίου στα επιθυμητά.

Προσθέστε τρεις entities στην σκηνή: door (πόρτα), closet (ντουλάπα) και window (παράθυρο) όπως βλέπουμε στις εικόνες.

       

 

Σημείωση: η σειρά των entities και των πεδίων είναι πολύ σημαντική! Έχουμε ήδη μάθει γιατί είναι σημαντική στο σχεδιασμό της σκηνής αλλά είναι το ίδιο σημαντική και στη διαδραστικότητα του παιχνιδιού. Αυτό ισχύει γιατί όταν η μηχανή πρέπει να αποφασίσει σε ποιο αντικείμενο βρίσκεται ο κέρσορας του ποντικιού τότε ελέγχει όλους τους κόμβους από επάνω προς τα κάτω.

Στην περίπτωσή μας η σειρά των entities δεν είναι σημαντική γιατί δεν υπερκαλύπτονται μεταξύ τους.

 
Αν τρέξετε το παιχνίδι θα δείτε ότι η πόρτα, η ντουλάπα και το παράθυρο θα έχουν γίνει διαδραστικά αντικείμενα.

 

Κέρσορες

Θα έχετε παρατηρήσει ότι ο κέρσορας του ποντικιού αλλάζει όταν περάσει πάνω από ένα διαδραστικό αντικείμενο. Αυτοί είναι και οι δύο προκαθορισμένοι κέρσορες: ο κανονικός και ο ενεργός (μπορείτε να τους αλλάξετε στις παραμέτρους του παιχνιδιού -game properties- στον ProjectMan). Μπορείτε όμως να ορίσετε και ειδικούς κέρσορες σε διάφορα αντικείμενα. Ας πούμε για παράδειγμα ότι θέλουμε ο κέρσορας να αλλάζει σχήμα όταν θα περνάει πάνω από την πόρτα στη σκηνή μας. Κάτι τέτοιο είναι πολύ απλό να γίνει αφού όλοι οι κέρσορες είναι στην πραγματικότητα sprites και μπορείτε να τις ορίσετε στις entities με τον SceneEdit.

Επιλέξτε την entity "door" στον SceneEdit.


Υπόδειξη

Μπορείτε γρήγορα να επιλέξετε μία entity στον SceneEdit κάνοντας διπλό κλικ επάνω της στο παράθυρο προεπισκόπισης.

Στις παραμέτρους της entity θα δείτε μία ρύθμιση "Cursor" (κέρσορας). Κάντε κλικ στο κουμπί "..." στα δεξιά της και θα σας ζητηθεί να δώσετε το sprite που περιλαμβάνει τον κέρσορα. Στο φάκελο του οδηγού θα βρείτε μερικούς έτοιμους κέρσορες στον υποφάκελο "data\sprites\system". Επιλέξτε από εκεί το αρχείο "arrow_left.sprite" και κάντε κλικ στο OK.


Υπόδειξη

Αν θελήσετε να αφαιρέσετε έναν ορισμένο κέρσορα ή αρχείο sprite κάντε κλικ στο κουμπί "..." και μετά στο "Cancel". Αμέσως μετά ο SceneEdit θα σας ρωτήσει αν θέλετε να αφαιρέσετε το ήδη ορισμένο αρχείο και εσείς απλώς πείτε ναι.

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

 

Scripts

Τα αντικείμενα της σκηνής μας φαίνονται να είναι διαδραστικά τώρα, αλλά αν κάνουμε κλικ επάνω τους τίποτα δεν συμβαίνει. Αυτό που πρέπει να γίνει είναι να προσθέσουμε "λογική" στο παιχνίδι μας και αυτή δεν είναι άλλη από τα scrips, τα οποία είναι αρχεία κειμένου που περιέχουν ένα μικρό τμήμα κώδικα. Περιγραφή των scripts θα βρείτε σε άλλο κεφάλαιο καθώς σε αυτό τον οδηγό περιγράφονται μόνο τα βασικά.

Ας προσθέσουμε τώρα ένα script στο γραφείο (entity "desk"). Πρώτα πρέπει να το δημιουργήσουμε και ο πιο εύκολος τρόπος είναι να χρησιμοποιήσουμε κάποιο από τα πρότυπα στον ProjectMan. Ενέργεια που έχουμε ήδη ξανακάνει αρκετές φορές. Πηγαίνετε λοιπόν στον ProjectMan, και κάντε κλικ στο σύμβολο + αριστερά από τον φάκελο "MyScene" για να τον διευρύνετε και να δείτε τα περιεχόμενά του. Στη συνέχεια κάντε δεξί κλικ στον φάκελο "MyScene\scr" και επιλέξτε την εντολή "Add script...".

 

Στο παράθυρο επιλογής προτύπου, επιλέξτε το "scene object.script", αλλάξτε το όνομα του σε "desk" και πατήστε το κουμπί ΟΚ για να δημιουργηθεί ένα νέο script στον φάκελο "scr".

 

Ανοίξτε τη σκηνή στον SceneEdit και επιλέξτε την entity "desk". Στις παραμέτρους της entity θα δείτε ένα κουμπί "Scripts...". Πατήστε το για να εμφανιστεί το παράθυρο ορισμού scripts στο οποίο μπορείτε να ορίσετε ένα ή περισσότερα scripts στο επιλεγμένο αντικείμενο. Πατήστε το κουμπί "Add script".

   

 

Θα σας ζητηθεί να ορίσετε ένα script. Δώστε το "desk.script" και πατήστε κλικ στο κουμπί OK.

 

Τώρα πρέπει να ανοίξουμε και να φτιάξουμε το script ώστε να ανταποκρίνεται στις ανάγκες μας. Μπορείτε να το ανοίξετε είτε χρησιμοποιώντας το κουμπί "Edit script" είτε κάνοντας διπλό κλικ πάνω στο όνομα του αρχείου. Ο SceneEdit θα ανοίξει το αρχείο στον βασικό σας κειμενογράφο (στα windows είναι συνήθως το notepad, αν θέλετε να ρυθμίσετε έναν άλλο κειμενογράφο δείτε το κεφάλαιο ρύθμιση κειμενογράφου).

To script θα πρέπει να είναι σαν αυτό:

#include "scripts\base.inc"

////////////////////////////////////////////////////////////////////////////////
on "LookAt"
{
 GoToObject();
 actor.Talk("Μπλα");
}

////////////////////////////////////////////////////////////////////////////////
on "Take"
{
 GoToObject();
 actor.Talk("Μπλα");
}

.
.
.

////////////////////////////////////////////////////////////////////////////////
function GoToObject() { actor.GoTo(200, 200); actor.TurnTo(DI_UP); }

Τα μπλοκ "on "xxx" {}" λέγονται "Χειριστές γεγονότων". Αυτά τα μπλοκ είναι κώδικας που εκτελείται όταν ένα συγκεκριμένο γεγονός εφαρμόζεται στο αντικείμενο. Για παράδειγμα, όταν ο χρήστης ανοίξει το μενού στο γραφείο και επιλέξει το εικονίδιο "Look at", ένα γεγονός "LookAt" εφαρμόζεται στο γραφείο και ο "χειριστής γεγονότος" εκτελείται. Υπάρχουν γεγονότα υψηλού επιπέδου, όπως τα "LookAt και "Talk" τα οποία είναι πλήρως παραμετροποιήσιμα από το δημιουργό του παιχνιδιού αλλά και γεγονότα χαμηλού επιπέδου όπως το "LeftClick" τα οποία ενεργοποιούνται από τη μηχανή και τα ονόματά τους είναι προγραμματισμένα μέσα στον κώδικα της μηχανής και δεν αλλάζουν.

Ας δούμε τον χειριστή "LookAt":
 GoToObject();
 actor.Talk("Μπλα");

Αυτό το κομμάτι κώδικα λέει στην μηχανή να καλέσει τη συνάρτηση "GoToObject" και μετά δίνει εντολή στο χαρακτήρα να πει "Μπλα". Η συνάρτηση GoToObject έχει προδημιουργηθεί για ευκολία:

function GoToObject()
{
 actor.GoTo(200, 200);
 actor.TurnTo(DI_UP);
}

Αυτό η συνάρτηση κάνει τα ακόλουθα: λέει στον χαρακτήρα να περπατήσει προς τις συντεταγμένες 200,200 και μετά να γυρίσει προς τα πάνω.

Θα αλλάξουμε αυτό τον κώδικα για να επιτύχουμε την ακόλουθη συμπεριφορά: όταν ο χρήστης χρησιμοποιήσει το εικονίδιο "Look At" στο γραφείο, τότε ο χαρακτήρας θα πρέπει να περπατήσει προς το γραφείο, να γυρίσει προς την κατεύθυνσή του και μετά να πει "Φαίνεται ότι είναι ένα γερό γραφείο".

Θα ασχοληθούμε πρώτα με το δεύτερο τμήμα: απλώς αλλάξτε το κείμενο "Μπλα" στο επιθυμητό:

on "LookAt"
{
 GoToObject();
 actor.Talk("Φαίνεται ότι είναι ένα γερό γραφείο.");
}

Τώρα χρειάζεται να αλλάξουμε τη συνάρτηση GoToObject ώστε ο χαρακτήρας να περπατάει προς το γραφείο. Πως θα βρούμε όμως τις σωστές συντεταγμένες; Ο πιο εύκολος τρόπος είναι να χρησιμοποιήσουμε και πάλι το εργαλείο τοποθέτησης χαρακτήρα που περιγράψαμε στο Βήμα 6 αυτού του οδηγού. Τοποθετήστε λοιπόν τον χαρακτήρα στη θέση που θέλετε να σταθεί δίπλα στο γραφείο.


 

Τώρα που τοποθετήσαμε τον χαρακτήρα πως μπορούμε να εισάγουμε αυτή την θέση στον κώδικα; Χρησιμοποιήστε την εντολή "Actor -> Copy actor placement" από το μενού ή απλώς πατήστε τoν συνδυασμό πλήκτρων Ctrl+C.


 

Ο ακόλουθος κώδικας θα αντιγραφεί στο clipboard:

actor.GoTo(544, 638);
actor.TurnTo(DI_UPRIGHT);

Αυτός ο κώδικα μιμείται τη θέση του χαρακτήρα στο παράθυρο προεπισκόπισης στον SceneEdit. Αυτό που πρέπει να κάνουμε τώρα είναι να τον προσθέσουμε στο αρχείο "desk.script". Τελικά ο κώδικας θα πρέπει να μοιάζει με το παράδειγμα:

function GoToObject()
{
 actor.GoTo(544, 638);
 actor.TurnTo(DI_UPRIGHT);
}

Μπορείτε αν θέλετε να αλλάξετε και τον χειριστή "Take" έτσι ώστε ο χαρακτήρας να λέει κάτι αστείο όταν του πείτε να πάρει το γραφείο.

on "Take"
{
 GoToObject();
 actor.Talk("Το γραφείο είναι λίγο πιο βαρύ από ότι μπορώ να σηκώσω...");
}

Εφόσον δεν μπορείτε να μιλήσετε στο γραφείο μπορείτε να αφαιρέσετε το χειριστή "Talk". Σε αυτή την περίπτωση κάποιος προκαθορισμένος χειριστής "Talk" θα χρησιμοποιηθεί.

Ο χειριστής "LeftClick" απλώς καλεί τη συνάρτηση GoToObject που σημαίνει ότι όταν ο παίκτης κάνει αριστερό κλικ στο γραφείο, ο χαρακτήρας θα περπατήσει προς αυτό.

Σώστε το script, εν συνεχεία σώστε την σκηνή, κλείστε τον SceneEdit και τρέξτε το παιχνίδι.

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


 

Μπορείτε να προσθέσετε scripts σε όλα τα αντικείμενα της σκηνής με τον ίδιο τρόπο. Για ολοκληρωμένα scripts δείτε το αρχείο "step7.scene".

Αρκετά με τον προγραμματισμό όμως. Ας περάσουμε στην επόμενη παράγραφο αυτού του οδηγού, Βήμα 8: Επίπεδα.