mage-core 0.2.0

An ASCII art game engine written in Rust.
Documentation
use mage_core::{
    image::Point, load_font_image, run, App, Colour, Config, Font, PresentInput, PresentResult,
    TickInput, TickResult,
};
use tracing::info;
use tracing_subscriber::EnvFilter;

#[tokio::main]
async fn main() {
    color_eyre::install().unwrap();
    let filter = EnvFilter::from_default_env()
        .add_directive("wgpu=warn".parse().unwrap())
        .add_directive("mage=trace".parse().unwrap());
    tracing_subscriber::fmt::fmt()
        .without_time()
        .compact()
        .with_env_filter(filter)
        .init();

    info!("Starting...");

    let app = TestApp::new();
    let config = Config {
        font: Font::Custom(load_font_image(include_bytes!("font3.png")).unwrap()),
        ..Default::default()
    };

    let _ = run(app, config).await;
}

struct TestApp {
    dt: f32,
}

impl TestApp {
    fn new() -> Self {
        Self { dt: 0.0 }
    }
}

impl App for TestApp {
    fn tick(&mut self, tick_input: TickInput) -> TickResult {
        self.dt = tick_input.dt.num_microseconds().unwrap() as f32 / 1_000_000.0;
        TickResult::Continue
    }

    fn present(&mut self, mut present_input: PresentInput) -> PresentResult {
        let mut image = present_input.new_image();

        use rand::Rng;
        let mut rng = rand::thread_rng();
        image.fore_image.iter_mut().for_each(|c| {
            *c = rng.gen::<u32>() | 0xff000000;
        });
        image.back_image.iter_mut().for_each(|c| {
            *c = rng.gen::<u32>() | 0xff000000;
        });
        image.text_image.iter_mut().for_each(|c| {
            *c = rng.gen::<u8>() as u32;
        });

        let fps = (1.0 / self.dt) as u32;
        let message = format!("FPS: {} ", fps);
        image.draw_string(
            Point::default(),
            &message,
            Colour::White.into(),
            Colour::LightRed.into(),
        );

        present_input.blit(
            present_input.rect(),
            image.rect(),
            &image,
            Colour::Black.into(),
        );

        PresentResult::Changed
    }
}