diff options
author | Matthew Michelotti <michelotti.matthew@gmail.com> | 2018-05-05 14:35:33 -0500 |
---|---|---|
committer | Matthew Michelotti <michelotti.matthew@gmail.com> | 2018-05-05 14:35:33 -0500 |
commit | 62094392f676796ff715731b5cd1df510535dc1e (patch) | |
tree | 74327403339d89529ebacba830cfa66e57d22cb5 | |
parent | 2dbc4f3e11dcd28d8e1ff26693afaf73ac7922fc (diff) |
incorporated mouse events into key events
-rw-r--r-- | gate/src/core/sdl/event_handler.rs | 34 | ||||
-rw-r--r-- | gate/src/core/wasm/mod.rs | 10 | ||||
-rw-r--r-- | gate/src/core/wasm/wasm_exports.rs | 18 | ||||
-rw-r--r-- | gate/src/input.rs | 5 | ||||
-rw-r--r-- | gate_build/src/html/gate.js | 13 |
5 files changed, 69 insertions, 11 deletions
diff --git a/gate/src/core/sdl/event_handler.rs b/gate/src/core/sdl/event_handler.rs index 27110c7..7f82d5e 100644 --- a/gate/src/core/sdl/event_handler.rs +++ b/gate/src/core/sdl/event_handler.rs @@ -14,9 +14,12 @@ use std::collections::HashSet; -use sdl2::EventPump; -use sdl2::event::Event; -use sdl2::keyboard::Keycode as SdlKeyCode; +use sdl2::{ + EventPump, + event::Event, + keyboard::Keycode as SdlKeyCode, + mouse::MouseButton, +}; use ::{App, AppContext}; use asset_id::AppAssetId; @@ -53,6 +56,22 @@ impl EventHandler { } }, Event::MouseMotion { x, y, .. } => ctx.cursor = renderer.to_app_pos(x, y), + Event::MouseButtonDown { x, y, mouse_btn, .. } => { + ctx.cursor = renderer.to_app_pos(x, y); + if let Some(keycode) = mouse_button_to_gate_key(mouse_btn) { + if self.held_keys.insert(keycode) { + app.input(KeyEvent::Pressed, keycode, ctx); + } + } + }, + Event::MouseButtonUp { x, y, mouse_btn, .. } => { + ctx.cursor = renderer.to_app_pos(x, y); + if let Some(keycode) = mouse_button_to_gate_key(mouse_btn) { + if self.held_keys.remove(&keycode) { + app.input(KeyEvent::Released, keycode, ctx); + } + } + }, _ => {}, } if ctx.close_requested { break; } @@ -107,3 +126,12 @@ fn sdl_to_gate_key(sdl: SdlKeyCode) -> Option<KeyCode> { _ => None, } } + +fn mouse_button_to_gate_key(button: MouseButton) -> Option<KeyCode> { + match button { + MouseButton::Left => Some(KeyCode::MouseLeft), + MouseButton::Right => Some(KeyCode::MouseRight), + MouseButton::Middle => Some(KeyCode::MouseMiddle), + _ => None, + } +} diff --git a/gate/src/core/wasm/mod.rs b/gate/src/core/wasm/mod.rs index 2521ad3..6a9ee4f 100644 --- a/gate/src/core/wasm/mod.rs +++ b/gate/src/core/wasm/mod.rs @@ -55,7 +55,8 @@ impl CoreAudio { trait TraitAppRunner { fn init(&mut self); fn resize(&mut self, dims: (u32, u32)); - fn update_and_draw(&mut self, time_sec: f64, cursor_x: i32, cursor_y: i32); + fn update_and_draw(&mut self, time_sec: f64); + fn update_cursor(&mut self, cursor_x: i32, cursor_y: i32); fn input(&mut self, event: KeyEvent, key: KeyCode); fn music_count(&self) -> u16; fn sound_count(&self) -> u16; @@ -121,8 +122,7 @@ impl<AS: AppAssetId, AP: App<AS>> TraitAppRunner for AppRunner<AS, AP> { self.ctx.dims = self.renderer.as_ref().unwrap().app_dims(); } - fn update_and_draw(&mut self, time_sec: f64, cursor_x: i32, cursor_y: i32) { - self.ctx.cursor = self.renderer.as_ref().unwrap().to_app_pos(cursor_x, cursor_y); + fn update_and_draw(&mut self, time_sec: f64) { let elapsed = self.last_time_sec.map(|x| time_sec - x).unwrap_or(0.0).max(0.0).min(0.1); if elapsed > 0.0 { self.app.advance(elapsed, &mut self.ctx); @@ -133,6 +133,10 @@ impl<AS: AppAssetId, AP: App<AS>> TraitAppRunner for AppRunner<AS, AP> { self.renderer.as_mut().unwrap().flush(); } + fn update_cursor(&mut self, cursor_x: i32, cursor_y: i32) { + self.ctx.cursor = self.renderer.as_ref().unwrap().to_app_pos(cursor_x, cursor_y); + } + fn input(&mut self, event: KeyEvent, key: KeyCode) { let success = if event == KeyEvent::Pressed { self.held_keys.insert(key) diff --git a/gate/src/core/wasm/wasm_exports.rs b/gate/src/core/wasm/wasm_exports.rs index 0e51f1e..f8cdca4 100644 --- a/gate/src/core/wasm/wasm_exports.rs +++ b/gate/src/core/wasm/wasm_exports.rs @@ -33,7 +33,8 @@ pub unsafe extern "C" fn gateWasmOnResize(w: c_int, h: c_int) { #[no_mangle] pub unsafe extern "C" fn gateWasmUpdateAndDraw(time_millis: f64, cursor_x: c_int, cursor_y: c_int) { - app_runner_borrow_mut().update_and_draw(time_millis / 1000.0, cursor_x as i32, cursor_y as i32); + app_runner_borrow_mut().update_cursor(cursor_x as i32, cursor_y as i32); + app_runner_borrow_mut().update_and_draw(time_millis / 1000.0); } #[no_mangle] @@ -45,6 +46,21 @@ pub unsafe extern "C" fn gateWasmKeyEvent(code: c_int, down: bool) { } #[no_mangle] +pub unsafe extern "C" fn gateWasmMouseEvent(cursor_x: c_int, cursor_y: c_int, button: c_int, down: bool) { + app_runner_borrow_mut().update_cursor(cursor_x as i32, cursor_y as i32); + let code = match button { + 0 => Some(KeyCode::MouseLeft), + 1 => Some(KeyCode::MouseMiddle), + 2 => Some(KeyCode::MouseRight), + _ => None, + }; + if let Some(code) = code { + let event = if down { KeyEvent::Pressed } else { KeyEvent::Released }; + app_runner_borrow_mut().input(event, code); + } +} + +#[no_mangle] pub unsafe extern "C" fn gateWasmIsAppDefined() -> c_int { if app_runner_is_defined() { 1 } else { 0 } } diff --git a/gate/src/input.rs b/gate/src/input.rs index e4085d7..60e5da0 100644 --- a/gate/src/input.rs +++ b/gate/src/input.rs @@ -16,7 +16,7 @@ #[cfg(target_arch = "wasm32")] use std::mem; -/// Events related to a keyboard key. +/// Events related to a keyboard key or similar button. #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] pub enum KeyEvent { /// Key is pressed down. @@ -25,7 +25,7 @@ pub enum KeyEvent { Released, } -/// Enum for keyboard keys. +/// Enum for keyboard keys and mouse buttons. #[repr(u8)] #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] pub enum KeyCode { @@ -34,6 +34,7 @@ pub enum KeyCode { Right, Left, Down, Up, Return, Space, + MouseLeft, MouseRight, MouseMiddle, } #[cfg(target_arch = "wasm32")] diff --git a/gate_build/src/html/gate.js b/gate_build/src/html/gate.js index 2329cbb..0e21512 100644 --- a/gate_build/src/html/gate.js +++ b/gate_build/src/html/gate.js @@ -256,6 +256,7 @@ fetch("gate_app.wasm").then(response => Module.gateWasmOnResize = mod.exports.gateWasmOnResize; Module.gateWasmUpdateAndDraw = mod.exports.gateWasmUpdateAndDraw; Module.gateWasmKeyEvent = mod.exports.gateWasmKeyEvent; + Module.gateWasmMouseEvent = mod.exports.gateWasmMouseEvent; Module.gateWasmMusicCount = mod.exports.gateWasmMusicCount; Module.gateWasmSoundCount = mod.exports.gateWasmSoundCount; Module.gateWasmSpriteVertSrc = mod.exports.gateWasmSpriteVertSrc; @@ -411,7 +412,9 @@ function tryStart2 () { requestAnimationFrame(updateAndDraw); document.addEventListener('keydown', e => handleKeyEvent(e.key, true)); document.addEventListener('keyup', e => handleKeyEvent(e.key, false)); - document.addEventListener('mousemove', e => handleMouseMotionEvent(e)); + document.addEventListener('mousemove', e => handleMouseMotion(e)); + document.addEventListener('mousedown', e => handleMouseEvent(e, true)); + document.addEventListener('mouseup', e => handleMouseEvent(e, false)); } } @@ -428,11 +431,17 @@ function handleKeyEvent(codeStr, down) { } } -function handleMouseMotionEvent(evt) { +function handleMouseMotion(evt) { cursorPos.x = evt.clientX; cursorPos.y = evt.clientY; } +function handleMouseEvent(evt, down) { + cursorPos.x = evt.clientX; + cursorPos.y = evt.clientY; + Module.gateWasmMouseEvent(cursorPos.x, cursorPos.y, evt.button, down) +} + function resizeCanvas() { const newWidth = Math.max(window.innerWidth, 100); const newHeight = Math.max(window.innerHeight, 100); |