Ejemplo n.º 1
0
    def run(self, text_content = None, duration = 5, vsync_value = None, scale_refObj = None):
        if not text_content is None:
            self.text_content = text_content
        if vsync_value is None:
            vsync_value = self.vsync_value

        duration *= 1e3 #convert to milliseconds

        t0 = pygame.time.get_ticks()
        t  = pygame.time.get_ticks()
        is_running = True

        #render textSurface
        self.textSurface = self.render_surface(self.text_content, self.font_size)

        # check if we are scaling size to match other TextDisplay obj's last run() and scale textSurface if needed
        if not scale_refObj is None:
            ref_surface = scale_refObj.render_surface(scale_refObj.text_content, scale_refObj.font_size)
            width_scale = float(ref_surface.get_width()) / float(self.textSurface.get_width())
            height_scale = float(ref_surface.get_height()) / float(self.textSurface.get_height())
            self.textSurface = pygame.transform.scale(self.textSurface, (int(width_scale * self.textSurface.get_width()), int(height_scale * self.textSurface.get_height())))

        #set background color
        gl.glClearColor(self.screen_bgColor[0], self.screen_bgColor[1], self.screen_bgColor[2], 1.0)

        #prepare some values for rendering centered text
        centerOffset_pixels = [-self.textSurface.get_width()/2, -self.textSurface.get_height()/2]
        raster_position = self.get_coords(*centerOffset_pixels)
        textData = pygame.image.tostring(self.textSurface, "RGBA", True)

        while is_running:
            #prepare rendering model
            gl.glClear(gl.GL_COLOR_BUFFER_BIT)
            gl.glMatrixMode(gl.GL_MODELVIEW)
            gl.glLoadIdentity()

            #render text
            gl.glRasterPos2d(*raster_position)
            gl.glDrawPixels(self.textSurface.get_width(), self.textSurface.get_height(), gl.GL_RGBA, gl.GL_UNSIGNED_BYTE, textData)

            #render the vsync patch
            self.vsync_patch.render(value = vsync_value)

            #show the scene
            pygame.display.flip()

            #handle outstanding events
            is_running = self.handle_events()

            dt = self.clock.tick_busy_loop(self.render_loop_rate) #more accurate than tick, but uses more CPU resources
            t  = pygame.time.get_ticks()

            if t - t0 > duration:
                is_running = False
Ejemplo n.º 2
0
    def render(self):
        #this will draw background and vsync_patch
        Screen.render(self)
        
        # get file path for font file if it was specified
        font_path = None
        if self.font_type is None:
            font_path = self.font_type
        else:
            font_path = resources.get_fontpath(self.font_type)

        #render textSurface from text_content
        self.font = pygame.font.Font(font_path, self.font_size)
        rgb    = [int(c*255) for c in self.text_color]
        rgb_bg = [int(c*255) for c in self.text_bgColor]
        self.textSurface = self.font.render(self.text_content, 1, rgb, rgb_bg)

        #Scaling font; attempting to render text that is too wide/tall sets the raster position off screen and nothing is rendered
        if self.textSurface.get_width() > self.screen_width:
            percent_scale = float(self.screen_width) / self.textSurface.get_width()
            self.font = pygame.font.Font(font_path, int(font_size * percent_scale))
            self.textSurface = self.font.render(text_content, 1, rgb, rgb_bg)
            print("'", text_content, "' is too wide for screen; scaling to fit")

        if self.textSurface.get_height() > self.screen_height:
            percent_scale = float(self.screen_height) / self.textSurface.get_height()
            self.font = pygame.font.Font(font_path, int(font_size * percent_scale))
            self.textSurface = self.font.render(text_content, 1, rgb, rgb_bg)
            print("'", text_content, "' is too tall for screen; scaling to fit")
            
        #prepare some values for rendering centered text
        centerOffset_pixels = [-self.textSurface.get_width()/2, -self.textSurface.get_height()/2]
        raster_position = self.get_coords(*centerOffset_pixels)
        textData = pygame.image.tostring(self.textSurface, "RGBA", True)
        
        #render text
        gl.glRasterPos2d(*raster_position)
        gl.glDrawPixels(self.textSurface.get_width(), self.textSurface.get_height(), gl.GL_RGBA, gl.GL_UNSIGNED_BYTE, textData)
        
        # check if we are scaling size to match other TextDisplay obj's last run() and scale textSurface if needed
        if not self.scale_refObj is None:
            ref_surface = scale_refObj.render_surface(scale_refObj.text_content, scale_refObj.font_size)
            width_scale = float(ref_surface.get_width()) / float(self.textSurface.get_width())
            height_scale = float(ref_surface.get_height()) / float(self.textSurface.get_height())
            new_width  = int(width_scale * self.textSurface.get_width())
            new_height = int(height_scale * self.textSurface.get_height())
            self.textSurface = pygame.transform.scale(self.textSurface, (new_width,new_height))