Skip to main content

tiny_game_framework/events/
event_handler.rs

1use std::collections::{HashMap, HashSet};
2
3use glfw::Key;
4
5use glam::Vec2;
6
7pub struct EventHandler {
8    pub keys_pressed: HashMap<Key, usize>,
9    pub keys_pressed_last_frame: HashSet<Key>,
10
11    pub mouse_pos: Vec2,
12    pub scroll: Vec2,
13
14    pub width: f32,
15    pub height: f32,
16    
17    pub lmb: bool,
18    pub rmb: bool,
19}
20impl EventHandler {
21    pub fn new() -> Self {
22        Self { 
23            keys_pressed: HashMap::new(),
24            keys_pressed_last_frame: HashSet::new(),
25            
26            mouse_pos: Vec2::ONE,
27
28            width: 1.0,
29            height: 1.0,
30
31            scroll: Vec2::ZERO,
32
33            lmb: false,
34            rmb: false,
35        }
36    }
37
38    pub fn on_key_press(&mut self, key: Key) {
39        let key_handle = self.keys_pressed.len();
40        self.keys_pressed.insert(key, key_handle);
41    }
42
43    pub fn on_key_release(&mut self, key: Key) {
44        self.keys_pressed.remove(&key);
45    }
46
47    pub fn on_mouse_move(&mut self, x: f64, y: f64) {
48        self.mouse_pos.x =  x as f32 - self.width / 2.0;
49        self.mouse_pos.y = -y as f32 + self.height / 2.0;
50    }
51
52    pub fn on_lmb_press(&mut self) {
53        self.lmb = true;
54    } 
55    pub fn on_lmb_release(&mut self) {
56        self.lmb = false;
57    } 
58
59    pub fn on_rmb_press(&mut self) {
60        self.rmb = true;
61    } 
62    pub fn on_rmb_release(&mut self) {
63        self.rmb = false;
64    } 
65
66    pub fn on_scroll_change(&mut self, change: Vec2){
67        self.scroll = change;
68    }
69
70    pub fn on_window_resize(&mut self, w: i32, h: i32) {
71        self.width = w as f32;
72        self.height = h as f32;
73    }
74
75    pub fn update(&mut self) {
76        self.keys_pressed_last_frame.clear();
77        self.scroll = Vec2::ZERO;
78        for &key in self.keys_pressed.keys() {
79            self.keys_pressed_last_frame.insert(key);
80        }
81    }
82
83    pub fn key_just_pressed(&self, key: Key) -> bool {
84        self.keys_pressed.contains_key(&key) && !self.keys_pressed_last_frame.contains(&key)
85    }
86}