#world #component #storage #framework #entities #vector #secsy

yanked secsy_world

The data storage component for the secsy framework

1 unstable release

0.0.1 Jul 23, 2023

#92 in #entities


Used in secsy

GPL-3.0-or-later

13KB
172 lines

secsy_world

This is the world data storage component of the secsy framework.

The main feature of this crate is the World type, which is an ECS-ish data storage structure which stores the component data of the entities within it. Entities are referred to by their IDs, which are then used to get or set the data corresponding to that entity ID.

A World can also be queried for a type, which returns a vector of IDs for entities which have a component of that type. This vector can then be used to run code for every entity with that type, or, for example, be checked against a query for a different type, so that traditional data-oriented game programming patterns may be employed.

Example

use secsy::secsy_world;
use secsy_world::entities::*;
use secsy_world::world::*;

fn main() {
    let mut world = World::new();

    let a = secsy_ecs::spawn_entity_with!(world, 1, 2.0, (3, 3), '4', "5");
    let b = secsy_ecs::spawn_entity_with!(world, 1.0, (2, 2), '3', "4");
    let c = secsy_ecs::spawn_entity_with!(world, 1, (2, 2), '3', "4");
    let d = secsy_ecs::spawn_entity_with!(world, 1, 2.0, '3', "4");
    let e = secsy_ecs::spawn_entity_with!(world, 1, 2.0, (3, 3), "4");
    let e = secsy_ecs::spawn_entity_with!(world, 1, 2.0, (3, 3), '4');
    let f = secsy_ecs::spawn_entity_with!(world, 1.0, (2, 2), '3');
    let g = secsy_ecs::spawn_entity_with!(world, 1, (2, 2), "3");
    let h = secsy_ecs::spawn_entity_with!(world, 1, 2.0, '3', "4");
    let i = secsy_ecs::spawn_entity_with!(world, 1, (2, 2), "3");
    let j = secsy_ecs::spawn_entity_with!(world, 1.0, (2, 2), '3');

    let qi = world.query::<i32>().unwrap();
    let qf = world.query::<f64>().unwrap();
    let qt = world.query::<(i32, i32)>().unwrap();
    let qc = world.query::<char>().unwrap();
    let qs = world.query::<&str>().unwrap();

    let has_ints_and_chars: Vec<EntityId> = 
        qi.iter().filter(|i| qc.contains(i)).cloned().collect();

    let has_floats_and_strings: Vec<EntityId> =
        qf.iter().filter(|i| qs.contains(i)).cloned().collect();

    let has_tuples_and_ints: Vec<EntityId> = 
        qt.iter().filter(|i| qi.contains(i)).cloned().collect();

    println!("{:?}", has_ints_and_chars);
    println!("{:?}", has_floats_and_strings);
    println!("{:?}", has_tuples_and_ints);
}

No runtime deps