3

我看到的所有访问纹理对象的示例都是执行以下操作:

let img = Texture::from_path(...) 

这给人的印象是,为了拥有一组纹理,它应该类似于let mut images: Vec<Texture>;,但from_path返回一个Result<Texture<R>, String>.

并且它Texture<R>确实阻碍了它。为了能够制作一个Texture<R>,需要大量的cratesuse ...是完全错误的。

是正确的事情:

let loaded_textures:Vec<Option<T>> = Texture::from_path(...)

或者拉动活塞拥有的几乎所有东西?或者是其他东西?

我的目标是拥有

struct Drawables {
    obj_name: &'static str,
    image: Texture<gfx_device_gl::Resources>, // or something else
}

let mut my_objects: Vec<Drawable>;

fn LoadDrawables(window: &mut PistonWindow) -> Vec<Drawable> {
    let assets = find_folder::Search::ParentsThenKids(3, 3)
        .for_folder("assets")
        .unwrap();
    let img1 = assets.join("some_img0.png");
    let img1 = Texture::from_path(
        &mut window.factory,
        &img1,
        Flip::None,
        &TextureSettings::new(),
    ).unwrap();
    let img2 = assets.join("some_img1.png");
    let img2 = Texture::from_path(
        &mut window.factory,
        &img2,
        Flip::None,
        &TextureSettings::new(),
    ).unwrap();
    vec![
        Drawable {
            obj_name: "orc",
            image: rogue,
        },
        Drawable {
            obj_name: "bat",
            image: floor,
        },
    ]
}

我试图避免拉入的板条箱是gfx_device_gl. 包含这个创建感觉是错误的,如果我已经包含了诸如活塞之类的游戏引擎,它似乎有点低水平。

4

1 回答 1

2

您可能想要映射一组路径并为每个路径创建一个纹理。在Results 的迭代器上收集时,您可以将它们展开并将结果移动到最终集合的外部:

let images: Result<Vec<Texture<_>>, String> = paths.iter()
    .map(|path| Texture::from_path(
            &mut *window.factory.borrow_mut(),
            &path,
            Flip::None,
            &TextureSettings::new())
    )
    .collect();

你不应该需要R参数 forTexture<R>因为它可以从Factory<R>你得到的实例中推断出来PistonWindow,这就是为什么我只放一个_. 实际上,您可以根据需要减少类型imagesResult<Vec<_>>因为即使这样也可以推断出来。

免责声明:我无法在我所在的位置实际运行此代码。但如果它不起作用,它应该只需要小的改动。

于 2017-09-28T16:44:58.903 回答