add SystemEventPump to wrap the sdl2 event pump struct

This commit is contained in:
Gered 2023-02-19 18:04:00 -05:00
parent addd92c1f2
commit 9cb333454a
2 changed files with 42 additions and 5 deletions

View file

@ -187,3 +187,38 @@ impl From<sdl2::event::Event> for SystemEvent {
} }
} }
} }
pub trait SystemEventHandler {
/// Processes the data from the given [`SystemEvent`]. Returns true if the processing actually
/// recognized the passed event, or false if the event was ignored.
fn handle_event(&mut self, event: &SystemEvent) -> bool;
}
pub struct SystemEventIterator<'a> {
iter: sdl2::event::EventPollIterator<'a>,
}
impl Iterator for SystemEventIterator<'_> {
type Item = SystemEvent;
fn next(&mut self) -> Option<Self::Item> {
self.iter.next().map(|e| e.into())
}
}
pub struct SystemEventPump {
sdl_event_pump: sdl2::EventPump,
}
impl SystemEventPump {
pub fn from(pump: sdl2::EventPump) -> Self {
SystemEventPump {
sdl_event_pump: pump,
}
}
pub fn poll_iter(&mut self) -> SystemEventIterator {
self.sdl_event_pump.pump_events();
SystemEventIterator { iter: self.sdl_event_pump.poll_iter() }
}
}

View file

@ -1,7 +1,7 @@
use std::fmt::Formatter; use std::fmt::Formatter;
use byte_slice_cast::AsByteSlice; use byte_slice_cast::AsByteSlice;
use sdl2::{AudioSubsystem, EventPump, Sdl, TimerSubsystem, VideoSubsystem}; use sdl2::{AudioSubsystem, Sdl, TimerSubsystem, VideoSubsystem};
use sdl2::audio::AudioSpecDesired; use sdl2::audio::AudioSpecDesired;
use sdl2::pixels::PixelFormatEnum; use sdl2::pixels::PixelFormatEnum;
use sdl2::render::{Texture, WindowCanvas}; use sdl2::render::{Texture, WindowCanvas};
@ -310,6 +310,8 @@ impl SystemBuilder {
audio.resume(); audio.resume();
let audio_queue = AudioQueue::new(&audio); let audio_queue = AudioQueue::new(&audio);
let event_pump = SystemEventPump::from(sdl_event_pump);
// create input device objects, exposed to the application // create input device objects, exposed to the application
let keyboard = Keyboard::new(); let keyboard = Keyboard::new();
@ -323,7 +325,6 @@ impl SystemBuilder {
sdl_canvas, sdl_canvas,
sdl_texture, sdl_texture,
sdl_texture_pitch, sdl_texture_pitch,
sdl_event_pump,
texture_pixels, texture_pixels,
audio, audio,
audio_queue, audio_queue,
@ -332,6 +333,7 @@ impl SystemBuilder {
font, font,
keyboard, keyboard,
mouse, mouse,
event_pump,
target_framerate: self.target_framerate, target_framerate: self.target_framerate,
target_framerate_delta: None, target_framerate_delta: None,
next_tick: 0, next_tick: 0,
@ -351,7 +353,6 @@ pub struct System {
sdl_canvas: WindowCanvas, sdl_canvas: WindowCanvas,
sdl_texture: Texture, sdl_texture: Texture,
sdl_texture_pitch: usize, sdl_texture_pitch: usize,
sdl_event_pump: EventPump,
texture_pixels: Box<[u32]>, texture_pixels: Box<[u32]>,
@ -387,6 +388,8 @@ pub struct System {
/// The current mouse state. To ensure it is updated each frame, you should call /// The current mouse state. To ensure it is updated each frame, you should call
/// [`System::do_events`] or [`System::do_events_with`] each frame. /// [`System::do_events`] or [`System::do_events_with`] each frame.
pub mouse: Mouse, pub mouse: Mouse,
pub event_pump: SystemEventPump,
} }
impl std::fmt::Debug for System { impl std::fmt::Debug for System {
@ -481,8 +484,7 @@ impl System {
{ {
self.keyboard.update(); self.keyboard.update();
self.mouse.update(); self.mouse.update();
self.sdl_event_pump.pump_events(); for event in self.event_pump.poll_iter() {
for event in self.sdl_event_pump.poll_iter() {
let event = event.into(); let event = event.into();
self.keyboard.handle_event(&event); self.keyboard.handle_event(&event);
self.mouse.handle_event(&event); self.mouse.handle_event(&event);