# SDL3 + FLECS Template A scaffold/template for building games using SDL3 and the FLECS Entity Component System. ## Features - **SDL3** - Modern cross-platform multimedia library - **FLECS** - Fast and lightweight Entity Component System - **CMake** - Cross-platform build system with FetchContent for dependencies - **Clean Architecture** - Separated components, systems, and game logic ## Project Structure ``` . ├── CMakeLists.txt # Build configuration ├── include/ │ ├── components/ # ECS component definitions │ │ ├── transform.h # Position, Velocity, Rotation, Scale │ │ ├── render.h # Color, Sprite, RectShape, CircleShape │ │ ├── input.h # PlayerControlled, InputState │ │ └── common.h # Name, ToDestroy, Lifetime, Health │ ├── components.h # Master component include │ ├── systems.h # System declarations │ └── game.h # Game context and main loop ├── src/ │ ├── main.c # Entry point │ ├── game.c # Game initialization and loop │ └── systems.c # ECS system implementations └── external/ # (unused - deps fetched via CMake) ``` ## Building ### Prerequisites - CMake 3.20+ - C11 compatible compiler (GCC, Clang, MSVC) - Git (for fetching dependencies) ### Linux/macOS ```bash # Create build directory mkdir build && cd build # Configure cmake .. # Build cmake --build . # Run ./sdl3_flecs_template ``` ### Windows (Visual Studio) ```bash mkdir build && cd build cmake .. -G "Visual Studio 17 2022" cmake --build . --config Release .\Release\sdl3_flecs_template.exe ``` ### Windows (MinGW) ```bash mkdir build && cd build cmake .. -G "MinGW Makefiles" cmake --build . .\sdl3_flecs_template.exe ``` ## Usage Guide ### Adding Components 1. Create a new header in `include/components/` (e.g., `physics.h`) 2. Define your component struct: ```c typedef struct RigidBody { float mass; float friction; } RigidBody; ``` 3. Include it in `include/components.h` 4. Register it in `src/systems.c`: ```c ECS_COMPONENT_DECLARE(RigidBody); // In register_components(): ECS_COMPONENT_DEFINE(world, RigidBody); ``` ### Adding Systems 1. Declare the system in `include/systems.h`: ```c void PhysicsSystem(ecs_iter_t* it); ``` 2. Implement it in `src/systems.c`: ```c void PhysicsSystem(ecs_iter_t* it) { Position* pos = ecs_field(it, Position, 0); RigidBody* rb = ecs_field(it, RigidBody, 1); for (int i = 0; i < it->count; i++) { // Physics logic here } } ``` 3. Register it in `register_systems()`: ```c ecs_system(world, { .entity = ecs_entity(world, { .name = "PhysicsSystem", .add = ecs_ids(ecs_dependson(EcsOnUpdate)) }), .query.terms = { { .id = ecs_id(Position), .inout = EcsInOut }, { .id = ecs_id(RigidBody), .inout = EcsIn } }, .callback = PhysicsSystem }); ``` ### Creating Entities ```c ecs_entity_t player = ecs_new(world); ecs_set(world, player, Position, { .x = 100, .y = 100 }); ecs_set(world, player, Velocity, { .x = 0, .y = 0 }); ecs_set(world, player, RectShape, { .width = 32, .height = 32 }); ecs_set(world, player, Color, { .r = 0, .g = 255, .b = 0, .a = 255 }); ecs_set(world, player, PlayerControlled, { .player_id = 0 }); ``` ### System Phases FLECS provides built-in phases for ordering systems: - `EcsOnLoad` - Load external data - `EcsPostLoad` - Process loaded data - `EcsPreUpdate` - Prepare for update - `EcsOnUpdate` - Main update logic - `EcsOnValidate` - Validate state - `EcsPostUpdate` - Post-update cleanup - `EcsPreStore` - Prepare for rendering - `EcsOnStore` - Render/store output ## Controls - **ESC** - Quit - **P** - Pause/unpause ## License This template is released into the public domain. Use it however you like! ## Resources - [SDL3 Documentation](https://wiki.libsdl.org/SDL3) - [FLECS Documentation](https://www.flecs.dev/flecs/md_docs_2Docs.html) - [FLECS Examples](https://github.com/SanderMertens/flecs/tree/master/examples)