blob: 23ee65c0412bdb897f261e306146177541ba0d75 (
plain)
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
|
#pragma once
#include "nes/app/input/input-device.hh"
#include "nes/app/input/modifier-mask.hh"
#include "nes/app/input/input-event.hh"
#include "nes/app/input/key.hh"
namespace nes::app
{
/// A keyboard input device.
class input_device_keyboard : public input_device
{
public:
/// Read the current state of a key.
virtual auto read_key(key) -> bool = 0;
/// Poll for events.
///
/// As long as there are any buffered key-down or key-up events, they will be returned. After that, this
/// function will return input_event::type::none until there is another event.
virtual auto poll_event() -> input_event = 0;
auto read_buttons() -> sys::button_mask final
{
auto res = sys::button_mask{};
if (read_key(key::letter_w)) { res.add(sys::buttons::up); }
if (read_key(key::letter_a)) { res.add(sys::buttons::left); }
if (read_key(key::letter_s)) { res.add(sys::buttons::down); }
if (read_key(key::letter_d)) { res.add(sys::buttons::right); }
if (read_key(key::letter_k)) { res.add(sys::buttons::b); }
if (read_key(key::letter_l)) { res.add(sys::buttons::a); }
if (read_key(key::space)) { res.add(sys::buttons::select); }
if (read_key(key::enter)) { res.add(sys::buttons::start); }
return res;
}
auto read_modifiers() -> modifier_mask
{
auto res = modifier_mask{};
if (read_key(key::control_left) || read_key(key::control_right)) { res.add(modifiers::control); }
if (read_key(key::shift_left) || read_key(key::shift_right)) { res.add(modifiers::shift); }
if (read_key(key::alt_left) || read_key(key::alt_right)) { res.add(modifiers::alt); }
return res;
}
protected:
explicit input_device_keyboard() = default;
};
} // namespace nes::app
|