|
| 1 | +extern crate winit; |
| 2 | +use winit::event_loop::EventLoop; |
| 3 | +use std::time::Instant; |
| 4 | + |
| 5 | +#[derive(Debug, Clone)] |
| 6 | +enum Rumble { |
| 7 | + None, |
| 8 | + Left, |
| 9 | + Right, |
| 10 | +} |
| 11 | + |
| 12 | +fn main() { |
| 13 | + let event_loop = EventLoop::new(); |
| 14 | + |
| 15 | + // You should generally use `GamepadEvent::Added/Removed` to detect gamepads, as doing that will |
| 16 | + // allow you to more easily support gamepad hotswapping. However, we're using `enumerate` here |
| 17 | + // because it makes this example more concise. |
| 18 | + let gamepads = winit::event::device::GamepadHandle::enumerate(&event_loop).collect::<Vec<_>>(); |
| 19 | + |
| 20 | + let rumble_patterns = &[ |
| 21 | + (0.5, Rumble::None), |
| 22 | + (2.0, Rumble::Left), |
| 23 | + (0.5, Rumble::None), |
| 24 | + (2.0, Rumble::Right), |
| 25 | + ]; |
| 26 | + let mut rumble_iter = rumble_patterns.iter().cloned().cycle(); |
| 27 | + |
| 28 | + let mut active_pattern = rumble_iter.next().unwrap(); |
| 29 | + let mut timeout = active_pattern.0; |
| 30 | + let mut timeout_start = Instant::now(); |
| 31 | + |
| 32 | + event_loop.run(move |_, _, _| { |
| 33 | + if timeout <= active_pattern.0 { |
| 34 | + let t = (timeout / active_pattern.0) * std::f64::consts::PI; |
| 35 | + let intensity = t.sin(); |
| 36 | + |
| 37 | + for g in &gamepads { |
| 38 | + let result = match active_pattern.1 { |
| 39 | + Rumble::Left => g.rumble(intensity, 0.0), |
| 40 | + Rumble::Right => g.rumble(0.0, intensity), |
| 41 | + Rumble::None => Ok(()), |
| 42 | + }; |
| 43 | + |
| 44 | + if let Err(e) = result { |
| 45 | + println!("Rumble failed: {:?}", e); |
| 46 | + } |
| 47 | + } |
| 48 | + |
| 49 | + timeout = (Instant::now() - timeout_start).as_millis() as f64 / 1000.0; |
| 50 | + } else { |
| 51 | + active_pattern = rumble_iter.next().unwrap(); |
| 52 | + println!("Rumbling {:?} for {:?} seconds", active_pattern.1, active_pattern.0); |
| 53 | + |
| 54 | + timeout = 0.0; |
| 55 | + timeout_start = Instant::now(); |
| 56 | + } |
| 57 | + }); |
| 58 | +} |
0 commit comments