Fixed Issue #109 and some related problems that took place while holding shortcut keys

This commit is contained in:
J. R. Vidal F 2019-06-30 06:20:50 +02:00
parent b1a7a61d77
commit fca9590cee

View File

@ -79,6 +79,7 @@ pub struct Window {
fullscreen: bool, fullscreen: bool,
needs_refresh_resize: bool, needs_refresh_resize: bool,
key_map: HashMap<KeyMouse, GameInput>, key_map: HashMap<KeyMouse, GameInput>,
keypress_map: HashMap<GameInput, glutin::ElementState>,
supplement_events: Vec<Event>, supplement_events: Vec<Event>,
focused: bool, focused: bool,
} }
@ -139,6 +140,8 @@ impl Window {
key_map.insert(settings.controls.attack, GameInput::Attack); key_map.insert(settings.controls.attack, GameInput::Attack);
key_map.insert(settings.controls.roll, GameInput::Roll); key_map.insert(settings.controls.roll, GameInput::Roll);
let keypress_map = HashMap::new();
Ok(Self { Ok(Self {
events_loop, events_loop,
renderer: Renderer::new(device, factory, win_color_view, win_depth_view)?, renderer: Renderer::new(device, factory, win_color_view, win_depth_view)?,
@ -149,6 +152,7 @@ impl Window {
fullscreen: false, fullscreen: false,
needs_refresh_resize: false, needs_refresh_resize: false,
key_map, key_map,
keypress_map,
supplement_events: vec![], supplement_events: vec![],
focused: true, focused: true,
}) })
@ -177,6 +181,7 @@ impl Window {
let window = &mut self.window; let window = &mut self.window;
let focused = &mut self.focused; let focused = &mut self.focused;
let key_map = &self.key_map; let key_map = &self.key_map;
let mut keypress_map = &mut self.keypress_map;
let pan_sensitivity = self.pan_sensitivity; let pan_sensitivity = self.pan_sensitivity;
let zoom_sensitivity = self.zoom_sensitivity; let zoom_sensitivity = self.zoom_sensitivity;
let mut toggle_fullscreen = false; let mut toggle_fullscreen = false;
@ -209,20 +214,52 @@ impl Window {
glutin::WindowEvent::KeyboardInput { input, .. } => match input.virtual_keycode glutin::WindowEvent::KeyboardInput { input, .. } => match input.virtual_keycode
{ {
Some(key) => match key_map.get(&KeyMouse::Key(key)) { Some(key) => match key_map.get(&KeyMouse::Key(key)) {
Some(GameInput::Fullscreen) => match input.state { Some(GameInput::Fullscreen) => {
glutin::ElementState::Pressed => { if input.state == glutin::ElementState::Pressed
toggle_fullscreen = !toggle_fullscreen && !Self::is_event_key_held(keypress_map, GameInput::Fullscreen)
{
toggle_fullscreen = !toggle_fullscreen;
} }
_ => (), Self::update_keypress_map(
}, keypress_map,
Some(GameInput::Screenshot) => match input.state { GameInput::Fullscreen,
glutin::ElementState::Pressed => take_screenshot = true, input.state,
_ => {} );
}, }
Some(&game_input) => events.push(Event::InputUpdate( Some(GameInput::Screenshot) => {
game_input, take_screenshot = input.state == glutin::ElementState::Pressed
input.state == glutin::ElementState::Pressed, && !Self::is_event_key_held(
)), keypress_map,
GameInput::Screenshot,
);
Self::update_keypress_map(
keypress_map,
GameInput::Screenshot,
input.state,
);
}
Some(&game_input)
if game_input == GameInput::MoveForward
|| game_input == GameInput::MoveBack
|| game_input == GameInput::MoveLeft
|| game_input == GameInput::MoveRight
|| game_input == GameInput::Jump
|| game_input == GameInput::Attack
|| game_input == GameInput::Roll =>
{
events.push(Event::InputUpdate(
game_input,
input.state == glutin::ElementState::Pressed,
))
}
Some(&game_input) => {
if input.state == glutin::ElementState::Pressed
&& !Self::is_event_key_held(keypress_map, game_input)
{
events.push(Event::InputUpdate(game_input, true));
}
Self::update_keypress_map(keypress_map, game_input, input.state);
}
_ => {} _ => {}
}, },
_ => {} _ => {}
@ -340,4 +377,20 @@ impl Window {
), ),
} }
} }
fn is_event_key_held(
map: &mut HashMap<GameInput, glutin::ElementState>,
input: GameInput,
) -> bool {
*(map.entry(input).or_insert(glutin::ElementState::Released))
== glutin::ElementState::Pressed
}
fn update_keypress_map(
map: &mut HashMap<GameInput, glutin::ElementState>,
input: GameInput,
state: glutin::ElementState,
) {
map.insert(input, state);
}
} }