예제 #1
0
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!)")