Rust 中存储用作活塞纹理或精灵的对象集合的惯用方式是什么?
What is the idiomatic way in Rust to store a collection of objects to be used as Piston textures or sprites?
我见过的所有访问纹理对象的示例都是执行如下操作:
let img = Texture::from_path(...)
这给人的印象是,为了拥有一个纹理数组,它应该类似于 let mut images: Vec<Texture>;
,但是 from_path
returns 一个 Result<Texture<R>, String>
.
真正阻碍的是Texture<R>
。为了能够做出一个Texture<R>
,需要大量的crates
和use ...
,感觉完全不对。
是否正确:
let loaded_textures:Vec<Option<T>> = Texture::from_path(...)
或者拉动 Piston 拥有的几乎所有东西?或者是其他东西?
我的目标是
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
。包含这个创建感觉不对,如果我已经包含一个游戏引擎(如 Piston),它似乎有点低级。
您可能想要映射一组路径并为每个路径创建一个纹理。在 Result
s 的迭代器上收集时,您可以将它们解包并将结果移动到最终集合的外部:
let images: Result<Vec<Texture<_>>, String> = paths.iter()
.map(|path| Texture::from_path(
&mut *window.factory.borrow_mut(),
&path,
Flip::None,
&TextureSettings::new())
)
.collect();
您不需要 Texture<R>
的 R
参数,因为它可以从您从 PistonWindow
获得的 Factory<R>
实例中推断出来,这就是为什么我只需放一个 _
。事实上,如果你愿意,你可以将 images
的类型减少到 Result<Vec<_>>
,因为即使这样也可以推断出来。
免责声明:我实际上无法 运行 我所在的位置。但如果它不起作用,它应该只需要小的改变。
我见过的所有访问纹理对象的示例都是执行如下操作:
let img = Texture::from_path(...)
这给人的印象是,为了拥有一个纹理数组,它应该类似于 let mut images: Vec<Texture>;
,但是 from_path
returns 一个 Result<Texture<R>, String>
.
真正阻碍的是Texture<R>
。为了能够做出一个Texture<R>
,需要大量的crates
和use ...
,感觉完全不对。
是否正确:
let loaded_textures:Vec<Option<T>> = Texture::from_path(...)
或者拉动 Piston 拥有的几乎所有东西?或者是其他东西?
我的目标是
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
。包含这个创建感觉不对,如果我已经包含一个游戏引擎(如 Piston),它似乎有点低级。
您可能想要映射一组路径并为每个路径创建一个纹理。在 Result
s 的迭代器上收集时,您可以将它们解包并将结果移动到最终集合的外部:
let images: Result<Vec<Texture<_>>, String> = paths.iter()
.map(|path| Texture::from_path(
&mut *window.factory.borrow_mut(),
&path,
Flip::None,
&TextureSettings::new())
)
.collect();
您不需要 Texture<R>
的 R
参数,因为它可以从您从 PistonWindow
获得的 Factory<R>
实例中推断出来,这就是为什么我只需放一个 _
。事实上,如果你愿意,你可以将 images
的类型减少到 Result<Vec<_>>
,因为即使这样也可以推断出来。
免责声明:我实际上无法 运行 我所在的位置。但如果它不起作用,它应该只需要小的改变。