tiny_game_framework/events/
event_handler.rs1use 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}