rust - 如何清除kiss3d中的场景?
问题描述
这是一个关于 sebcrozet/kiss3d(一个用 rust 编写的游戏图形包)的具体问题:如何清除“场景”?
我可以通过 和 类似的方法将对象添加到场景中window.add_mesh()
,并且似乎可以通过 删除特定对象windows.remove_node()
,但是如何删除场景中的所有对象(例如开始新场景)?
我想我可以保留场景中所有对象的向量,然后遍历向量以删除对象,但这不是必需的。
编辑:这是一些重现错误的代码,摘自我的代码。
use kiss3d::resource::Mesh;
use kiss3d::window::Window;
use na::Point3;
use na::Vector3;
use rand::Rng;
use std::cell::RefCell;
use std::rc::Rc;
extern crate kiss3d;
extern crate nalgebra as na;
extern crate rand;
fn main() {
let mut window = Window::new("Test");
const FRAMES_PER: u16 = 100;
let mut frame_count = FRAMES_PER;
let mut rng = rand::thread_rng();
window.set_point_size(5.0);
while window.render() {
frame_count += 1;
if frame_count > FRAMES_PER {
window
.scene_mut()
.apply_to_scene_nodes_mut(&mut |n| n.unlink());
let mut vertexes: Vec<Point3<f32>> = vec![];
let mut indexes: Vec<Point3<u16>> = vec![];
vertexes.push(Point3::new(
rng.gen_range(-500.0, 500.0),
rng.gen_range(-500.0, 500.0),
400.0,
));
vertexes.push(Point3::new(
rng.gen_range(-500.0, 500.0),
rng.gen_range(-500.0, 500.0),
400.0,
));
vertexes.push(Point3::new(
rng.gen_range(-500.0, 500.0),
rng.gen_range(-500.0, 500.0),
400.0,
));
indexes.push(Point3::new(0, 1, 2));
let mesh = Rc::new(RefCell::new(Mesh::new(
vertexes, indexes, None, None, false,
)));
let mut c = window.add_mesh(mesh, Vector3::new(1.0, 1.0, 1.0));
c.set_color(1.0, 0.0, 1.0);
c.enable_backface_culling(false);
frame_count = 0;
println!("scene regenerated");
}
}
}
解决方案
您可以使用函数scene
从 a获取 a window
,该Window::scene_mut
函数将返回 a SceneNode
。
获得可变场景节点后,您可以使用该SceneNode::apply_to_scene_nodes
功能删除场景内的所有对象。
如kiss3d 文档页面中所述:
fn apply_to_scene_nodes_mut<F: FnMut(&mut SceneNode)>(&mut self, f: &mut F)
对该节点及其子节点包含的每个对象应用闭包。
这是在其中关闭并将其应用于场景内部的所有节点的方法。因此,您不需要将所有对象添加到Vec
.
请注意,此方法以递归方式工作,以将您提供的功能应用于父级及其自身的所有子级。
在您的情况下,只需要取消链接父场景,如下所示:
window.scene_mut().unlink();
每当您取消链接父场景节点时,当然子节点将与父节点取消链接。因此,在您的需要中,您可能甚至不需要
SceneNode::apply_to_scene_nodes
。
推荐阅读
- python - python烧瓶不起作用
- delphi - 在同一个应用程序上允许多个 MDI 父表单
- rest - ToBinding 不适用于 Twilio 休息电话
- react-native - 如何在 react-native 上刷新/重新渲染平面列表?
- spring-boot-actuator - SpringBoot2中的自定义导航执行器端点
- kotlin - NetBeans 可以运行 Kotlin 吗?
- linux - Yocto 元虚拟化:无法包含所需的文件 meta-virt-default-versions.inc
- java - Android:获取房间数据库中具有特定代码的项目数
- javascript - 编辑从计算属性返回的数组中的对象
- regex - 如何计算 Rust 中的正则表达式匹配?