2019-12-04 23:15:49 +00:00
|
|
|
use sdl2::keyboard::Keycode;
|
|
|
|
use sdl2::{event::Event, EventPump};
|
|
|
|
|
|
|
|
use rustboyadvance_ng::core::keypad as gba_keypad;
|
|
|
|
use rustboyadvance_ng::InputInterface;
|
|
|
|
|
|
|
|
extern crate bit;
|
|
|
|
use bit::BitIndex;
|
|
|
|
|
2019-12-09 20:53:11 +00:00
|
|
|
pub struct Sdl2Keyboard {
|
2019-12-04 23:15:49 +00:00
|
|
|
event_pump: EventPump,
|
|
|
|
keyinput: u16,
|
|
|
|
}
|
|
|
|
|
2019-12-09 20:53:11 +00:00
|
|
|
impl InputInterface for Sdl2Keyboard {
|
2019-12-04 23:15:49 +00:00
|
|
|
fn poll(&mut self) -> u16 {
|
|
|
|
for event in self.event_pump.poll_iter() {
|
|
|
|
match event {
|
|
|
|
Event::KeyDown {
|
|
|
|
keycode: Some(keycode),
|
|
|
|
..
|
|
|
|
} => {
|
|
|
|
if let Some(key) = keycode_to_keypad(keycode) {
|
|
|
|
self.keyinput.set_bit(key as usize, false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Event::KeyUp {
|
|
|
|
keycode: Some(keycode),
|
|
|
|
..
|
|
|
|
} => {
|
|
|
|
if let Some(key) = keycode_to_keypad(keycode) {
|
|
|
|
self.keyinput.set_bit(key as usize, true);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Event::Quit { .. } => panic!("quit!"),
|
|
|
|
_ => {}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
self.keyinput
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn keycode_to_keypad(keycode: Keycode) -> Option<gba_keypad::Keys> {
|
|
|
|
match keycode {
|
|
|
|
Keycode::Up => Some(gba_keypad::Keys::Up),
|
|
|
|
Keycode::Down => Some(gba_keypad::Keys::Down),
|
|
|
|
Keycode::Left => Some(gba_keypad::Keys::Left),
|
|
|
|
Keycode::Right => Some(gba_keypad::Keys::Right),
|
|
|
|
Keycode::Z => Some(gba_keypad::Keys::ButtonB),
|
|
|
|
Keycode::X => Some(gba_keypad::Keys::ButtonA),
|
|
|
|
Keycode::Return => Some(gba_keypad::Keys::Start),
|
|
|
|
Keycode::Space => Some(gba_keypad::Keys::Select),
|
|
|
|
Keycode::A => Some(gba_keypad::Keys::ButtonL),
|
|
|
|
Keycode::S => Some(gba_keypad::Keys::ButtonR),
|
|
|
|
_ => None,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-12-09 20:53:11 +00:00
|
|
|
pub fn create_keyboard(sdl: &sdl2::Sdl) -> Sdl2Keyboard {
|
|
|
|
Sdl2Keyboard {
|
2019-12-04 23:15:49 +00:00
|
|
|
event_pump: sdl.event_pump().unwrap(),
|
|
|
|
keyinput: gba_keypad::KEYINPUT_ALL_RELEASED,
|
|
|
|
}
|
|
|
|
}
|