Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/BlackMATov/ecs.hpp
C++17 Entity Component System
https://github.com/BlackMATov/ecs.hpp
c-plus-plus c-plus-plus-14 cpp cpp14 ecs entity-component-system
Last synced: about 1 month ago
JSON representation
C++17 Entity Component System
- Host: GitHub
- URL: https://github.com/BlackMATov/ecs.hpp
- Owner: BlackMATov
- License: mit
- Created: 2018-12-24T01:17:16.000Z (over 5 years ago)
- Default Branch: main
- Last Pushed: 2023-01-07T09:06:04.000Z (over 1 year ago)
- Last Synced: 2024-02-22T04:37:38.382Z (5 months ago)
- Topics: c-plus-plus, c-plus-plus-14, cpp, cpp14, ecs, entity-component-system
- Language: C++
- Homepage: https://blackmatov.github.io/ecs.hpp
- Size: 298 KB
- Stars: 36
- Watchers: 5
- Forks: 4
- Open Issues: 7
-
Metadata Files:
- Readme: README.md
- License: LICENSE.md
Lists
- anything_about_game - github
README
# ecs.hpp
> C++17 Entity Component System
[![linux][badge.linux]][linux]
[![darwin][badge.darwin]][darwin]
[![windows][badge.windows]][windows]
[![language][badge.language]][language]
[![license][badge.license]][license][badge.darwin]: https://img.shields.io/github/actions/workflow/status/BlackMATov/ecs.hpp/.github/workflows/darwin.yml?label=Xcode&logo=xcode
[badge.linux]: https://img.shields.io/github/actions/workflow/status/BlackMATov/ecs.hpp/.github/workflows/linux.yml?label=GCC%2FClang&logo=linux
[badge.windows]: https://img.shields.io/github/actions/workflow/status/BlackMATov/ecs.hpp/.github/workflows/windows.yml?label=Visual%20Studio&logo=visual-studio
[badge.language]: https://img.shields.io/badge/language-C%2B%2B17-yellow
[badge.license]: https://img.shields.io/badge/license-MIT-blue[darwin]: https://github.com/BlackMATov/ecs.hpp/actions?query=workflow%3Adarwin
[linux]: https://github.com/BlackMATov/ecs.hpp/actions?query=workflow%3Alinux
[windows]: https://github.com/BlackMATov/ecs.hpp/actions?query=workflow%3Awindows
[language]: https://en.wikipedia.org/wiki/C%2B%2B17
[license]: https://en.wikipedia.org/wiki/MIT_License[ecs]: https://github.com/BlackMATov/ecs.hpp
## Requirements
- [clang](https://clang.llvm.org/) **>= 7**
- [gcc](https://www.gnu.org/software/gcc/) **>= 7**
- [msvc](https://visualstudio.microsoft.com/) **>= 2019**
- [xcode](https://developer.apple.com/xcode/) **>= 10.3**## Installation
[ecs.hpp][ecs] is a header-only library. All you need to do is copy the headers files from `headers` directory into your project and include them:
```cpp
#include "ecs.hpp/ecs.hpp"
```Also, you can add the root repository directory to your [cmake](https://cmake.org) project:
```cmake
add_subdirectory(external/ecs.hpp)
target_link_libraries(your_project_target PUBLIC ecs.hpp::ecs.hpp)
```## Basic usage
```cpp
#include
namespace ecs = ecs_hpp;// events
struct update_event {
float dt{};
};struct render_event {
std::string camera;
};// components
struct movable {};
struct disabled {};struct sprite {
std::string name;
};struct position {
float x{};
float y{};
};struct velocity {
float x{};
float y{};
};// systems
class gravity_system : public ecs::system {
public:
gravity_system(float gravity)
: gravity_(gravity) {}void process(ecs::registry& world, const update_event& evt) override {
world.for_each_component(
[this, &evt](ecs::entity, velocity& vel) {
vel.x += gravity_ * evt.dt;
vel.y += gravity_ * evt.dt;
}, ecs::exists{} && !ecs::exists{});
}
private:
float gravity_{};
};class movement_system : public ecs::system {
public:
void process(ecs::registry& world, const update_event& evt) override {
world.for_joined_components(
[&evt](ecs::entity, position& pos, const velocity& vel) {
pos.x += vel.x * evt.dt;
pos.y += vel.y * evt.dt;
}, ecs::exists{} && !ecs::exists{});
}
};class render_system : public ecs::system {
public:
void process(ecs::registry& world, const render_event& evt) override {
world.for_joined_components(
[&evt](ecs::entity, const sprite& s, const position& p) {
std::cout << "Render sprite:" << std::endl;
std::cout << "--> pos: " << p.x << "," << p.y << std::endl;
std::cout << "--> sprite: " << s.name << std::endl;
std::cout << "--> camera: " << evt.camera << std::endl;
}, !ecs::exists{});
}
};// world
ecs::registry world;
struct physics_feature {};
world.assign_feature()
.add_system()
.add_system(9.8f);struct rendering_feature {};
world.assign_feature()
.add_system();// entities
auto entity_one = world.create_entity();
ecs::entity_filler(entity_one)
.component()
.component("ship")
.component(4.f, 2.f)
.component(10.f, 20.f);auto entity_two = world.create_entity();
ecs::entity_filler(entity_two)
.component()
.component("player")
.component(4.f, 2.f)
.component(10.f, 20.f);// processing
world.process_event(update_event{0.1f});
world.process_event(render_event{"main"});
```## [License (MIT)](./LICENSE.md)