Fix Cursor capture bug
This commit is contained in:
@@ -57,7 +57,7 @@ fn main() {
|
|||||||
`aspect_ratio` (Letterbox), Palette, VSync, `mouse_visible`, `mouse_capture`.
|
`aspect_ratio` (Letterbox), Palette, VSync, `mouse_visible`, `mouse_capture`.
|
||||||
Default = 800×600 Fenster, 320×240 Framebuffer, 4:3, `palette::RGB332`.
|
Default = 800×600 Fenster, 320×240 Framebuffer, 4:3, `palette::RGB332`.
|
||||||
- `Platform::new(cfg)` – Fenster + GPU-Pipeline aufsetzen.
|
- `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`,
|
- `drain_events()` – Iterator über `Event` (`Key`, `Char`, `MouseMove`,
|
||||||
`MouseBtn`, `Resize`, `CloseRequested`).
|
`MouseBtn`, `Resize`, `CloseRequested`).
|
||||||
- `framebuffer_mut()` – `&mut [u8]` der Länge `w*h`, je Pixel ein Paletten-Index.
|
- `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.
|
- `present()` – Frame auf das Fenster bringen.
|
||||||
- `should_close()` / `request_close()`.
|
- `should_close()` / `request_close()`.
|
||||||
- `set_mouse_visible(bool)` – Cursor anzeigen oder verstecken (freie Bewegung).
|
- `set_mouse_visible(bool)` – Cursor anzeigen oder verstecken (freie Bewegung).
|
||||||
- `set_mouse_capture(bool)` – Cursor einsperren + verstecken (`CursorMode::Disabled`),
|
- `set_mouse_capture(bool)` – Cursor einsperren + verstecken (winit
|
||||||
liefert unbegrenzte Bewegungsdeltas. Impliziert `mouse_visible = false`.
|
`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
|
- `mouse_delta() -> (f32, f32)` – akkumulierte Mausbewegung seit dem letzten Aufruf
|
||||||
in Framebuffer-Pixeln (gleiche Skala wie `MouseMove`), danach genullt. Nützlich
|
in Framebuffer-Pixeln (gleiche Skala wie `MouseMove`), danach genullt. Nützlich
|
||||||
für FPS-Kamerasteuerung.
|
für FPS-Kamerasteuerung.
|
||||||
|
|
||||||
### Cursor-Modi
|
### Cursor-Modi
|
||||||
|
|
||||||
| `mouse_visible` | `mouse_capture` | GLFW-Modus | Einsatz |
|
| `mouse_visible` | `mouse_capture` | winit-Modus | Einsatz |
|
||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
| `true` | `false` | Normal | Standard-UI |
|
| `true` | `false` | sichtbar, frei | Standard-UI |
|
||||||
| `false` | `false` | Hidden | Eigener Cursor im Framebuffer |
|
| `false` | `false` | versteckt, frei | Eigener Cursor im Framebuffer |
|
||||||
| `*` | `true` | Disabled | FPS-Kamera, unbegrenzte Deltas |
|
| `*` | `true` | `Locked` / `Confined`, versteckt | FPS-Kamera, unbegrenzte Deltas |
|
||||||
|
|
||||||
```rust
|
```rust
|
||||||
// FPS-Kamera
|
// FPS-Kamera
|
||||||
|
|||||||
+8
-6
@@ -475,19 +475,21 @@ impl<'a> ApplicationHandler for Handler<'a> {
|
|||||||
let sx = fw as f64 / cw.max(1) as f64;
|
let sx = fw as f64 / cw.max(1) as f64;
|
||||||
let sy = fh as f64 / ch.max(1) as f64;
|
let sy = fh as f64 / ch.max(1) as f64;
|
||||||
|
|
||||||
// Im Capture-Mode liefert winit geclampte CursorMoved-Werte;
|
// Im Capture-Mode liefert winit geclampte/eingefrorene
|
||||||
// den Delta-Pfad nehmen wir dort aus DeviceEvent::MouseMotion.
|
// 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 !self.mouse_capture {
|
||||||
if let Some((lx, ly)) = *self.last_cursor_pos {
|
if let Some((lx, ly)) = *self.last_cursor_pos {
|
||||||
self.mouse_delta.0 += ((x - lx) * sx) as f32;
|
self.mouse_delta.0 += ((x - lx) * sx) as f32;
|
||||||
self.mouse_delta.1 += ((y - ly) * sy) as f32;
|
self.mouse_delta.1 += ((y - ly) * sy) as f32;
|
||||||
}
|
}
|
||||||
*self.last_cursor_pos = Some((x, y));
|
*self.last_cursor_pos = Some((x, y));
|
||||||
}
|
|
||||||
|
|
||||||
let fx = ((x - cx as f64) * sx) as f32;
|
let fx = ((x - cx as f64) * sx) as f32;
|
||||||
let fy = ((y - cy as f64) * sy) as f32;
|
let fy = ((y - cy as f64) * sy) as f32;
|
||||||
self.event_queue.push_back(Event::MouseMove { x: fx, y: fy });
|
self.event_queue.push_back(Event::MouseMove { x: fx, y: fy });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
WindowEvent::MouseInput { button, state, .. } => if let Some(b) = from_winit_button(button) {
|
WindowEvent::MouseInput { button, state, .. } => if let Some(b) = from_winit_button(button) {
|
||||||
self.event_queue.push_back(Event::MouseBtn {
|
self.event_queue.push_back(Event::MouseBtn {
|
||||||
|
|||||||
Reference in New Issue
Block a user