added switch for debug view

This commit is contained in:
JOLIMAITRE Matthieu 2022-09-03 15:10:51 +02:00
parent a7396c5ffc
commit dc2a80bf4f

View file

@ -41,6 +41,7 @@ pub enum Dir {
#[derive(Debug)] #[derive(Debug)]
pub enum InputCmd { pub enum InputCmd {
Exit, Exit,
ToggleDebug,
Move(Dir), Move(Dir),
Accelerate, Accelerate,
Decelerate, Decelerate,
@ -51,6 +52,7 @@ fn input_loop(sender: mpsc::Sender<InputCmd>) {
for c in stdin().keys() { for c in stdin().keys() {
let command = match c.unwrap() { let command = match c.unwrap() {
Key::Char('q') => InputCmd::Exit, Key::Char('q') => InputCmd::Exit,
Key::Char('d') => InputCmd::ToggleDebug,
Key::Up => InputCmd::Move(Dir::Up), Key::Up => InputCmd::Move(Dir::Up),
Key::Down => InputCmd::Move(Dir::Down), Key::Down => InputCmd::Move(Dir::Down),
Key::Left => InputCmd::Move(Dir::Left), Key::Left => InputCmd::Move(Dir::Left),
@ -76,15 +78,18 @@ where
let _input_handle = thread::spawn(|| input_loop(sender)); let _input_handle = thread::spawn(|| input_loop(sender));
let (x, y) = termion::terminal_size().unwrap(); let (x, y) = termion::terminal_size().unwrap();
let mut delay = 200u64; let mut tick_delay = 200u64;
let mut view_origin = pos!(-(x as i32) / 2, -(y as i32)); let mut view_origin = pos!(-(x as i32) / 2, -(y as i32));
let mut debug = false;
loop { loop {
handle_inputs(&receiver, &mut view_origin, &mut delay); handle_inputs(&receiver, &mut view_origin, &mut debug, &mut tick_delay);
handle.set_delay(delay); handle.set_delay(tick_delay);
let world = handle.snapshot(); let world = handle.snapshot();
let mut canvas = Canvas::from_screen(); let mut canvas = Canvas::from_screen();
if debug {
dbg_layer(&mut canvas, &world, view_origin); dbg_layer(&mut canvas, &world, view_origin);
}
grid_layer(&mut canvas, view_origin); grid_layer(&mut canvas, view_origin);
world_layer(&mut canvas, &world, view_origin); world_layer(&mut canvas, &world, view_origin);
title_layer(&mut canvas, handle.delay()); title_layer(&mut canvas, handle.delay());
@ -95,13 +100,19 @@ where
const MOVEMENT_STEP: i32 = 3; const MOVEMENT_STEP: i32 = 3;
fn handle_inputs(receiver: &mpsc::Receiver<InputCmd>, view_origin: &mut Pos, delay: &mut u64) { fn handle_inputs(
receiver: &mpsc::Receiver<InputCmd>,
view_origin: &mut Pos,
debug: &mut bool,
delay: &mut u64,
) {
if let Ok(cmd) = receiver.recv_timeout(VIEW_REFRESH_INTERVAL) { if let Ok(cmd) = receiver.recv_timeout(VIEW_REFRESH_INTERVAL) {
match cmd { match cmd {
InputCmd::Exit => { InputCmd::Exit => {
println!("{}{}", termion::clear::All, termion::cursor::Goto(1, 1)); println!("{}{}", termion::clear::All, termion::cursor::Goto(1, 1));
exit(0); exit(0);
} }
InputCmd::ToggleDebug => *debug = !*debug,
InputCmd::Move(direction) => { InputCmd::Move(direction) => {
*view_origin = *view_origin *view_origin = *view_origin
+ match direction { + match direction {
@ -157,7 +168,8 @@ where
fn title_layer(canvas: &mut Canvas, de: usize) { fn title_layer(canvas: &mut Canvas, de: usize) {
let table = [ let table = [
format!("│ <golrs> | [+]: speed up │"), format!("│ <golrs> | [+]: speed up │"),
format!("│ delay: | [-]: slow down │"), format!("│ | [-]: slow down │"),
format!("│ tick delay: | [d]: debug │"),
format!("{de:>7} ms | [q]: quit │"), format!("{de:>7} ms | [q]: quit │"),
format!("└──────────────────────────────┘"), format!("└──────────────────────────────┘"),
]; ];
@ -183,6 +195,7 @@ fn screen_pos_to_world(mut pos: Pos, view_origin: Pos) -> Pos {
pos + view_origin pos + view_origin
} }
/// double module to avoid irregularities between negatives and positives
fn dmod(a: i32, module: i32) -> i32 { fn dmod(a: i32, module: i32) -> i32 {
((a % module) + module) % module ((a % module) + module) % module
} }