3

我正在使用 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。

4

1 回答 1

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` |

前 4 个不是好的解决方案(开发路径或播放器路径错误)。第5种和第6种容忍方式,这是为你master使用该application_root_dir()功能所做的。

于 2019-05-03T04:59:46.213 回答