No description
Find a file
keithaustin 3517517c9f
Merge pull request #2 from overtinkering/master
Added "What is an ECS" on  README.md
2023-09-16 16:58:05 -04:00
example Change first example name 2023-09-12 14:34:39 -04:00
src More prep for publish 2023-09-12 14:02:48 -04:00
LICENSE.md Improve readme and add new example 2023-09-12 14:34:02 -04:00
README.md Added "What is an ECS" on README.md 2023-09-16 21:13:30 +01:00
worldtree.nimble Improve readme and add new example 2023-09-12 14:34:02 -04:00

WorldTree - An ECS framework for Nim

A small, lightweight ECS framework written in Nim.

This project is in early development, so expect bugs and breaking changes! Please test, break things, give suggestions or ask questions!

What is an ECS?

ECS ("Entity Component System") refers to a "Data-Oriented" design approach that promotes code reusability by separating data from behaviour while also promoting data locality to improve performance by being cache-friendly. More info : https://github.com/SanderMertens/ecs-faq

Usage

First, make sure you're on the latest stable release of Nim(2.0.0 or later). Then, install with either

nimble install worldtree

or

nimble install https://github.com/keithaustin/worldtree

A basic example

import worldtree

# Declare components and systems
type
  Position = ref object of Component
    x: int
    y: int

  Velocity = ref object of Component
    x: int
    y: int

  Movement = ref object of System

proc onTick(self: Movement, tree: var WorldTree) =
  for entity in self.entities:
    let xVelocity = tree.getComponent[:Velocity](entity).x
    let yVelocity = tree.getComponent[:Velocity](entity).y

    tree.getComponent[:Position](entity).x += xVelocity
    tree.getComponent[:Position](entity).y += yVelocity

# Instanstiate a WorldTree
var tree = WorldTree()

# Register Component types
tree.registerComponentType[:Position]()
tree.registerComponentType[:Velocity]()

# Register Systems
let moveSystem = tree.registerSystem[:Movement]()

# Set system signatures
var signature: set[ComponentType]
signature.incl(tree.getComponentType[:Position]())
signature.incl(tree.getComponentType[:Velocity]())
tree.setSystemSignature[:Movement](signature)

# Create an entity
var mover = tree.newEntity()

# Give it some components
tree.addComponent[:Position](mover, Position(x: 32, y: 64))
tree.addComponent[:Velocity](mover, Velocity(x: 3, y: 1))

# Run the main loop
while true:
  moveSystem.onTick(tree)