class World: def __init__(self): self._em = EventManager() self._entities = [] self._systems = {} # Maps system type to system itself. self._time = 0 def addEntity(self, entity, delayEvent = False): """Adds a new entity to the world. Unless explicitly asked to do so through delayEvent, an event is generated. It is useful to delay event signalling if some preprocessing on the entity is required.""" self._entities.append(entity) for _, system in self._systems.items(): if system.applicable(entity): system.addEntity(entity) if not delayEvent: self.throwEntityCreatedEvent(entity) def entityUpdatedComponents(self, entity, oldComponentTypeList): """The method takes the old components of the entity, and the entity with components removed/added. It will update systems.""" for _, system in self._systems.items(): if (system.applicable(entity) and not system.applicableComponents(oldComponentTypeList)): system.addEntity(entity) elif (not system.applicable(entity) and system.applicableComponents(oldComponentTypeList)): system.removeEntity(entity) def throwEntityCreatedEvent(self, entity): """Signals that entity has been created.""" event = Event(self._time, Event.ENTITY_ADDED) event.entity = entity self._em.handleEvent(event) def removeEntity(self, entity): self._entities.remove(entity) for _, system in self._systems.items(): if system.applicable(entity): system.removeEntity(entity) event = Event(self._time, Event.ENTITY_REMOVED) event.entity = entity entity._em.handleEvent(event) self._em.handleEvent(event) def addSystem(self, system): self._systems[type(system)] = system def removeSystem(self, system): del self._systems[type(system)] def tick(self, dt): self._time = self._time + dt for system in self._systems.values(): system.tick(dt)