from kennel.engine.entities.entity import EntityManager from kennel.engine.systems.system import SystemManager from kennel.app import logger from typing import List, Optional import time import asyncio class Game: def __init__( self, entity_manager: EntityManager, system_manager: SystemManager, min_time_step: float, ): self.entity_manager = entity_manager self.system_manager = system_manager self.min_time_step = min_time_step self.last_time = time.time() self.running = False async def update(self, delta_time: float) -> None: self.entity_manager.update() await self.system_manager.update(self.entity_manager, delta_time) async def run(self) -> None: logger.info("Game started") self.running = True self.last_time = time.time() steps_since_log = 0 while self.running: current_time = time.time() if (int(current_time) - int(self.last_time)) == 1 and int( current_time ) % 10 == 0: logger.info(f"Game loop: {steps_since_log} steps since last log time") steps_since_log = 0 delta_time = current_time - self.last_time self.last_time = current_time await self.update(delta_time) sleep_time = max(self.min_time_step - (time.time() - current_time), 0) if sleep_time > 0: await asyncio.sleep(sleep_time) steps_since_log += 1 def stop(self) -> None: self.running = False logger.info("Game stopped")