use std::sync::{Arc, Mutex};
use macroquad::prelude::{
coroutines::{start_coroutine, wait_seconds},
next_frame,
};
#[macroquad::test]
async fn back_to_the_future_coroutine() {
struct Player {
on_ground: bool,
allow_movement: bool,
}
let player = Arc::new(Mutex::new(Player {
on_ground: false,
allow_movement: false,
}));
let player2 = player.clone();
start_coroutine(async move {
loop {
if player.lock().unwrap().on_ground {
break;
}
next_frame().await;
}
println!("before wait");
wait_seconds(1.0).await;
println!("after wait");
player.lock().unwrap().allow_movement = true;
});
let mut i = 10;
loop {
println!("{}", i);
if player2.lock().unwrap().allow_movement {
break;
}
if i == 0 {
player2.lock().unwrap().on_ground = true;
}
i -= 1;
next_frame().await;
}
assert!(i < -1, "coroutine blocked main thread");
}