Skip to content

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

@kivimango

Description

@kivimango

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


Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions