Как очистить «сцену» в kiss3d ржавчины? - PullRequest
1 голос
/ 22 марта 2019

Это конкретный вопрос о 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 Ответ

2 голосов
/ 22 марта 2019

Вы можете получить scene из window с помощью функции Window::scene_mut, которая вернет 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 даже.

детская площадка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...