Δουλεύοντας με το inventory

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

Το πλαίσιο του inventory

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

Ο ορισμός του γίνεται μέσω ενός απλού αρχείου κειμένου που έχει δομή παρόμοια με το δείγμα:

INVENTORY_BOX
{
 ITEM_WIDTH = 65
 ITEM_HEIGHT = 65
 SPACING = 10
 SCROLL_BY = 1
 HIDE_SELECTED = TRUE

 AREA { 30, 12, 770, 77 }
 EXCLUSIVE = FALSE

WINDOW
 {
 X = 0
 Y = 0
 WIDTH = 800
 HEIGHT = 90
 IMAGE = "interface\inventory.bmp"
 
 BUTTON
 {
 TEMPLATE = "ui_elements\template\but.button"
 NAME = "prev"
 TEXT = "<"
 X = 0
 Y = 0
 WIDTH = 30
 HEIGHT = 90
 }

 BUTTON
 {
 TEMPLATE = "ui_elements\template\but.button"
 NAME = "next"
 TEXT = ">"
 X = 770
 Y = 0
 WIDTH = 30
 HEIGHT = 90
 }
 }
}

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

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

Ακολουθώντας αυτές τις ρυθμίσεις η WME αυτόματα θα τοποθετεί τα αντικείμενα στο inventory.

Όσον αφορά το δεύτερο τμήμα είναι απλώς μία περιγραφή παραθύρου με ορισμένες εξαιρέσεις. Αν ονομάσετε κάποια κουμπιά "next", "prev" ή "close", η WME θα τα χρησιμοποιήσει αυτόματα για το scrolling και το κλείσιμο του inventory αντίστοιχα.

Περιγραφές αντικειμένων

Όλα τα αντικείμενα του inventory πρέπει να οριστούν σε ένα αρχείο περιγραφής (που συνήθως έχει το όνομα "items.items"). Αυτό το αρχείο περιέχει ξεχωριστό τμήμα για κάθε αντικείμενο που θα χρειαστείτε μέσα στο παιχνίδι και έχει την παρακάτω μορφή:

ITEM
{
 CAPTION = "Item caption"
 NAME = "item_name"

 SPRITE = "items\normal_image.bmp"
 SPRITE_HOVER = "items\hover_image.bmp"

 CURSOR = "items\normal_cursor.bmp"
 CURSOR_HOVER = "items\hover_cursor.bmp"
 CURSOR_COMBINED = TRUE

 ALPHA = 255
 ALPHA_COLOR { 255, 255, 255 }

 TALK = "items\item_talking.sprite"
 FONT = "fonts\some.font"

 SCRIPT = "items\item.script"

 AMOUNT = 100
 DISPLAY_AMOUNT = FALSE
 AMOUNT_ALIGN = right
 AMOUNT_OFFSET_X = 5
 AMOUNT_OFFSET_Y = 47
}
Επεξήγηση:

Οι περισσότερες από αυτές τις ιδιότητες είναι προαιρετικές. Είναι απαραίτητο να ορίσετε μόνο τα NAME και SPRITE και ίσως τα CAPTION και SCRIPT.

Πρέπει να εισάγετε ένα αντίστοιχο πεδίο για κάθε αντικείμενο στο αρχείο περιγραφής των αντικειμένων.

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

Χρησιμοποιώντας το inventory μέσω των scripts

Αφού ορίσουμε το πλαίσιο του inventory και τις περιγραφές των αντικειμένων μπορούμε να τα χρησιμοποιήσουμε στο παιχνίδι με τα scripts. Όλες οι αντίστοιχοι μέθοδοι και ιδιότητες των scripts αναφέρονται λεπτομερώς στο κεφάλαιο Οδηγός αναφοράς για τη γλώσσα προγραμματισμού της wme.

Πως μπορούμε να αποκτήσουμε, να αφαιρέσουμε, να καταστρέψουμε και να καλέσουμε τα αντικείμενα

Συνήθως αναφερόμαστε σε ένα αντικείμενο με το όνομα του. Αν θέλετε να εισάγετε κάποιο στο inventory χρησιμοποιήστε την μέθοδο Game.TakeItem(). Για παράδειγμα:

Game.TakeItem("book");

Αυτή η εντολή θα εισάγει το αντικείμενο "book" στο inventory. Στην περίπτωση που έχετε πολλαπλά inventories πρέπει να καλέσετε την μέθοδο TakeItem μέσω του αντικειμένου του παιχνιδιού στο οποίο ανήκει όπως για παράδειγμα OldGuy.TakeItem("book");

Η αφαίρεση ενός αντικειμένου, με την μέθοδο Game.DropItem(), λειτουργεί με τον ίδιο τρόπο:

Game.DropItem("book");

Αυτή η εντολή θα αφαιρέσει το αντικείμενο από το inventory. Όμως παρότι το αντικείμενο θα σταματήσει να φαίνεται στο inventory αυτό μπορεί να χρησιμοποιηθεί και πάλι αργότερα. Αν θέλετε να το αφαιρέσετε μόνιμα τότε χρησιμοποιήστε την μέθοδο Game.DeleteItem().

Για να καλέσετε ένα αντικείμενο που βρίσκεται στο inventory χρησιμοποιήστε την μέθοδοGame.GetItem() η οποία θα επιστρέψει αναφορά στο αντικείμενο ώστε να ορίσετε τις ιδιότητες αυτού.

Για να ελέγξετε αν ένα αντικείμενο βρίσκεται στην κατοχή του χαρακτήρα χρησιμοποιήστε την μέθοδο Game.IsItemTaken(). Η εντολή αυτή θα εξετάσει όλα τα inventories για να δει εάν ένα από αυτά έχει το αντικείμενο. Εάν θέλετε να ελέγξετε αν ένα συγκεκριμένο αντικείμενο του παιχνιδιού έχει στην κατοχή του ένα αντικείμενο του inventory χρησιμοποιήστε την μέθοδο HasItem():

