amethyst / specs

Specs - Parallel ECS

Home Page:https://amethyst.github.io/specs/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

[Question] How to change values of Component's from outside of World ?

kivimango opened this issue · comments

Description

Hello. Im making a GUI prototype based on the ECS architecture using specs.
i would like to modfiy the values of components from outside the world through widgets.

Motivation

Lets says i have Label widget, and i would like to modify its TextComponent's value when i click on a Button widget.

struct TextComponent {
    text: String
}

struct Label {
    id: Entity,
    width: usize,
    height: usize,
    x: usize,
    y: usize,
    text: TextComponent
}

impl Label {
    fn text(&self) -> &TextComponent {
        &self.text
    }
    
    fn set_text(&mut self, new_text: String) {
        // label has the new value, but world has the old value...
        // how to notify the world that this entity's component changed ?
        self.text = TextComponent {
            text: new_text
            }
       
    }
    
    impl build(world: &mut World) -> Label {
        world.register::<TextComponent>();
        let text = TextComponent::default();
        let id = world.create_entity()
            .width(text);
            
        Label {
            id: id,
            width: 100,
            height: 75,
            x:0,
            y:0,
            text: text
        }
    }
}

Drawbacks

i would like to avoid using Rc> if its possible, it does not scale with lots of entities and has some performance costs
How do games solves this problem ? Im thinking some kinf of messaging system but what libraries are should i use ?
I tried the observer pattern, but its very challenging with rust ownership's system to hold a mutable references of World in each widget.

Unresolved questions


Why not place the World itself behind an Rc/Arc? They have zero cost access to inner data and all of the important methods on World that you might care about at runtime only require &self.