specs icon indicating copy to clipboard operation
specs copied to clipboard

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

Open kivimango opened this issue 4 years ago • 1 comments
trafficstars

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<RefCell>> 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


kivimango avatar Feb 28 '21 13:02 kivimango

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.

zesterer avatar Mar 01 '21 10:03 zesterer