diff --git a/README.md b/README.md index 4e8120a..cffece8 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ fn main() { `aspect_ratio` (Letterbox), Palette, VSync, `mouse_visible`, `mouse_capture`. Default = 800×600 Fenster, 320×240 Framebuffer, 4:3, `palette::RGB332`. - `Platform::new(cfg)` – Fenster + GPU-Pipeline aufsetzen. -- `poll_events(timeout)` – GLFW-Events einlesen (`None` = blockierend). +- `poll_events(timeout)` – winit-Events einlesen (`None` = blockierend). - `drain_events()` – Iterator über `Event` (`Key`, `Char`, `MouseMove`, `MouseBtn`, `Resize`, `CloseRequested`). - `framebuffer_mut()` – `&mut [u8]` der Länge `w*h`, je Pixel ein Paletten-Index. @@ -66,19 +66,22 @@ fn main() { - `present()` – Frame auf das Fenster bringen. - `should_close()` / `request_close()`. - `set_mouse_visible(bool)` – Cursor anzeigen oder verstecken (freie Bewegung). -- `set_mouse_capture(bool)` – Cursor einsperren + verstecken (`CursorMode::Disabled`), - liefert unbegrenzte Bewegungsdeltas. Impliziert `mouse_visible = false`. +- `set_mouse_capture(bool)` – Cursor einsperren + verstecken (winit + `CursorGrabMode::Locked`, Fallback `Confined`), liefert unbegrenzte + Bewegungsdeltas via `mouse_delta()`. Impliziert `mouse_visible = false`. + Im Capture-Mode ist `Event::MouseMove` nicht sinnvoll (eingefrorene oder + am Fensterrand klemmende Werte) — stattdessen `mouse_delta()` benutzen. - `mouse_delta() -> (f32, f32)` – akkumulierte Mausbewegung seit dem letzten Aufruf in Framebuffer-Pixeln (gleiche Skala wie `MouseMove`), danach genullt. Nützlich für FPS-Kamerasteuerung. ### Cursor-Modi -| `mouse_visible` | `mouse_capture` | GLFW-Modus | Einsatz | +| `mouse_visible` | `mouse_capture` | winit-Modus | Einsatz | |---|---|---|---| -| `true` | `false` | Normal | Standard-UI | -| `false` | `false` | Hidden | Eigener Cursor im Framebuffer | -| `*` | `true` | Disabled | FPS-Kamera, unbegrenzte Deltas | +| `true` | `false` | sichtbar, frei | Standard-UI | +| `false` | `false` | versteckt, frei | Eigener Cursor im Framebuffer | +| `*` | `true` | `Locked` / `Confined`, versteckt | FPS-Kamera, unbegrenzte Deltas | ```rust // FPS-Kamera diff --git a/src/lib.rs b/src/lib.rs index c1a0cc0..08f3aef 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -475,19 +475,21 @@ impl<'a> ApplicationHandler for Handler<'a> { let sx = fw as f64 / cw.max(1) as f64; let sy = fh as f64 / ch.max(1) as f64; - // Im Capture-Mode liefert winit geclampte CursorMoved-Werte; - // den Delta-Pfad nehmen wir dort aus DeviceEvent::MouseMotion. + // Im Capture-Mode liefert winit geclampte/eingefrorene + // CursorMoved-Werte. Delta kommt dort aus DeviceEvent::MouseMotion, + // MouseMove unterdrücken wir komplett — die Absolutposition wäre + // irreführend (Locked: konstant, Confined: am Rand klemmend). if !self.mouse_capture { if let Some((lx, ly)) = *self.last_cursor_pos { self.mouse_delta.0 += ((x - lx) * sx) as f32; self.mouse_delta.1 += ((y - ly) * sy) as f32; } *self.last_cursor_pos = Some((x, y)); - } - let fx = ((x - cx as f64) * sx) as f32; - let fy = ((y - cy as f64) * sy) as f32; - self.event_queue.push_back(Event::MouseMove { x: fx, y: fy }); + let fx = ((x - cx as f64) * sx) as f32; + let fy = ((y - cy as f64) * sy) as f32; + self.event_queue.push_back(Event::MouseMove { x: fx, y: fy }); + } } WindowEvent::MouseInput { button, state, .. } => if let Some(b) = from_winit_button(button) { self.event_queue.push_back(Event::MouseBtn {