Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/ecsx-framework/ecsx
An Entity-Component-System framework for Elixir
https://github.com/ecsx-framework/ecsx
ecs elixir entity-component-system game-development game-server-framework realtime simulation
Last synced: 2 days ago
JSON representation
An Entity-Component-System framework for Elixir
- Host: GitHub
- URL: https://github.com/ecsx-framework/ecsx
- Owner: ecsx-framework
- License: gpl-3.0
- Created: 2022-06-15T18:11:08.000Z (over 2 years ago)
- Default Branch: master
- Last Pushed: 2024-03-20T02:41:16.000Z (10 months ago)
- Last Synced: 2025-01-09T07:05:28.091Z (2 days ago)
- Topics: ecs, elixir, entity-component-system, game-development, game-server-framework, realtime, simulation
- Language: Elixir
- Homepage:
- Size: 229 KB
- Stars: 220
- Watchers: 11
- Forks: 10
- Open Issues: 13
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
# ECSx
[![Hex Version](https://img.shields.io/hexpm/v/ecsx.svg)](https://hex.pm/packages/ecsx)
[![License](https://img.shields.io/hexpm/l/ecsx.svg)](https://github.com/ecsx-framework/ECSx/blob/master/LICENSE)
[![Documentation](https://img.shields.io/badge/documentation-gray)](https://hexdocs.pm/ecsx)ECSx is an Entity-Component-System (ECS) framework for Elixir. ECS is an architecture for building real-time games and simulations, wherein data about Entities is stored in small fragments called Components, which are then read and updated by Systems.
## Setup
- Add `:ecsx` to the list of dependencies in `mix.exs`:
```elixir
def deps do
[
{:ecsx, "~> 0.5"}
]
end
```- Run `mix deps.get`
- Run `mix ecsx.setup`## Upgrading
While ECSx is pre-v1.0, minor version updates will contain breaking changes. If you are upgrading an application from ECSx 0.4.x or earlier, please refer to our [upgrade guide](https://hexdocs.pm/ecsx/upgrade_guide.html).
## Tutorial Project
[Building a ship combat engine with ECSx in a Phoenix app](https://hexdocs.pm/ecsx/initial_setup.html)
Note: This tutorial project is a work-in-progress## Usage
### Entities and Components
Everything in your application is an Entity, but in ECS you won't work with these Entities directly - instead you will work with the individual attributes that an Entity might have. These attributes are given to an Entity by creating a Component, which holds, at minimum, the Entity's unique ID, but also can store a value. For example:
- You're running a 2-dimensional simulation of cars on a highway
- Each car gets its own `entity_id` e.g. `123`
- If the car with ID `123` is blue, we give it a `Color` Component with value `"blue"`
- If the same car is moving west at 60mph, we might model this with a `Direction` Component with value `"west"` and a `Speed` Component with value `60`
- The car would also have Components such as `XCoordinate` and `YCoordinate` to locate it on the map### Systems
Once your Entities are modeled using Components, you'll create Systems to operate on them. For example:
- Entities with `Speed` Components should have their locations regularly updated according to the speed and direction
- We can create a `Move` System which reads the `Speed` and `Direction` Components, calculates how far the car has moved since the last server tick, and updates the Entity's `XCoordinate` and/or `YCoordinate` Component accordingly.
- The System will run every tick, only considering Entities which have a `Speed` Component### Generators
ECSx comes with generators to quickly create new Components or Systems:
- `mix ecsx.gen.component`
- `mix ecsx.gen.system`### Manager
Every ECSx application requires a Manager module, where valid Component types and Systems are declared, as well as the setup to spawn world objects before any players join. This module is created for you during `mix ecsx.setup` and will be automatically updated by the other generators.
It is especially important to consider the order of your Systems list. The manager will run each System one at a time, in order.
### Persistence
Components are not persisted by default. To persist an entity, use the `persist: true` option when adding the component. The default adapter for persistence is the [ECSx.Persistence.FileAdapter](lib/ecsx/persistence/file_adapter.ex), which stores the components in a binary file. The adapter can be changed using the `persistence_adapter` application variable:
```elixir
config :ecsx,
...
persistence_adapter: ...
```Currently available Persistence Adapters (see links for installation/configuration instructions):
- [ECSx.Persistence.Ecto](https://github.com/ecsx-framework/ecsx_persistence_ecto)
## License
Copyright (C) 2022 Andrew P Berrien
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the [GNU General Public License](https://www.gnu.org/licenses/gpl.html) for more details.