background image

4.3

Σύστημα διαχείρισης εισόδου

Η διαχείριση εισόδου χρήστη αποτελεί βασικό υποσύστημα μιας μηχανής παιχνιδιών, κα-

θώς επιτρέπει την αλληλεπίδραση μεταξύ του χρήστη και της εφαρμογής. Στην παρούσα υλο-

ποίηση, το σύστημα εισόδου σχεδιάστηκε με γνώμονα την ανεξαρτησία από τη βιβλιοθήκη δια-

χείρισης παραθύρου, ακολουθώντας την ίδια φιλοσοφία αποσύζευξης που εφαρμόστηκε και στο

σύστημα δημιουργίας παραθύρου.

Όπως και στην περίπτωση της διαχείρισης παραθύρου (προηγούμενη ενότητα), έτσι και

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

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

Αντίθετα, ορίζεται αφαιρετική (abstrac) κλάση Input, η οποία λειτουργεί ως διεπαφή υψηλού

επιπέδου για τον έλεγχο καταστάσεων εισόδου, όπως:

- έλεγχος αν ένα πλήκτρο είναι πατημένο,

- έλεγχος κατάστασης πλήκτρων ποντικιού,

- ανάγνωση θέσης δρομέα.

4.3.1

Enum KeyCode και ανεξαρτησία από backend

Για την αποφυγή εξάρτησης από τις σταθερές πλήκτρων της GLFW, δημιουργήθηκε τύπος

enum class KeyCode, ο οποίος αντιστοιχίζεται ένα-προς-ένα με τους κωδικούς της βιβλιοθήκης.

Με τον τρόπο αυτό:

Ο υπόλοιπος κώδικας της μηχανής δεν γνωρίζει την ύπαρξη της GLFW.

Ενδεχόμενη αλλαγή backend δεν απαιτεί τροποποίηση του gameplay κώδικα.

Ενισχύεται η αναγνωσιμότητα και η ασφάλεια τύπων (type safety).

Η επιλογή χρήσης enum class αντί για απλές ακέραιες σταθερές προσφέρει ισχυρότερη τυ-

ποποίηση και αποτρέπει σφάλματα κατά τη χρήση των πλήκτρων.

4.3.2

Event System

Κάθε φορά που προκύπτει ένα γεγονός (event) από τη βιβλιοθήκη GLFW, η κλάση

event_distpacher το ταξινομεί με βάση το είδος του.

class Event {

public:

virtual ~Event() = default;

virtual event_type get_type() const = 0;

virtual const char

*

get_name() const = 0;

virtual std::string to_string() const return get_name(); }

public:

bool handled = false;

26