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(),
    }
}