From e954cacdb56b42e4cb2561b4e1dd7dd44de9c44e Mon Sep 17 00:00:00 2001 From: Emil Date: Sat, 20 Jun 2026 22:03:30 +0300 Subject: [PATCH] fix: add sleep to game loop, panic hook restores terminal - 16ms sleep per frame prevents 100% CPU spin - Panic hook restores terminal (disable raw mode, leave alternate screen) before printing panic message, so errors are visible - Remove debug eprintlns --- src/game.rs | 6 +++++- src/main.rs | 11 +++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/game.rs b/src/game.rs index e6e5017..e1825d3 100644 --- a/src/game.rs +++ b/src/game.rs @@ -196,6 +196,8 @@ impl Game { } self.handle_input(vw, vh); + + std::thread::sleep(std::time::Duration::from_millis(16)); } if let Err(e) = renderer.shutdown() { @@ -206,7 +208,9 @@ impl Game { pub fn handle_input(&mut self, vw: usize, vh: usize) { let action = self.input.poll(); match action { - Action::Quit => self.running = false, + Action::Quit => { + self.running = false; + } Action::MoveLeft => self.player.move_left(&mut self.entities), Action::MoveRight => self.player.move_right(&mut self.entities), Action::Jump => { diff --git a/src/main.rs b/src/main.rs index 489ee18..4718cbd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -28,6 +28,17 @@ fn main() { match cli.mode.as_str() { "terminal" => { + std::panic::set_hook(Box::new(|info| { + let _ = crossterm::terminal::disable_raw_mode(); + let _ = crossterm::execute!( + std::io::stdout(), + crossterm::style::ResetColor, + crossterm::cursor::Show, + crossterm::terminal::LeaveAlternateScreen, + crossterm::event::DisableMouseCapture, + ); + eprintln!("PANIC: {}", info); + })); let mut renderer = TerminalRenderer::new(); let mut game = Game::new(); game.run(&mut renderer);