use notan::draw::*; use notan::prelude::*; #[derive(AppState)] struct State { font: Font, loading: Option>, loaded: Option, } impl State { fn new(assets: &mut Assets, gfx: &mut Graphics) -> Self { // Start loading the texture let texture = assets .load_asset(&asset_path("rust-logo-512x512.png")) .unwrap(); // Load a font only for debug info let font = gfx .create_font(include_bytes!("assets/Ubuntu-B.ttf")) .unwrap(); Self { font, loading: Some(texture), loaded: None, } } } #[notan_main] fn main() -> Result<(), String> { notan::init_with(State::new) .add_config(DrawConfig) .update(update) .draw(draw) .build() } fn update(state: &mut State) { // Unwrapping an asset reference after it has been loaded we avoid the performance penalty // of the Arc> inside the Asset instance let was_just_loaded = state .loading .as_ref() .map(|assets| assets.is_loaded()) .unwrap_or(false); if was_just_loaded { // Get ownership of the Asset inside the Option let asset = state.loading.take().unwrap(); // Unwrap the asset reference to get the inner let texture = asset.try_unwrap().unwrap(); state.loaded = Some(texture); } } fn draw(gfx: &mut Graphics, state: &mut State) { let mut draw = gfx.create_draw(); draw.clear(Color::BLACK); match &state.loaded { None => { draw.text(&state.font, "Loading...") .position(10.0, 10.0) .size(25.0); } Some(texture) => { draw.image(texture).position(150.0, 50.0); } } gfx.render(&draw); } // The relative path for the example is different on browsers fn asset_path(path: &str) -> String { let base = if cfg!(target_arch = "wasm32") { "./assets" } else { "./examples/assets" }; format!("{base}/{path}") }