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.
- Add
:ecsx
to the list of dependencies inmix.exs
:
def deps do
[
{:ecsx, "~> 0.4"}
]
end
- Run
mix deps.get
- Run
mix ecsx.setup
Building a ship combat engine with ECSx in a Phoenix app
Note: This tutorial project is a work-in-progress
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 aColor
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 aSpeed
Component with value60
- The car would also have Components such as
XCoordinate
andYCoordinate
to locate it on the map
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 theSpeed
andDirection
Components, calculates how far the car has moved since the last server tick, and updates the Entity'sXCoordinate
and/orYCoordinate
Component accordingly. - The System will run every tick, only considering Entities which have a
Speed
Component
ECSx comes with generators to quickly create new Components or Systems:
mix ecsx.gen.component
mix ecsx.gen.system
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.
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, which stores the components in a binary file. The adapter can be changed using the persistence_adapter
application variable:
config :ecsx,
...
persistence_adapter: ...
Currently available Persistence Adapters (see links for installation/configuration instructions):
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 for more details.