class Engine(object): """Main game object. F**k yeah.""" _view_controller = None def __init__(self): self._l = StdoutLogger() self._l.log("Creating engine...") self.printed = 0 self._mm = BitmapManager("maps", self._l) self._fm = FontManager(self._l) self._size = 640, 480 self._dc = DrawContext(self._size[0], self._size[1]) self._dc.mm = self._mm self._dc.fm = self._fm self._last_render = self._get_tick() self._quit = 0 self._zbuffer = [0 for _ in range((self._size[0] * self._size[1]))] self._view = None def _get_tick(self): microseconds = datetime.datetime.now().microsecond seconds = datetime.datetime.now().second return seconds * 1000 + microseconds / 1000 def _process_event(self, e): if e.type == pygame.QUIT: self._quit = 1 if self._view: self._view.process_event(e, (0, 0)) def _render(self, dt): self._dc.screen.fill((0, 0, 0)) if self._view != None: self._view.render(dt, self._dc, (0, 0)) fps_text = "%02i fps" % (1000.0 / dt) fps = self._fm.render_font("lucidaconsole", 12, fps_text, (255, 255, 255)) fps_pos = fps.get_rect(top=5, left=5) self._dc.screen.blit(fps, fps_pos) def push_view(self, view): self._view = view def quit(self): self._quit = 1 def start(self): self._l.log("Starting engine...") self._dc.start() #loop da loop while not self._quit: for event in pygame.event.get(): self._process_event(event) #limit to 60 fps because this is ghey time.sleep(1/60.0) new_render = self._get_tick() delta = new_render - self._last_render if self._view_controller: self._view_controller.tick(delta) self._render(delta) self._dc.flip() self._last_render = new_render self._l.log("Exiting gracefully... (woohoo!)")