我是 Rust 的新手,我正在开发一款使用活塞引擎的游戏来弄湿我的脚。
我想使用精灵表渲染一堆实体,但很多实体可能共享一个精灵表,所以我只想加载和存储每个文件的一个副本。
在伪代码中,我的方法基本上是这样的:
fn get_spritesheet(hashmap_cache, file):
if file not in hashmap_cache:
hashmap_cache[file] = load_image_file(file)
return hashmap_cache[file]
然后可能是这样的:
//These 'sprite' fileds point to the same image in memory
let player1 = Entity { sprite: get_spritesheet(cache, "player.png") };
let player2 = Entity { sprite: get_spritesheet(cache, "player.png") };
但是,我在 Rust 的所有权系统中遇到了很多障碍(可能是因为我只是不了解它(。
据我所知,我希望cahe/hashmap"拥有"图像资源。具体来说,返回引用(如在get_spritesheet
函数中(似乎很奇怪。另外,结构是否有可能不拥有其所有成员?我认为是的,但我对如何做到这一点感到困惑。
std::collections::hash_map::Entry
的用途:
地图中单个条目的视图,该条目可能处于空置状态或已占用状态。
match hashmap_cache.entry(key) {
Entry::Vacant(entry) => *entry.insert(value),
Entry::Occupied(entry) => *entry.get(),
}
如果条目为空,则将值插入到缓存中,否则从缓存中接收值。
操场
我发现返回借用只会给我一个错误,因为我传入了两个借用的函数引用,并且它不知道返回是从哪一个借用的。添加生存期参数使其正常工作。我的函数现在看起来像这样:
pub fn load_spritesheet<'a>(
spritesheets: &'a mut HashMap<String, Texture>,
file: &String,
) -> Option<&'a Texture> {
if !spritesheets.contains_key(file) {
if let Some(texture) = load_texture(
&vec!["dynamic_entities", "spritesheets"],
file.as_str(),
&TextureSettings::new(),
) {
spritesheets.insert(file.clone(), texture);
}
}
spritesheets.get(file)
}
至于结构中的引用,我刚刚实现了一个 getter 方法,该方法调用load_spritesheet
每一帧。不理想,但目前有效。