Timer

Como indicaba Dani en la entrada anterior, la clase Timer no funcionaba como es debido tras la tarde del martes. Esa noche la terminé, utilizando para ello las librerías de python en vez de las de pygame.

Además, añadí la posibilidad de parar y reanudar el reloj, para que en el futuro se pueda implementar la pausa.

Es un código bastante sencillo, aquí lo tenéis:

# $Id: Timer.py 14 2007-11-01 21:07:45Z penyaskito $

import pygame
import time
import ResourceLoader

class Timer(pygame.sprite.Sprite):

    TIME = 60
    
    ESTADO_PARADO = 0
    ESTADO_CORRIENDO = 1
    
    def __init__(self, screen):
        self._posicion = (screen.get_width() / 2 - 20, 10)
        self._screen = screen
        self._inicial = time.time()
        self._estado = self.ESTADO_CORRIENDO
        self._seconds = self.TIME
        self._font = pygame.font.SysFont("Verdana",40)
        
    def update(self, t): 
        s = self._font.render(str("%(var)02d" % {"var":self._seconds}),True,(255,230,50))

        self._screen.blit (s, self._posicion)        
        if self._estado == self.ESTADO_CORRIENDO:
            self._seconds = self.TIME - (time.time() - self._inicial)
        if self._seconds < 0:
            self._seconds = 0
            self._estado = self.ESTADO_PARADO
    
    def get_seconds(self):
        return self._seconds
        
    def pause(self):
        self._estado = self.ESTADO_PARADO
        # almacenamos el instante en el que fue parado.
        self._stopped = time.time()
        
    def resume(self):
        # calcula por donde debe seguir la cuenta.
        self._inicial -= self._stopped - time.time()
        self._estado = self.ESTADO_CORRIENDO

No me acaba de convencer que la clase responsable de llevar el tiempo sea la responsable de pintarlo, pero como decía Dani, ya iremos refinando en el futuro. Recuerda: Commit early. Commit often.

Próximamente, veremos como usar un sistema de eventos en python, de manera que se pueda reducir el acoplamiento entre algunas clases.