poll_event
This commit is contained in:
@@ -31,14 +31,11 @@ fn main() {
|
||||
while !p.should_close() {
|
||||
p.poll_events(None);
|
||||
|
||||
// drain_events() borrowt &mut self → close erst nach dem Loop setzen.
|
||||
let mut close = false;
|
||||
for ev in p.drain_events() {
|
||||
while let Some(ev) = p.poll_event() {
|
||||
if let Event::Key { key: Key::Escape, pressed: true, .. } = ev {
|
||||
close = true;
|
||||
p.request_close();
|
||||
}
|
||||
}
|
||||
if close { p.request_close(); }
|
||||
|
||||
let (w, _h) = p.framebuffer_size();
|
||||
let fb = p.framebuffer_mut();
|
||||
@@ -58,8 +55,14 @@ fn main() {
|
||||
Default = 800×600 Fenster, 320×240 Framebuffer, 4:3, `palette::RGB332`.
|
||||
- `Platform::new(cfg)` – Fenster + GPU-Pipeline aufsetzen.
|
||||
- `poll_events(timeout)` – winit-Events einlesen (`None` = blockierend).
|
||||
- `poll_event() -> Option<Event>` – ein Event aus der Queue holen. Gibt
|
||||
`&mut self` nach jedem Call frei, sodass im Loop direkt auf die Platform
|
||||
reagiert werden kann (`request_close`, `set_mouse_capture`, `palette_mut` …).
|
||||
Empfohlen für die normale Event-Schleife.
|
||||
- `drain_events()` – Iterator über `Event` (`Key`, `Char`, `MouseMove`,
|
||||
`MouseBtn`, `Resize`, `CloseRequested`).
|
||||
`MouseBtn`, `Resize`, `CloseRequested`). Borrowt `&mut self` bis der
|
||||
Iterator fertig ist — Reaktionen auf die Platform müssen dann nach dem
|
||||
Loop angewandt werden. Nützlich für reines Loggen/Filtern.
|
||||
- `framebuffer_mut()` – `&mut [u8]` der Länge `w*h`, je Pixel ein Paletten-Index.
|
||||
- `palette_mut()` / `palette()` – `&mut [[u8; 3]; 256]` bzw. `&[...]`; Schreibzugriff
|
||||
markiert die Palette dirty, der nächste `present()` lädt sie hoch.
|
||||
|
||||
+6
-5
@@ -28,17 +28,18 @@ fn main() {
|
||||
// Event schlafen — gut für statische UIs, schlecht für Animation.
|
||||
p.poll_events(Some(Duration::from_millis(0)));
|
||||
|
||||
// drain_events() borrowt &mut self → Aktionen auf p erst nach dem Loop.
|
||||
let mut close = false;
|
||||
for ev in p.drain_events() {
|
||||
// poll_event() gibt &mut self nach jedem Call wieder frei → Aktionen
|
||||
// auf p (request_close, set_mouse_capture, palette_mut …) sind direkt
|
||||
// im Loop erlaubt. drain_events() existiert weiter für den Fall, dass
|
||||
// nur gelesen wird.
|
||||
while let Some(ev) = p.poll_event() {
|
||||
match ev {
|
||||
Event::Key { key: Key::Escape, pressed: true, .. } => close = true,
|
||||
Event::Key { key: Key::Escape, pressed: true, .. } => p.request_close(),
|
||||
Event::MouseMove { x, y } => mouse = (x, y),
|
||||
Event::MouseBtn { button: MouseButton::Left, pressed } => paint = pressed,
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
if close { p.request_close(); }
|
||||
|
||||
let (w, h) = p.framebuffer_size();
|
||||
let fb = p.framebuffer_mut();
|
||||
|
||||
@@ -311,6 +311,14 @@ impl Platform {
|
||||
self.event_queue.drain(..)
|
||||
}
|
||||
|
||||
/// Holt ein einzelnes Event aus der Queue. Gibt `&mut self` nach jedem Call
|
||||
/// wieder frei, im Gegensatz zu `drain_events()` — sodass im Loop direkt
|
||||
/// auf die Platform reagiert werden kann (`request_close`, `set_mouse_capture`,
|
||||
/// `palette_mut` …).
|
||||
pub fn poll_event(&mut self) -> Option<Event> {
|
||||
self.event_queue.pop_front()
|
||||
}
|
||||
|
||||
pub fn framebuffer_mut(&mut self) -> &mut [u8] { &mut self.framebuffer }
|
||||
pub fn framebuffer_size(&self) -> (u32, u32) { self.framebuffer_size }
|
||||
|
||||
|
||||
Reference in New Issue
Block a user