1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
use bitflags::bitflags; #[derive(Clone, Copy, PartialEq)] pub enum Key { Space, Escape, Left, Right, Up, Down, } bitflags! { #[derive(Default)] pub struct PadBit: u32 { const L = 0b00000001; const R = 0b00000010; const U = 0b00000100; const D = 0b00001000; const A = 0b00010000; } } #[derive(Clone, Default)] pub struct Pad { key: PadBit, pad: PadBit, trg: PadBit, last_pad: PadBit, } impl Pad { pub fn update(&mut self) { self.pad = self.key; self.trg = self.pad & !self.last_pad; self.last_pad = self.pad; } pub fn is_pressed(&self, btn: PadBit) -> bool { self.pad.contains(btn) } pub fn is_trigger(&self, btn: PadBit) -> bool { self.trg.contains(btn) } pub fn on_key(&mut self, key: Key, down: bool) { let bit = get_key_bit(key); if down { self.key |= bit; } else { self.key &= !bit; } } } fn get_key_bit(key: Key) -> PadBit { match key { Key::Left => PadBit::L, Key::Right => PadBit::R, Key::Up => PadBit::U, Key::Down => PadBit::D, Key::Space => PadBit::A, _ => PadBit::empty(), } }