Skip to main content

Annotation-based asynchronous ECS library

Project description

ECS micro-engine

Library for python containing an interpretation of ECS design pattern.

Features

  1. Adding/removing entity's attributes causes dynamic addition/removal of the entity from the corresponding systems
  2. Systems with annotation-based syntax
  3. Asynchronous systems (yield skips a frame)
  4. Systems accept multiple arguments, preventing global mutable state issues
  5. Full compatibility with type hints

Interpretation

  1. Entity is a python object
  2. Component is entity's attribute
  3. System is an entity describing an interaction between cartesian product of entities
  4. Metasystem is a system that launches other systems
  5. MetasystemFacade encapsulates all general logic (add, remove, update)

Installation

pip install ecs-girvel

Usage

You can also see girvel/fallen, ecs is written for it.

from ecs import MetasystemFacade, System, Entity  # TODO NEXT fix demo
import time


# 1. You create a metasystem
ms = MetasystemFacade()

dt = 0.04

# 2. You create systems and add them to metasystem
class VerticalSpeed:
    vy: float

class GravityConstants:
    g: float

@ms.add
@System
def gravity(target: VerticalSpeed, constants: GravityConstants):
    target.vy += constants.g * dt

class Inert:
    x: float
    y: float
    vx: float
    vy: float

@ms.add
@System
def inertia(target: Inert):
    target.x += target.vx * dt
    target.y += target.vy * dt

class Displayable:
    x: float
    y: float
    name: str

@ms.add
@System
def output(target: Displayable):
    yield from range(int(1 / dt) - 1)  # skips 24 out of 25 frames
    print(f'{target.name}: {target.x:.2f}, {target.y:.2f}')


# 3. You create objects
class DynamicEntity(Entity):
    def __init__(self, **attributes):
        for key, value in attributes.items():
            setattr(self, key, value)

ms.add(DynamicEntity(name='falling_guy1', x=0, y=0, vx=0, vy=0))
ms.add(DynamicEntity(name='falling_guy2', x=100, y=0, vx=0, vy=0))
ms.add(DynamicEntity(g=10))


# 4. Game loop
if __name__ == "__main__":
    while True:
        ms.update()
        time.sleep(dt)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ecs-girvel-3.0.1.tar.gz (5.5 kB view details)

Uploaded Source

Built Distribution

ecs_girvel-3.0.1-py3-none-any.whl (5.7 kB view details)

Uploaded Python 3

File details

Details for the file ecs-girvel-3.0.1.tar.gz.

File metadata

  • Download URL: ecs-girvel-3.0.1.tar.gz
  • Upload date:
  • Size: 5.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.10.5

File hashes

Hashes for ecs-girvel-3.0.1.tar.gz
Algorithm Hash digest
SHA256 0a9e02bb396cfa6a093fd94e2afbaac65f13467dc0a2cb906fc162b4e14189b5
MD5 272e20c4bb46311e3a4fe8a247644039
BLAKE2b-256 33cab54779d12148c8f0cc5e8d56a81f3df1014c7a3e86cc38ffb2aee626e2a4

See more details on using hashes here.

File details

Details for the file ecs_girvel-3.0.1-py3-none-any.whl.

File metadata

  • Download URL: ecs_girvel-3.0.1-py3-none-any.whl
  • Upload date:
  • Size: 5.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.10.5

File hashes

Hashes for ecs_girvel-3.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 47bf028a95325a56407b9d577db200e0a9446ff8b28446757cba71e0bb67cef2
MD5 867d97d197c4bf2329b2811a1e6baa8f
BLAKE2b-256 29ec2336dad36b0ba00a49e99b2900e51640b32690006980da776d35bf9f65e9

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page