Στην άσκηση αυτή θα εξοικειωθείτε με τη διαχείριση τοίχων με υφή γυαλιού (το οποίο μπορεί να «σπάσει» κιόλας), πόρτες που ανοίγουν περιστρεφόμενες γύρω από ένα άξονα, teleporter και εφέ έκρηξης σε αντικείμενο, χρησιμοποιώντας το λογισμικό Valve Editor. Ας ξεκινήσουμε λοιπόν! Στο περιβάλλον Valve Hammer Editor συναντάμε δύο είδη οντοτήτων - «πόρτες»: Τη συρόμενη πόρτα (Sliding door), η οποία ενεργοποιείται με κάποιον trigger κι ανοιγοκλείνει μετακινούμενη πάνω-κάτω, δεξιά-αριστερά, μέσα-έξω, συρόμενη σε ένα επίπεδο-επιφάνεια Την περιστρεφόμενη πόρτα (Rotating door), η οποία ενεργοποιείται με κάποιον trigger κι ανοιγοκλείνει περιστρεφόμενη γύρω από ένα σταθερό άξονα, ο οποίος θα έχει τη λειτουργία «μεντεσέ» Στο παράδειγμα αυτό, η αριστερή πόρτα (η «μεταλλική») του χάρτη, ο οποίος έχει δημιουργηθεί στο αρχείο Example_two_doors.rmf, θα λειτουργήσει ως συρόμενη και η δεξιά (η «ξύλινη») θα λειτουργήσει ως περιστρεφόμενη. Σε προηγούμενη άσκηση έχει αναλυθεί η διαδικασία δημιουργίας πόρτας (πρώτα φτιάχνουμε το περίγραμμα-κάσα, μετά σχεδιάζουμε το ορθογώνιο παραλληλεπίπεδο που θα αντιστοιχεί στο αντικείμενο-πόρτα, προσαρμόζουμε τις διαστάσεις του ώστε να ταιριάζουν με αυτές του πλαισίου της πόρτας και του προσδίδουμε υφή, την οποία και ευθυγραμμίζουμε). Στο παράδειγμα αυτό, έχοντας ανοίξει το αρχείο Example_two_doors.rmf, η σχεδίαση είναι ήδη έτοιμη, οπότε απομένει να γίνει η σωστή ρύθμιση για την ενεργοποίηση και λειτουργικότητα των πορτών. 1. Αρχικά, η μεταλλική πόρτα θα έχει τον τύπο κλάσης (class type) func_door όταν μετατραπεί σε οντότητα (μενού Tools>>Tie to entity). Όπως ήδη γνωρίζετε, υπάρχουν αρκετά χαρακτηριστικά (attributes) για τα οποία ο σχεδιαστής μπορεί να ορίσει τιμές και να εισάγει διάφορες λειτουργικότητες (π.χ. ήχο, εφέ «ανοίγματος» κ.λπ.), το πιο σημαντικό από τα οποία είναι η κατεύθυνση (direction) κατά την οποία θα ολισθαίνει η πόρτα στην επίπεδη επιφάνεια (χρησιμοποιούμε τις τρεις «πυξίδες» στη δεξιά εργαλειοθήκη για να ορίσετε τη γωνία μετακίνησης). Για να μετακινήσετε την πόρτα κατά τον άξονα Z (μετακίνηση σε top view) θα χρησιμοποιήσετε την πρώτη (πάνω) πυξίδα. Μπορείτε επίσης να ορίσετε ήχο ανοίγματος/ακινητοποίησης της πόρτας, όπως επίσης να πειραματιστείτε με την ταχύτητα κίνησής της και την καθυστέρηση κλεισίματος ή τη μονιμοποίησή της στην κατάσταση «ανοιχτή». Όσον αφορά στα flags, η σημαία Use only επιτρέπει το άνοιγμα της πόρτας μόνο όταν ο ήρωας την πλησιάσει αρκετά και χρησιμοποιήσει το κουμπί USE του παιχνιδιού (πλήκτρο Ε στο Half-life), ενώ η σημαία Toggle επιτρέπει στην πόρτα να κλείνει άμεσα αντί να παραμένει μόνιμα ανοιχτή ή να κλείνει μετά από κάποιο χρόνο. Κάνετε τις κατάλληλες ρυθμίσεις ώστε η πόρτα να ανοίγει προς τον εσωτερικό τοίχο, παραμένοντας ανοιχτή όταν ο χαρακτήρας θα χρησιμοποιεί το πλήκτρο use. 2. Η ξύλινη πόρτα είναι περιστρεφόμενη, οπότε ο τύπος κλάσης της θα είναι func_door_rotating και χρειάζεται λίγη περισσότερη προσοχή στον καθορισμό της λειτουργικότητας. Η πόρτα αυτή θα ανοίγει όπως οι πόρτες σε ένα σπίτι, άρα θα περιστρέφονται γύρω από ένα κάθετο προς το δάπεδο άξονα. Για το σκοπό αυτό πρέπει να προσαρμοστεί μία σχεδίαση «origin» στον άξονα της πόρτας. Η σχεδίαση origin (origin brush) είναι απλά ένα κανονικό σχέδιο χρησιμοποιώντας το πρότυπο 'origin' ως υφή (μια πράσινα χρωματισμένη επιφάνεια). Έτσι, το παιχνίδι αναζητά το κέντρο αυτής της Δημιουργία περιστρεφόμενης πόρτας, teleport, glass,explosion - Δαμιανάκης Α. - Λιβανός Γ. Σελίδα 1
σχεδίασης, το οποίο και θεωρεί ως άξονα της περιστροφικής κίνησης, οπότε τοποθετήστε το στην κάθετη «κάσα» της πόρτας. Για να ορίσετε την περιστροφή (Rotation), ομαδοποιήστε (Group) το αντικείμενο origin brush με την πόρτα επιλέγοντας και τα δύο αντικείμενα (CTRL+click) και πατώντας το συνδυασμό (Ctrl-G) και μετατρέποντας τα στη συνέχεια σε ένα func_door_rotating entity (Tie to Entity). Τα χαρακτηριστικά (attributes) αυτής της οντότητας είναι παρόμοια με αυτά της συρόμενης πόρτας, όπως και οι σημαίες. Σημαντικά είναι τα χαρακτηριστικά Distance (η γωνία περιστροφής, θέστε τη στις 90 ) και Pitch yaw roll (χρησιμοποιείται για πιο σύνθετες περιστροφές). Επιπλέον Flags αποτελούν τα πεδία reverse direction, one way ( η πόρτα θα κινείται προς μία μόνο κατεύθυνση) κι επιλογές αξόνων X, Y (ο άξονας γύρω από τον οποίο θα περιστραφεί ως προς το αντικείμενο origin brush, ο Ζ στην περίπτωσή μας). Για να μπορέσετε να ορίσετε σωστά το γράμμα του άξονα περιστροφής, επιλέξτε την κατάλληλη γωνία θέασης (view) και παρατηρήστε το χρώμα και το γράμμα του άξονα για να βοηθηθείτε. Η πόρτα αυτή θα ανοίγει μόνο όταν ο ήρωας πατήσει το στρογγυλό κουμπί που βρίσκεται αριστερά της κάσας. Για να γίνει αυτό, θα πρέπει η πόρτα να «συνδεθεί» με το αντίστοιχο κουμπί. Δώστε στο αντικείμενο-πόρτα ένα όνομα (attribute Name) και βεβαιωθείτε πως το flag Use only είναι ανενεργό. Ορίστε επίσης και το χαρακτηριστικό locked sound. Μετατρέψτε το αντικείμενο-κουμπί σε func_button entity και ορίστε το χαρακτηριστικό target ως το όνομα που αποδώσατε στην πόρτα. Σημαντικό επίσης είναι να ορίσετε την παράμετρο button delay πριν την επανεκκίνηση. Αν δώσετε την τιμή 0, τότε το κουμπί παραμένει ενεργό μέχρι να το ξαναπατήσει ο ήρωας, αν επιλέξετε stay pressed, το κουμπί θα παραμένει πάντα ενεργό, σε οποιαδήποτε άλλη επιλογή το κουμπί επιστρέφει στην κατάσταση 'off' σε τόσα δευτερόλεπτα όσα η τιμή που ορίστηκε. Με ενεργοποιημένη τη σημαία toggle, το αντικείμενο δε μετακινείται. Ως αποτέλεσμα, η ξύλινη πόρτα θα ανοιγοκλείνει με το κουμπί, ενώ η μεταλλική μόλις ο ήρωας του παιχνιδιού την πλησιάσει και χρησιμοποιήσει το κουμπί USE. Παρατηρήστε πως δεν υπάρχουν κουμπιά ενεργοποίησης από την άλλη μεριά του τοίχου, οπότε αν η πόρτα έκλεινε κι ο «παίχτης» είχε εισέλθει στο άλλο δωμάτιο, τότε θα εγκλωβιζόταν! Οι πόρτες επίσης μπορούν να χρησιμοποιηθούν (χρειάζεται αρκετή προσοχή) ως ασανσέρ, ορίζοντας την κατεύθυνση κίνησης της κλάσης func_door σε up (drop-down menu) και δημιουργώντας ένα είδος «αξόνων-οδηγών» για να μετακινούνται στην επιθυμητή απόσταση. Σχεδιάζουμε το σχήμα και διαμορφώνουμε την υφή της πόρτας Τοποθετούμε το ειδικό αντικείμενο ORIGIN brush με το χαρακτηριστικό πράσινο χρώμα για να ορίσουμε το κέντρο περιστροφής (ο προκαθορισμένος άξονας περιστροφής είναι ο Ζ αυτό μπορούμε να το αλλάξουμε) Ομαδοποιούμε τα δύο αντικείμενα και τα ορίζουμε ως κλάση func_door_rotating Ορίζουμε τις επιθυμητές τιμές στις καρτέλες attributes και flags (speed, distance,one-way, toggle, X-y axis) Δημιουργία περιστρεφόμενης πόρτας, teleport, glass,explosion - Δαμιανάκης Α. - Λιβανός Γ. Σελίδα 2
Στην άσκηση αυτή θα χρησιμοποιήσουμε το χάρτη του αρχείου Full_example_door_rotating.rmf και θα συνδυάσουμε αρκετά αντικείμενα υλοποιήσεις. Ο χάρτης αυτός περιλαμβάνει ένα μεγάλο δωμάτιο, χωρισμένο με πόρτες, το οποίο οδηγεί σε ένα υπόγειο χώρο που διαθέτει ένα ανεμιστήρα μέσω ενός ανοίγματος στο δάπεδο. Ο ανεμιστήρας περιστρέφεται γύρω από μία βάση στερεωμένη στο έδαφος, οπότε για να οριστεί ο άξονας περιστροφής θα έπρεπε να δημιουργηθεί και σε αυτή την περίπτωση ένα αντικείμενο origin, να ομαδοποιηθεί με τους έλικες και να μετατραπεί στην κατάλληλη οντότητα. Ο έλικας αυτός θα μεταφερθεί στον υπόγειο χώρο, εκεί που οδηγεί το άνοιγμα που υπάρχει στο δάπεδο. Αρχικά, θα πρέπει να δημιουργήσετε τον έλικα και τη βάση περιστροφής, όπως φαίνεται στο παρακάτω σχήμα! Στη συνέχεια θα πρέπει να ορίσετε τον άξονα περιστροφής: Texture origin Ελέγξτε τη σχεδίαση από τις τρεις διαφορετικές λήψεις της κάμερας. Δημιουργία περιστρεφόμενης πόρτας, teleport, glass,explosion - Δαμιανάκης Α. - Λιβανός Γ. Σελίδα 3
Ομαδοποιείστε τα αντικείμενα και μετατρέψτε τα σε οντότητα. Επιλέξτε ως τύπο κλάσης τον func_-rotating με τις εξής τιμές attributes/flags: Name ονομασία για να συνδεθεί μελλοντικά με κάποιο trigger Rotation speed πόσο γρήγορα θα περιστρέφεται (μονάδες ταχύτητας σε degrees per second τιμή-180) Volume ρύθμιση έντασης ήχου περιστροφής is how loud the fan is (you can set the sound below) Fan sounds ορισμός ήχου περιστροφής Pitch, Yaw, Roll και X Y Z καθορίζουν την κατεύθυνση περιστροφής Damage when blocked - καθορίζει την επίδραση/ζημιά στο αντικείμενο όταν μπλοκάρει η περιστροφή (τιμή =50) Starts On - είναι ενεργοποιημένο με την εκκίνηση του παιχνιδιού αλλιώς ενεργοποιείται μέσω trigger. Reverse Direction αλλαγή σε αριστερόστροφη περιστροφή X axis,y axis αλλαγή περιστροφής από τον Ζ άξονα (κίνηση από top view - default) Not solid ο «παίχτης» κι άλλα αντικείμενα μπορούν να διαπερνούν τον έλικα χωρίς να τραυματίζονται Δημιουργία περιστρεφόμενης πόρτας, teleport, glass,explosion - Δαμιανάκης Α. - Λιβανός Γ. Σελίδα 4
Rotating door! Η περιστρεφόμενη πόρτα είναι συνδυασμός μιας κανονικής, συρόμενης πόρτας κι ενός περιστρεφόμενου αντικειμένου. Ο χάρτης του αρχείου που έχετε «ανοίξει» διαθέτει δύο χωριστά δωμάτια στο ισόγειο επίπεδο, διαχωρισμένα με τρεις πόρτες, αριθμημένες από το 1 ως το 3. Για τη δημιουργία πόρτας, πρώτα δημιουργούμε το άνοιγμα στον τοίχο και μετά το γεμίζουμε με ένα ορθογώνιο σχέδιο αντίστοιχων διαστάσεων. Τα βήματα αυτά έχουν ήδη γίνει για εσάς, όπως επίσης και τα αντικείμενα τα οποία θα ορίσετε εσείς ως origin brushes. Ξεκινήστε λοιπόν! Επιλέξτε τα αντικείμενα origin brush και door brush (την πόρτα Νο1) και κάντε κλικ στο κουμπί To Entity κι ορίστε τον τύπο κλάσης σε 'Func_door_rotating'. Θέστε την παράμετρο 'delay before close' στην τιμή 3 ώστε η πόρτα να κλείνει και πάλι κι ορίστε έναν ήχο κίνησης/ακινητοποίησης. Τα attributes Distance(deg) και Pitch Yaw Roll αφήστε τα ως έχουν. Ορίστε τα flags σε τιμές της αρεσκείας σας Η πόρτα Νο2 έχει τα flags one-way και use only ενεργά. Δημιουργία περιστρεφόμενης πόρτας, teleport, glass,explosion - Δαμιανάκης Α. - Λιβανός Γ. Σελίδα 5
Τέλος, η πόρτα Νο 3 είναι μία πόρτα γκαράζ, οπότε ανοίγει προς τα πάνω, με άξονα περιστροφής την κάσα που είναι παράλληλα προς το έδαφος. Με την ίδια διαδικασία, τα αντικείμενα texture origin και door brush ομαδοποιούνται και μετατρέπονται σε οντότητα κλάσης func_door_rotating. Στην καρτέλα flags ενεργοποιήστε τις επιλογές Y axis,or), one-way, Reverse dir και use only, όπως φαίνεται στο παρακάτω σχήμα. Ορίστε επίσης τις παραμέτρους movesound/stopsound. Texture origin Group objects Σημείωση: Αν δεν φροντίσετε ώστε η περιστρεφόμενη πόρτα να μείνει ανοιχτή και κλείσει και δεν έχετε ενεργοποιήσει το flag Use Only, τότε ο παίχτης δεν θα μπορέσει να ξαναπεράσει στην αντίπερα όχθη και θα εγκλωβιστεί! Δημιουργία περιστρεφόμενης πόρτας, teleport, glass,explosion - Δαμιανάκης Α. - Λιβανός Γ. Σελίδα 6
Transparent/breakable glass Για να δημιουργήσουμε τοίχους διάφανου γυαλιού, αρκεί να αποδώσουμε την κατάλληλη υφή στο αντικείμενο wall brush και να ορίσουμε τις σωστές τιμές στα χαρακτηριστικά της κλάσης του. Αρχικά πρέπει να δώσουμε στο αντικείμενο το πρότυπο υφής GLASS_BRIGHT. Στη συνέχεια, πρέπει να το μετατρέψουμε σε οντότητα (κουμπί ToEntity) και να επιλέξουμε ως τύπο κλάσης το func_wall Τέλος, για να οριστικοποιήσουμε το τελικό αποτέλεσμα, αρκεί να αναθέσουμε στα attributes Render Mode και FX Amount τις τιμές Texture και 150 αντίστοιχα. Προκειμένου τώρα το διάφανο γυαλί να μπορεί να σπάσει κιόλας, αντί να το μετατρέψουμε σε οντότητα func_wall, μπορούμε να το μετατρέψουμε σε οντότητα κλάσης func_breakable και να ορίσουμε την τιμή του attribute Gibs Directions σε Relative to Attack ώστε να σπάει μετά από επίθεση (π.χ. χρήση όπλου) Δημιουργία περιστρεφόμενης πόρτας, teleport, glass,explosion - Δαμιανάκης Α. - Λιβανός Γ. Σελίδα 7
Teleporter Τα αντικείμενα teleporter ουσιαστικά είναι «πύλες», οι οποίες ενεργοποιούνται (triggered) μέσω ενός αντικειμένου και «μεταφέρουν» τον παίχτη ήρωα από ένα αρχικό σημείο σε ένα άλλο (σημείο προορισμούdestination). H ακολουθία βημάτων είναι η εξής: 1. Ορίζουμε την αρχική θέση της «πύλης»/teleporter σχεδιάζοντας ένα ορθογώνιο πλαίσιο 2. Αποδίδουμε υφή teleporter στο πλαίσιο αυτό 3. Στην αρχική αυτή θέση σχεδιάζουμε ένα ακόμη πλαίσιο, το οποίο το μετατρέπουμε σε οντότητα κλάσης trigger_teleport και στο πεδίο target του δίνουμε ως τιμή το όνομα της οντότητας που θα αντιπροσωπεύει την τελική θέση μεταφοράς της «πύλης» (επόμενο βήμα). Στο παράδειγμά μας η τελική θέση έχει το όνομα tele. 4. Τέλος, εισάγουμε στο σημείο το οποίο θα είναι ο προορισμός «μεταφοράς» του παίχτη μέσω του teleport μία οντότητα τύπου info_teleport_destination και στο attribute Name ορίζουμε ένα χαρακτηριστικό όνομα (tele στο παράδειγμά μας). Το όνομα του entity info_teleport_destination θα πρέπει να συμφωνεί με την τιμή του attribute target της οντότητας trigger_teleport. Δημιουργία περιστρεφόμενης πόρτας, teleport, glass,explosion - Δαμιανάκης Α. - Λιβανός Γ. Σελίδα 8
Πυροδότηση αντικειμένου Για την πυροδότηση και την έκρηξη ενός αντικειμένου χρειαζόμαστε δύο κλάσεις αντικειμένων: 1. Ένα αντικείμενο-«βόμβα», το οποίο και θα εκραγεί. Για τη δημιουργία του αντικειμένου βόμβα, αρκεί να εισάγουμε στο επιθυμητό σημείο μία οντότητα κλάσης env_explosion και να της αποδώσουμε ένα όνομα ώστε να μπορέσει να «συνδεθεί» με κάποιο κουμπί-trigger. Στο παράδειγμά μας, το όνομα της οντότητας είναι boom. 2. Ένα αντικείμενο-«πυροκροτητή», ένα κουμπί δηλαδή το οποίο θα ενεργοποιήσει (trigger) την βόμβα. Μετά τη σχεδίαση του αντικειμένου και την απόδοση ενός προτύπου υφής, απαιτείται να το μετατρέψουμε σε οντότητα κλάσης func_button και στο attribute Target να ορίσουμε ως τιμή το όνομα της «βόμβας» που θα πυροδοτήσει (στο παράδειγμά μας το όνομα είναι boom) Για πιο αληθοφανές αποτέλεσμα, αξίζει να πειραματιστούμε με τις τιμές και των άλλων χαρακτηριστικών/σημαιών των οντοτήτων κουμπί κι έκρηξη! Δημιουργία περιστρεφόμενης πόρτας, teleport, glass,explosion - Δαμιανάκης Α. - Λιβανός Γ. Σελίδα 9