// έχει κάποιος το βιβλίο;
var IsBookTaken = Game.IsItemTaken("book");

// έχει ο OldGuy το βιβλίο;
var OldGuyHasBook = OldGuy.HasItem("book");

Ορισμός ενός αντικειμένου του inventory σε ένα αντικείμενο της σκηνής

Είναι πολύ συνηθισμένο να υπάρχουν κάποια αντικείμενα στη σκηνή τα οποία ο παίκτης θα μπορεί να τα πάρει. Επακόλουθο είναι τα αντικείμενα αυτά να εξαφανίζονται κατόπιν από την σκηνή. Είναι πολύ εύκολο να συνδέσετε ένα αντικείμενο του inventory με ένα αντικείμενο της σκηνής. Ας υποθέσουμε ότι υπάρχει μία entity η οποία αντιπροσωπεύει ένα αντικείμενο με το όνομα "book". Όταν ο παίκτης το αποκτήσει θέλουμε να εξαφανιστεί από την σκηνή. Στον SceneEdit, επιλέξτε από την λίστα την entity και στο πεδίο "Item" δώστε το όνομα του αντικειμένου που θέλετε να ενώσετε με αυτό:

Η entity "book" είναι τώρα συνδεδεμένη με το αντικείμενο "book" του inventory. Αυτό σημαίνει ότι αν χρησιμοποιήσετε την εντολήGame.TakeItem("book"); σε ένα script η entity θα εξαφανιστεί αυτόματα από την σκηνή. Ανάλογα αν ρίξετε το αντικείμενο με την εντολή Game.DropItem("book"); η entity θα ξαναεμφανιστεί στην σκηνή. Αν θέλετε όμως να αφαιρέσετε μόνιμα ένα αντικείμενο από το inventory και την σκηνή καλέστε την εντολή Game.DeleteItem("book");

Επιλογή αντικειμένων

Αν ο παίκτης επιλέξει ένα αντικείμενο του inventory ο κέρσορας του ποντικιού θα αλλάξει αντίστοιχα. Αν ο δείκτης του κέρσορα μετακινηθεί πάνω από ένα διαδραστικό αντικείμενο της σκηνής, τότε για την γραφική απεικόνιση του κέρσορα θα χρησιμοποιηθεί η εικόνα "hover cursor" ενώ σε αντίθετη περίπτωση η εικόνα "cursor" (δείτε παραπάνω την περιγραφή των αντικειμένων). Για να κάνετε ένα αντικείμενο του inventory επιλεγμένο χρησιμοποιήστε την ιδιότηταGame.SelectedItem και για να το αποεπιλέξετε ορίστε σε αυτή την τιμή null.

Στην περίπτωση που δεν θέλετε ο κέρσορας να αλλάζει γραφική απεικόνιση όταν βρίσκεται πάνω από ένα αντικείμενο της σκηνής που δεν αντιδρά στο επιλεγμένο αντικείμενο του inventory, δώστε στην ιδιότητα Game.SmartItemCursor την τιμή true. Το μόνο που κάνει αυτή η ιδιότητα είναι να ελέγχει αν στο αντικείμενο που βρίσκεται κάτω από τον κέρσορα υπάρχει ορισμένο γεγονός με το όνομα του επιλεγμένου αντικείμενου του inventory. Πρέπει να σημειωθεί ότι αυτή η ιδιότητα επηρεάζει μόνο την γραφική απεικόνιση του κέρσορα και δεν εμποδίζει τον παίκτη να χρησιμοποιήσει το επιλεγμένο αντικείμενο του inventory στο αντικείμενο της σκηνής. Αυτή τη λειτουργία θα πρέπει να την ελέγξετε μέσω των scripts.

Πολλαπλά inventories

Στην WME κάθε αντικείμενο της σκηνής (το παιχνίδι, οι χαρακτήρες, οι entities) μπορεί να έχει το ατομικό του inventory. Αυτή η δυνατότητα είναι χρήσιμη σε παιχνίδια με πολλούς κεντρικούς χαρακτήρες. Χρησιμοποιώντας την ιδιότητα Game.InventoryObject μπορείτε να ελέγξετε ποιο inventory θα φαίνεται στην οθόνη. Από προεπιλογή αυτή η ρύθμιση είναι ορισμένη στο αντικείμενο Game που είναι αρκετό για παιχνίδια με ένα inventory. Αν έχετε περισσότερους από έναν κεντρικούς χαρακτήρες που εναλλάσσονται πρέπει να ρυθμίσετε την ιδιότητα στον εκάστοτε ενεργό χαρακτήρα.

Αναφορά/Επιστροφή των διαθέσιμων στο inventory αντικειμένων

Μερικές φορές είναι χρήσιμο να μπορείτε να ελέγχετε και να καλείτε όλα τα αντικείμενα του inventory του παιχνιδιού. Η ιδιότητα Game.TotalNumItems επιστρέφει τον συνολικό αριθμό των αντικειμένων (είτε τα έχει πάρει ο παίκτης είτε όχι) και με τη μέθοδοGame.QueryItem() μπορείτε να καλέσετε ένα από αυτά. Ο παρακάτω κώδικας παράδειγμα ελέγχει όλα τα αντικείμενα του inventory και εμφανίζει στην οθόνη τα ονόματά τους:

for(var i=0; i<Game.TotalNumItems; i=i+1)
{
 var Item = Game.QueryItem(i);
 Game.Msg(Item.Name);
}