From: Bernie Innocenti Date: Mon, 1 Mar 2021 07:46:52 +0000 (+0700) Subject: Improve event handling X-Git-Url: https://codewiz.org/gitweb?a=commitdiff_plain;ds=sidebyside;h=20c701434df0fea9118120e87aae12f914cc47d5;hp=0830429eef89bde43236f306d39f794043363b42;p=mandelwow.git Improve event handling Now moving the mouse no longer hangs rendering, but events can still cause the game timer (t) to advance too fast. Will fix this another time. --- diff --git a/main.rs b/main.rs index 9d2563c..d00c783 100644 --- a/main.rs +++ b/main.rs @@ -1,12 +1,12 @@ use cgmath::conv::array4x4; use cgmath::{Euler, Matrix4, Rad, SquareMatrix, Vector3, Vector4, Zero}; use glium::glutin::event::{ self, Event, VirtualKeyCode, WindowEvent }; -use glium::glutin::event_loop::{ ControlFlow }; +use glium::glutin::event_loop::ControlFlow; use glium::{Display, Program, Surface, uniform}; +use instant::Duration; use mandelwow_lib::*; use std::f32::consts::PI; use std::rc::Rc; -use instant::{Duration, Instant}; #[cfg(target_os = "emscripten")] use std::os::raw::{c_int, c_void}; @@ -277,6 +277,7 @@ fn main() { let mut fullscreen = false; event_loop.run(move |event, _, control_flow| { + timer.update(); let t = timer.t; let new_hit = sound::hit_event(&mut soundplayer); if new_hit > world.last_hit { @@ -286,12 +287,15 @@ fn main() { camera.update(); - *control_flow = ControlFlow::WaitUntil(Instant::now() + Duration::from_nanos(16_666_667)); + *control_flow = ControlFlow::WaitUntil(timer.now + Duration::from_nanos(16_666_667)); match event { + Event::MainEventsCleared => { + world.draw_frame(&display, &camera, t); + } Event::NewEvents(cause) => { match cause { event::StartCause::ResumeTimeReached { .. } | event::StartCause::Init => { - world.draw_frame(&display, &camera, t); + // FIXME }, _ => {} } @@ -312,7 +316,7 @@ fn main() { VirtualKeyCode::PageUp => timer.t += 0.1, VirtualKeyCode::PageDown => timer.t -= 0.2, VirtualKeyCode::F10 => screenshot::take_screenshot(&display), - VirtualKeyCode::F11 | VirtualKeyCode::Return => { + VirtualKeyCode::F | VirtualKeyCode::F11 | VirtualKeyCode::Return => { fullscreen ^= true; let fs = if fullscreen { // let monitor_handle = display.gl_window().window() @@ -333,7 +337,5 @@ fn main() { }, _ => (), } - - timer.update(); }); } diff --git a/timer.rs b/timer.rs index afbfd1a..be0261b 100644 --- a/timer.rs +++ b/timer.rs @@ -15,7 +15,7 @@ const BPS: f32 = 10.0; #[derive(Debug)] pub struct Timer { pub t: f32, - + pub now: Instant, frame: u32, last_report_time: Instant, @@ -34,6 +34,7 @@ impl Timer { let now = Instant::now(); Timer { t: 0.0, + now, frame: 0, last_report_time: now, last_report_frame: 0, @@ -45,24 +46,24 @@ impl Timer { } pub fn update(&mut self) { - let now = Instant::now(); + self.now = Instant::now(); self.poll_rocket(); if !self.pause { // Increment time self.t += 0.01; self.frame += 1; } - self.maybe_report(now); + self.maybe_report(); } #[cfg(not(feature = "logging"))] - fn maybe_report(&mut self, _: Instant) {} + fn maybe_report(&mut self) {} #[cfg(feature = "logging")] - fn maybe_report(&mut self, now: Instant) { - if now - self.last_report_time > Duration::from_secs(5) { - self.report(now); - self.last_report_time = now; + fn maybe_report(&mut self) { + if self.now - self.last_report_time > Duration::from_secs(5) { + self.report(self.now); + self.last_report_time = self.now; self.last_report_frame = self.frame; self.accum_draw_time = Duration::new(0, 0); self.accum_idle_time = Duration::new(0, 0);