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