예제 #1
0
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)
예제 #2
0
 def __init__(self):
   self._em = EventManager()
   self._entities = []
   self._systems = {} # Maps system type to system itself.
   self._time = 0