4

I am fairly new to Bevy and rust. I want to load an png image and get the width and height of it. The code below does not print "found resource ...".

fn setup( mut commands: Commands,
      asset_server: Res<AssetServer>,
      mut materials: ResMut<Assets<Image>>) {
let texture_handle = asset_server.load("board.png");

//materials.add(texture_handle.clone().into()); //Gives error: the trait `From<Handle<_>>` is not implemented for `bevy::prelude::Image`

commands.spawn().insert_bundle(SpriteBundle {
    texture: texture_handle.clone(),
    ..Default::default()
}).insert(BackgroundSprite);

if let Some(image) = materials.get(texture_handle) {
    print!("found resource with width and height: [{},{}]", image.texture_descriptor.size.width, image.texture_descriptor.size.height);
}

}

Michael
  • 892
  • 2
  • 10
  • 28

1 Answers1

1

I figured it out after some help on the Bevy Discord help channle.

Resources are loaded asynchronously and has to be accessed at a later point. See AssetEvent example here

I am a beginner when it comes to Rust so I wont say this is the way to do it. But here is my result:

#[derive(Component)]
pub struct BackgroundHandle {
    handle: Handle<Image>,
}

#[derive(Component)]
pub struct BackgroundSpriteSize {
    width: u32,
    height: u32,
}

fn setup( mut commands: Commands,
          mut app_state: ResMut<State<BoardState>>,
          asset_server: Res<AssetServer>) {
    let texture_handle = asset_server.load("board.png");

    commands.spawn().insert_bundle(SpriteBundle {
        texture: texture_handle.clone(),
        ..Default::default()
    }).insert(BackgroundSpriteBundle);

    commands.insert_resource(BackgroundHandle {
        handle: texture_handle,
    });

    app_state.set(BoardState::Initializing);
}

fn setupBounds(mut commands: Commands,
               mut app_state: ResMut<State<BoardState>>,
               mut ev_asset: EventReader<AssetEvent<Image>>,
               assets: Res<Assets<Image>>,
               bg: Res<BackgroundHandle>) {

    for ev in ev_asset.iter() {
        match ev {
            AssetEvent::Created { handle } => {
                if *handle == bg.handle {
                    let img = assets.get(bg.handle.clone()).unwrap();

                    let bg_size = BackgroundSpriteSize {
                        width: img.texture_descriptor.size.width,
                        height: img.texture_descriptor.size.height,
                    };

                    commands.insert_resource(bg_size);
                    app_state.set(BoardState::Initialized);
                }
            },
            _ => {

            }
        }
    }
}
Michael
  • 892
  • 2
  • 10
  • 28
  • I am also new to Rust, but I think I would replace `match` with a single arm with an `if let` statement, and I would guess that clippy would be able to make such suggestions – maybe you wanna try that? – hans_meine Oct 16 '22 at 17:41