- correct the mouse button iterator, it now works correctly

- correct `is_mouse_button_pressed()`, now uses mask correctly
- add examples for `mouse_state()` and `relative_mouse_state()`
This commit is contained in:
Luke Jones
2016-11-19 13:03:41 +13:00
parent 6ee98e1a9c
commit e4812cea7e
4 changed files with 116 additions and 15 deletions
+47
View File
@@ -0,0 +1,47 @@
extern crate sdl2;
use sdl2::event::Event;
use sdl2::mouse::MouseButton;
use std::collections::HashSet;
use std::time::Duration;
pub fn main() {
let sdl_context = sdl2::init().unwrap();
let video_subsystem = sdl_context.video().unwrap();
let _window = video_subsystem.window("Mouse", 800, 600)
.position_centered()
.build()
.unwrap();
let mut events = sdl_context.event_pump().unwrap();
let mut prev_buttons = HashSet::new();
'running: loop {
for event in events.poll_iter() {
match event {
Event::Quit {..} => break 'running,
_ => ()
}
}
// get a mouse state
let state = events.mouse_state();
// Create a set of pressed Keys.
let buttons = state.pressed_mouse_buttons().collect();
// Get the difference between the new and old sets.
let new_buttons = &buttons - &prev_buttons;
let old_buttons = &prev_buttons - &buttons;
if !new_buttons.is_empty() || !old_buttons.is_empty() {
println!("X = {:?}, Y = {:?} : {:?} -> {:?}", state.x(), state.y(), new_buttons, old_buttons);
}
prev_buttons = buttons;
std::thread::sleep(Duration::from_millis(100));
}
}
+39
View File
@@ -0,0 +1,39 @@
extern crate sdl2;
use sdl2::event::Event;
use sdl2::mouse::MouseButton;
use std::time::Duration;
pub fn main() {
let sdl_context = sdl2::init().unwrap();
let video_subsystem = sdl_context.video().unwrap();
let _window = video_subsystem.window("Mouse", 800, 600)
.position_centered()
.build()
.unwrap();
let mut events = sdl_context.event_pump().unwrap();
let mut state = events.relative_mouse_state();
let mut old_x = 0;
let mut old_y = 0;
'running: loop {
for event in events.poll_iter() {
match event {
Event::Quit {..} => break 'running,
_ => ()
}
}
// get a mouse state using mouse_state() so as not to call
// relative_mouse_state() twice and get a false position reading
if events.mouse_state().is_mouse_button_pressed(MouseButton::Left) {
state = events.relative_mouse_state();
println!("Relative - X = {:?}, Y = {:?}", state.x(), state.y());
}
std::thread::sleep(Duration::from_millis(100));
}
}
+17 -9
View File
@@ -183,22 +183,22 @@ impl MouseButton {
#[derive(Copy, Clone, Eq, PartialEq, Hash)]
pub struct MouseState {
mouse_state: u32,
x: u32,
y: u32
x: i32,
y: i32
}
impl MouseState {
pub fn new(_e: &EventPump) -> MouseState {
let mut x = 0;
let mut y = 0;
let mouse_state = unsafe {
let mouse_state: u32 = unsafe {
ll::SDL_GetMouseState(&mut x, &mut y)
};
MouseState {
mouse_state: mouse_state,
x: x as u32,
y: y as u32
x: x as i32,
y: y as i32
}
}
@@ -233,18 +233,25 @@ impl MouseState {
/// Tests if the X2 mouse button was pressed.
pub fn x2(&self) -> bool { (self.mouse_state & ll::SDL_BUTTON_X2MASK) != 0 }
/// Returns the x coordinate of the state
pub fn x(&self) -> i32 { self.x }
/// Returns the y coordinate of the state
pub fn y(&self) -> i32 { self.y }
/// Returns true if the mouse button is pressed.
///
/// # Example
/// ```no_run
/// use sdl2::mouse::MouseButton;
///
/// fn is_a_pressed(e: &sdl2::EventPump) -> bool {
/// fn is_left_pressed(e: &sdl2::EventPump) -> bool {
/// e.mouse_state().is_mouse_button_pressed(MouseButton::Left)
/// }
/// ```
pub fn is_mouse_button_pressed(&self, mouse_button: MouseButton) -> bool {
self.mouse_state<<((mouse_button as u32)-1) != 0
let mask = 1 << ((mouse_button as u32)-1);
self.mouse_state & mask != 0
}
/// Returns an iterator all mouse buttons with a boolean indicating if the scancode is pressed.
@@ -305,12 +312,13 @@ impl<'a> Iterator for MouseButtonIterator<'a> {
type Item = (MouseButton, bool);
fn next(&mut self) -> Option<(MouseButton, bool)> {
if self.index < MouseButton::X2 as usize {
if self.index < MouseButton::X2 as usize +1 {
let index = self.index;
self.index += 1;
if let Some(mouse_button) = FromPrimitive::from_usize(index) {
let pressed = self.mouse_state&(MouseButton::Middle as u32) != 0;
let mask = 1 << ((mouse_button as u32)-1);
let pressed = self.mouse_state & mask != 0;
Some((mouse_button, pressed))
} else {
+13 -6
View File
@@ -7,8 +7,8 @@ use super::{MouseButton, MouseButtonIterator, PressedMouseButtonIterator};
#[derive(Copy, Clone, Eq, PartialEq, Hash)]
pub struct RelativeMouseState {
mouse_state: u32,
x: u32,
y: u32
x: i32,
y: i32
}
impl RelativeMouseState {
@@ -22,8 +22,8 @@ impl RelativeMouseState {
RelativeMouseState {
mouse_state: mouse_state,
x: x as u32,
y: y as u32
x: x as i32,
y: y as i32
}
}
@@ -58,18 +58,25 @@ impl RelativeMouseState {
/// Tests if the X2 mouse button was pressed.
pub fn x2(&self) -> bool { (self.mouse_state & ll::SDL_BUTTON_X2MASK) != 0 }
/// Returns the x coordinate of the state
pub fn x(&self) -> i32 { self.x }
/// Returns the y coordinate of the state
pub fn y(&self) -> i32 { self.y }
/// Returns true if the mouse button is pressed.
///
/// # Example
/// ```no_run
/// use sdl2::mouse::MouseButton;
///
/// fn is_a_pressed(e: &sdl2::EventPump) -> bool {
/// fn is_left_pressed(e: &sdl2::EventPump) -> bool {
/// e.mouse_state().is_mouse_button_pressed(MouseButton::Left)
/// }
/// ```
pub fn is_mouse_button_pressed(&self, mouse_button: MouseButton) -> bool {
self.mouse_state<<((mouse_button as u32)-1) != 0
let mask = 1 << ((mouse_button as u32)-1);
self.mouse_state & mask != 0
}
/// Returns an iterator all mouse buttons with a boolean indicating if the scancode is pressed.