Fix Cursor capture bug

This commit is contained in:
2026-05-23 10:06:37 +02:00
parent 26f535d053
commit 2f8d23f6cd
2 changed files with 18 additions and 13 deletions
+10 -7
View File
@@ -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