title: | Entity-Component-Systems |
---|---|
Author: | Christopher Arndt |
Date: | 2016-01-13 |
description: | Einführung in Entity Component Systems |
keywords: | presentation, restructuredtext, ECS, entity component systems |
- Folien & Beispiele:
- http://github.com/SpotlightKid/talk-ecs-pycologne
- Strukturelles (architektonisches) Entwurfsmuster
- Zur Entkoppelung von Objekten
- Trennung von Objektidentität, Daten und Verhalten
- Datengesteuerte Programmlogik
- Objektorientierter Ansatz führt bei Spielen oft zu Problemen mit der Klassenhierarchie.
- Game-Objekte haben die Tendenz, aufgebläht zu werden und zu eng mit den anderen Programmteilen gekoppelt zu sein.
- Änderungen des Verhaltens von Game-Objekten machen oft Änderungen an vielen Stellen des Codes notwendig.
- Entitäten (Entities)
- Komponenten (Components)
- Systeme (Systems, Processors)
- Welt (World)
- Sind nur ein Unique Identifier
- Enthalten keine Daten
- Werden in der World-Datenbank gespeichert
- Können einfache Integer sein
- Sind reine Datencontainer
- Enthalten keine oder kaum Programmlogik
- Sind unabhängig von anderen Komponenten
- Als Struct oder einfache Klasse nur mit Datenattributen implementiert
class Position: def __init__(self, x, y): self.x = x self.y = y
entities = { <entity ID #1>: { Component1: <component1 instance>, Component2: <component2 instance> }, <entity ID #2>: { Component1: <component1 instance>, Component3: <component3 instance> } }
- Wirken auf die Entitäten, die eine bestimmte Menge von Komponenten haben
- Iterieren in jedem Simulationsschritt über alle diese Entitäten
- Verändern ggf. die Komponentendaten und/oder lösen aufgrund dieser bestimmte Aktionen aus
- Z.B. Veränderung der Position eines Objekts auf Basis seiner Geschwindigkeit, Senden einer Nachricht and Event Listener bei Kollisionen, usw.
class System: def __init__(self, world): self.world = world def process(self): for entity, comp1, comp2 in world.get_components(Component1, Component2): do_something(entity, comp1, comp2)
- Bildet die Datenbank der vorhandenen Entitäten
- Verknüpft diese mit Komponenten
- Enthält alle Systeme, die auf die Entitäten und Komponenten wirken
- Ruft alle Systeme der Reihe nach in jeder Iteration der Simulation auf
class World: ... def step(self): for system in self.systems: system.process()
- Python-Bibliothek zur Implementierung von ECS
- Unabhängig von der benutzten Grafik- oder Gamebibliothek
- Python 3 (inoffizieller Python 2 Branch)
- Auf Github:
- https://github.com/benmoran56/esper
- headless_example.py
- pyglet_example.py
Suche Aufträge!
chris@chrisarndt.de 0176-28259175