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