Repository

Primer

Simple ECS implementation in V.


Usage

Basic Setup

import primer_ecs { World }

struct Position { mut: x f32, y f32 }
struct Velocity { mut: dx f32, dy f32 }

mut world := primer_ecs.new_world()
world.register_type[Position]()
world.register_type[Velocity]()

Create Entities with Components

player := world.create_with_components([
    world.component(Position{ x: 0, y: 0 }),
    world.component(Velocity{ dx: 5, dy: 5 }),
]) or { panic(err) }

Query System

pos_id := world.get_type_id[Position]()
vel_id := world.get_type_id[Velocity]()

mut movement_query := primer_ecs.new_query_system([pos_id, vel_id])
world.register_query_system(mut movement_query)

results := movement_query.query(&world)
for row in results {
    // row.entity, row.components
}

Filtered Queries

import primer_ecs { QueryFilter }

player_id := world.get_type_id[Player]()
enemy_id := world.get_type_id[Enemy]()

mut player_filter_query := primer_ecs.new_query_system_filtered([pos_id, health_id],
    [
        QueryFilter{ component_type: player_id, op: .with },
        QueryFilter{ component_type: enemy_id, op: .without },
    ])

filtered_results := player_filter_query.query(&world)

Archetype Graph Transitions

test_entity := world.create()

world.add(test_entity, Position{ x: 10, y: 20 })
world.add(test_entity, Velocity{ dx: 1, dy: 1 })

world.remove[Position](test_entity)

Entity Despawn and Safety

world.despawn(test_entity)

Query Chunks

chunks := movement_query.query_chunked(&world, 25)
for chunk in chunks {
    // chunk.results
}

About

Simple ECS implementation in V

0
2
last Nov 19

Author

sanjaygubaju