如何清除铁锈的kiss3d中的“场景”?

时间:2019-03-22 04:44:23

标签: rust

这是有关sebcrozet / kiss3d(一个用锈写的游戏的图形包)的特定问题:如何清除“场景”?

我可以通过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");
        }
    }
}

1 个答案:

答案 0 :(得分:2)

您可以使用Window::scene_mut函数从scene中获取window,该函数将返回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

Playground