Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
kivimango opened this issue Feb 28, 2021 · 1 comment
Open

Comments

@kivimango
Copy link

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


@zesterer
Copy link
Contributor

zesterer commented Mar 1, 2021

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants