紫水晶的载入程序找不到资产文件

时间:2018-08-25 17:07:23

标签: rust loading amethyst

我正在使用Rust Amethyst游戏引擎加载名为ground.png的纹理,但是Loader似乎找不到该文件:

//...
let assets_dir = format!("{}", env!("CARGO_MANIFEST_DIR"));
let mut game = Application::build(assets_dir, Example)?.build(game_data)?;

我的assets_dir是项目的根文件夹,并且在加载文件时,我附加了textures/ground.png

let texture_handle = {
    let loader = world.read_resource::<Loader>();
    let texture_storage = world.read_resource::<AssetStorage<Texture>>();
    loader.load(
        "textures/ground.png",
        PngFormat,
        Default::default(),
        (),
        &texture_storage,
    )
};

我的文件目录如下:

├── src
│   └── main.rs
├── Cargo.toml
└── textures
    └── ground.png

获取纹理时,我得到的错误是一个None值:

assert!(
    world
        .read_resource::<AssetStorage<Texture>>()
        .get(&texture_handle) != None
); //panics

我正在使用紫水晶0.8。

1 个答案:

答案 0 :(得分:1)

希望此表对您有所帮助,因为有很多可能的答案。

所有行均假定您正在使用以下方式加载纹理:

loader.load("path/to/texture.png", ..)

列出的路径是相对于存储库目录的。

| Amethyst version | What the code uses for assets dir | How you run the executable | Where the texture should be |
| ---------------- | --------------------------------- | -------------------------- | --------------------------- |
| 0.10.0           | `"assets"`                                         | cargo run                  | `$repo/target/$profile/assets/path/to/texture.png` |
| 0.10.0           | `format!("{}/assets", env!("CARGO_MANIFEST_DIR"))` | cargo run                  | `$repo/assets/path/to/texture.png` |
| 0.10.0           | `"assets"`                                         | `./target/$profile/app`    | `$repo/assets/path/to/texture.png` |
| 0.10.0           | `env!("CARGO_MANIFEST_DIR")`                       | `./target/$profile/app`    | `$repo/assets/path/to/texture.png` |
| 0.10.0           | `option_env!("CARGO_MANIFEST_DIR").map(|d| format!("{}/assets", d)).unwrap_or("assets")` | cargo run                  | `$repo/assets/path/to/texture.png` |
| 0.10.0           | `option_env!("CARGO_MANIFEST_DIR").map(|d| format!("{}/assets", d)).unwrap_or("assets")` | `./target/$profile/app`    | `$repo/target/$profile/assets/path/to/texture.png` |
| `master`         | `application_root_dir()`                           | cargo run                  | `$repo/assets/path/to/texture.png` |
| `master`         | `application_root_dir()`                           | `./target/$profile/app`    | `$repo/target/$profile/assets/path/to/texture.png` |

前四个不是很好的解决方案(开发路径或播放器路径错误)。容忍它的第五种方法和第六种方法,是使用master函数在application_root_dir()上为您完成的。