def set_leccion(self):
     ''' Setea el texto en el libro. '''
     renglones = self.book.lectura.split("\n")
     label_renglones = []
     for renglon in renglones:
         label = JAMLabel(renglon)
         label.set_text(tamanio=30, color=VG.get_negro())
         label_renglones.append(label)
     self.set_posicion_renglones(label_renglones)
	def setup(self):
		''' Configura los objetos. '''
		if not self.widgets:
			self.widgets = pygame.sprite.OrderedUpdates()
		if not self.reloj:
			self.reloj = pygame.time.Clock()
		if not self.fondo:
			self.fondo = self.get_fondo(color= VG.get_negro(), tamanio=self.resolucion) # superficie
		if not self.etiqueta:
			self.etiqueta = JAMLabel (texto="Cargando %s" % (self.juego.name))
			self.etiqueta.set_text(tamanio= 50, color= VG.get_blanco())
		if not self.posicion_label:
			self.posicion_label = (self.resolucion[0]/2 - self.etiqueta.rect.w/2, self.resolucion[1]/2 - self.etiqueta.rect.h/2)
		self.etiqueta.set_posicion(punto= self.posicion_label)
		if not self.etiqueta in self.widgets.sprites():
			self.widgets.add(self.etiqueta)
示例#3
0
    def __init__(self, texto, imagen, tipo="rectangulo"):

        pygame.sprite.Sprite.__init__(self)

        self.image = None
        self.rect = None
        self.posicion = (0, 0)
        self.select = False
        self.sonido_select = VG.get_sound_select()
        self.callback = None
        self.alineacion = "centro"
        self.tipo = tipo

        vals = VG.get_default_jambutton_values()
        COLORCARA, COLORBAS, COLORBOR, GROSORBOR, DETALLE, ESPESOR = vals

        self.base = {
            "tamanio": None,
            "colorbas": COLORBAS,
            "colorbor": COLORBOR,
            "grosorbor": GROSORBOR,
            "detalle": DETALLE,
            "espesor": ESPESOR
        }
        self.cara = {"tamanio": None, "color": COLORCARA}
        self.borde_label = {"grosor": 0, "color": VG.get_negro()}

        self.etiqueta_unselect = JAMLabel(texto)
        self.etiqueta_unselect.set_contenedor(colorbas=self.cara["color"])
        self.etiqueta_select = JAMLabel(texto)
        self.etiqueta_select.set_contenedor(colorbas=self.base["colorbor"])

        self.JAMObjects = {
            "JAMLabelunselect": self.etiqueta_unselect,
            "JAMLabelselect": self.etiqueta_select,
            "Base": self.base,
            "Cara": self.cara,
            "Borde": self.borde_label
        }

        self.imagen_cara_unselect = None
        self.imagen_cara_select = None
        self.final_unselect = None
        self.final_select = None

        self.Reconstruye_JAMButton(["texto"])
 def get_label(self):
     ''' Construye y Devuelve JAMLabel. '''
     label = JAMLabel(self.mensaje)
     label.set_text(tipo=None, tamanio=50, color=None, texto=None)
     label.set_contenedor(colorbas=self.colores["base"],
                          grosor=None,
                          colorbor=None)
     return label
    def Reconstruye_JAMEntryText(self, cambios):
        if "todo" in cambios:
            self.label_buffer = JAMLabel(self.buffertext)
            self.label_promp = Promp(self)
            self.frame.image = self.get_base()
            self.frame.rect = self.frame.image.get_rect()
            self.add(self.frame)
            self.add(self.label_buffer)
            self.add(self.label_promp)
            self.set_posicion(punto=self.posicion)

        if "colores" in cambios:
            self.label_promp.Reconstruye_Promp(["todo"])
            self.frame.image = self.get_base()
            self.frame.rect = self.frame.image.get_rect()
            self.set_posicion(punto=self.posicion)

        if "buffer" in cambios:
            self.frame.image = self.get_base()
            self.frame.rect = self.frame.image.get_rect()
            self.set_posicion(punto=self.posicion)
示例#6
0
class JAMButton(pygame.sprite.Sprite):

    def __init__(self, texto, imagen, tipo="rectangulo"):

        pygame.sprite.Sprite.__init__(self)

        self.image = None
        self.rect = None
        self.posicion = (0, 0)
        self.select = False
        self.sonido_select = VG.get_sound_select()
        self.callback = None
        self.alineacion = "centro"
        self.tipo = tipo

        vals = VG.get_default_jambutton_values()
        COLORCARA, COLORBAS, COLORBOR, GROSORBOR, DETALLE, ESPESOR = vals

        self.base = {
            "tamanio": None, "colorbas": COLORBAS,
            "colorbor": COLORBOR, "grosorbor": GROSORBOR,
            "detalle": DETALLE, "espesor": ESPESOR}
        self.cara = {"tamanio": None, "color": COLORCARA}
        self.borde_label = {"grosor": 0, "color": VG.get_negro()}

        self.etiqueta_unselect = JAMLabel(texto)
        self.etiqueta_unselect.set_contenedor(colorbas=self.cara["color"])
        self.etiqueta_select = JAMLabel(texto)
        self.etiqueta_select.set_contenedor(colorbas=self.base["colorbor"])

        self.JAMObjects = {
            "JAMLabelunselect": self.etiqueta_unselect,
            "JAMLabelselect": self.etiqueta_select,
            "Base": self.base, "Cara": self.cara,
            "Borde": self.borde_label}

        self.imagen_cara_unselect = None
        self.imagen_cara_select = None
        self.final_unselect = None
        self.final_select = None

        self.Reconstruye_JAMButton(["texto"])

    # ---------- SETEOS Y GET GENERALES ---------- #
    def get_text(self):
        """
        Devuelve la cadena de Texto en JAMLabel.
        """
        return self.etiqueta_unselect.get_text()

    def set_tipo(self, tipo):
        """
        Setea el tipo de botón "elipse" o "rectangulo".
        """
        if tipo and tipo != self.tipo and (
            tipo == "elipse" or tipo == "rectangulo"):
            self.tipo = tipo
            self.Reconstruye_JAMButton(["texto"])

    def get_posicion(self):
        """
        Devuelve la posición actual.
        """
        return self.posicion

    # ---------- SETEOS SOBRE LA ETIQUETA ---------- #
    def set_text(self, tipo=None, tamanio=None, color=None, texto=None):
        """
        Setea el Texto en JAMLabel.
        """
        self.etiqueta_unselect.set_text(tipo=tipo,
            tamanio=tamanio, color=color, texto=texto)
        self.etiqueta_select.set_text(tipo=tipo,
            tamanio=tamanio, color=color, texto=texto)
        self.Reconstruye_JAMButton(["texto"])

    def set_font_from_file(self, direccion_archivo, tamanio=None):
        """
        Setea la fuente desde un archivo en JAMLabel.
        """
        self.etiqueta_unselect.set_font_from_file(direccion_archivo, tamanio)
        self.etiqueta_select.set_font_from_file(direccion_archivo, tamanio)
        self.Reconstruye_JAMButton(["texto"])

    def set_imagen(self, origen=None, tamanio=None):
        """
        Setea el Imagen en JAMLabel.
        """
        self.etiqueta_unselect.set_imagen(origen=origen, tamanio=tamanio)
        self.etiqueta_select.set_imagen(origen=origen, tamanio=tamanio)
        self.Reconstruye_JAMButton(["imagen"])
    # ---------- SETEOS SOBRE LA ETIQUETA ---------- #

    # ---------- SETEOS SOBRE LA BASE ---------- #
    def set_tamanios(self, tamanio=None, grosorbor=None,
        detalle=None, espesor=None):
        cambios = False
        # desactivar tamaños
        if tamanio == -1 and tamanio != None:
            tamanio = None
            self.base["tamanio"] = None
            cambios = True
        if grosorbor == -1 and grosorbor != None:
            grosorbor = None
            self.base["grosorbor"] = 1
            cambios = True
        if detalle == -1 and detalle != None:
            detalle = None
            self.base["detalle"] = 1
            cambios = True
        if espesor == -1 and espesor != None:
            espesor = None
            self.base["espesor"] = 1
            cambios = True

        # establecer tamaños
        if tamanio and tamanio != self.base["tamanio"]:
            self.base["tamanio"] = tamanio
            cambios = True
        if grosorbor and grosorbor != self.base["grosorbor"]:
            self.base["grosorbor"] = grosorbor
            cambios = True
        if detalle and detalle != self.base["detalle"]:
            self.base["detalle"] = detalle
            cambios = True
        if espesor and espesor != self.base["espesor"]:
            self.base["espesor"] = espesor
            cambios = True

        if cambios:
            self.Reconstruye_JAMButton(["tamanio"])

    def set_colores(self, colorbas=None, colorbor=None, colorcara=None):
        """
        Setea los colores del botón y la etiqueta.
        """
        cambios = False
        if colorbas and colorbas != self.base["colorbas"]:
            self.base["colorbas"] = colorbas
            cambios = True
        if colorbor and colorbor != self.base["colorbor"]:
            self.base["colorbor"] = colorbor
            cambios = True
        if colorcara and colorcara != self.cara["color"]:
            self.cara["color"] = colorcara
            cambios = True

        if cambios:
            self.etiqueta_unselect.set_contenedor(
                colorbas=self.cara["color"])
            self.etiqueta_select.set_contenedor(
                colorbas=self.base["colorbor"])
            self.Reconstruye_JAMButton(["colores"])

    def set_borde_label(self, grosor=None, color=None):
        """
        Agrega o quita un borde sobre la cara de JAMButton.
        """
        cambios = False
        if grosor < 1 and grosor != self.borde_label["grosor"]:
            grosor = None
            cambios = True
        if grosor and grosor != self.borde_label["grosor"]:
            self.borde_label["grosor"] = grosor
            cambios = True
        if color and color != self.borde_label["color"]:
            self.borde_label["color"] = color
            cambios = True

        if cambios:
            self.Reconstruye_JAMButton(["borde"])

    def set_alineacion_label(self, alineacion):
        """
        Setea la alineacion de JAMLabel sobre la cara de JAMButton.
        """
        if alineacion == "centro" or alineacion == "izquierda" or \
            alineacion == "derecha":
            self.alineacion = alineacion
            self.Reconstruye_JAMButton(["alineacion"])
    # ---------- SETEOS SOBRE LA BASE ---------- #

    def connect(self, callback=None, sonido_select=None):
        """
        Conecta el botón a una función y un sonido para reproducir al
        hacer click sobre JAMButton.
        """
        self.callback = callback
        self.sonido_select = sonido_select
        # debes pasar una referencia al audio ya cargado para no cargarlo
        # cada vez que creas un botón

    def set_posicion(self, punto=None):
        """
        Setea la posición de JAMButton en la pantalla.
        """
        try:
            if punto:
                self.rect.x, self.rect.y = (punto)
                self.posicion = punto
        except:
            pass

    # ------------- GETS ------------------------
    def get_tamanio(self):
        return (self.rect.w, self.rect.h)

    # ----------- CONSTRUCCION -------------------
    def Reconstruye_JAMButton(self, cambios):
        """
        Cada vez que se setea algo, se reconstruye JAMButton
        con sus nuevos valores.
        """
        if "tamanio" in cambios:
            # reconstruye la cara en base a la etiqueta
            self.cara["tamanio"] = None
            dat = self.construye_cara()
            self.imagen_cara_unselect, self.imagen_cara_select = dat

            # verifica tamaño minimo para la base según la cara reconstruida
            anchominimo, altominimo = self.get_minimo_tamanio_base()
            if not self.base["tamanio"]:
                self.base["tamanio"] = (anchominimo, altominimo)
            ancho, alto = self.base["tamanio"]
            if anchominimo > ancho:
                ancho = anchominimo
            if altominimo > alto:
                alto = altominimo

            # Establece los nuevos tamaños
            self.base["tamanio"] = (ancho, alto)
            self.cara["tamanio"] = self.get_tamanio_cara_recalculado()

        dat = self.construye_cara()
        self.imagen_cara_unselect, self.imagen_cara_select = dat
        self.final_unselect, self.final_select = self.construye_boton()

        self.image = self.final_unselect
        self.rect = self.image.get_rect()

        self.set_posicion(self.posicion)

    def get_minimo_tamanio_base(self):
        """
        Devuelve el tamaño mínimo que puede tener la base del botón.
        """
        x = self.base["grosorbor"] + int(self.base["espesor"] / 3)
        ancho = x + self.cara["tamanio"][0] + self.base[
            "espesor"] + self.base["grosorbor"]
        y = self.base["grosorbor"] + int(self.base["espesor"] / 3)
        alto = y + self.cara["tamanio"][1] + self.base[
            "espesor"] + self.base["grosorbor"]
        return (ancho, alto)

    def get_tamanio_cara_recalculado(self):
        """
        Devuelve el tamaño que debe tener la cara luego de seteados los
        tamaños del JAMButton.
        """
        tamanio = (0, 0)
        if self.tipo == "elipse":
            (xx, yy, ss, zz) = self.etiqueta_unselect.rect
            x = self.base["grosorbor"] + int(self.base["espesor"] / 3) + zz / 2
            ancho = x + self.base["espesor"] + self.base["grosorbor"] + zz / 2
            y = self.base["grosorbor"] + int(self.base["espesor"] / 3) + zz / 2
            alto = y + self.base["espesor"] + self.base["grosorbor"] + zz / 2
            a, h = self.base["tamanio"]
            tamanio = (a - ancho, h - alto)
        else:
            x = self.base["grosorbor"] + int(self.base["espesor"] / 3)
            ancho = x + self.base["espesor"] + self.base["grosorbor"]
            y = self.base["grosorbor"] + int(self.base["espesor"] / 3)
            alto = y + self.base["espesor"] + self.base["grosorbor"]
            a, h = self.base["tamanio"]
            tamanio = (a - ancho, h - alto)
        return tamanio

    def construye_cara(self):
        """
        Crea la cara del botón y pega centrado en ella el JAMLabel.
        """
        unselect, select = (None, None)
        if self.tipo == "elipse":
            w, h = (0, 0)
            # toma tamaño de etiqueta como referencia
            if not self.cara["tamanio"]:
                w = self.etiqueta_unselect.rect.w + self.base[
                    "detalle"] + self.etiqueta_unselect.rect.h
                h = self.etiqueta_unselect.rect.h + self.base[
                    "detalle"] + self.etiqueta_unselect.rect.h
                self.cara["tamanio"] = (w, h)
            # la cara nunca puede ser menor que la etiqueta pero si mayor
            if self.cara["tamanio"] and self.cara[
                "tamanio"][0] < self.etiqueta_unselect.rect.w + self.base[
                "detalle"] + self.etiqueta_unselect.rect.h:
                w = self.etiqueta_unselect.rect.w + self.base[
                    "detalle"] + self.etiqueta_unselect.rect.h
                self.cara["tamanio"] = (w, h)
            if self.cara["tamanio"] and self.cara[
                "tamanio"][1] < self.etiqueta_unselect.rect.h + self.base[
                "detalle"] + self.etiqueta_unselect.rect.h:
                h = self.etiqueta_unselect.rect.h + self.base[
                    "detalle"] + self.etiqueta_unselect.rect.h
                self.cara["tamanio"] = (w, h)
            unselect = VG.get_Elipse(self.cara["color"], self.cara["tamanio"])
            select = VG.get_Elipse(self.base["colorbor"], self.cara["tamanio"])

            # alineación desabilitada por bug
            self.alineacion = "centro"
            unselect = VG.pegar_imagenes_centradas(
                self.etiqueta_unselect.image, unselect)
            select = VG.pegar_imagenes_centradas(
                self.etiqueta_select.image, select)
        else:
            w, h = (0, 0)
            # toma tamaño de etiqueta como referencia
            if not self.cara["tamanio"]:
                w = self.etiqueta_unselect.rect[2] + self.base["detalle"]
                h = self.etiqueta_unselect.rect[3] + self.base["detalle"]
                self.cara["tamanio"] = (w, h)
            # la cara nunca puede ser menor que la etiqueta pero si mayor
            if self.cara["tamanio"] and self.cara[
                "tamanio"][0] < self.etiqueta_unselect.rect[
                2] + self.base["detalle"]:
                w = self.etiqueta_unselect.rect[2] + self.base["detalle"]
                self.cara["tamanio"] = (w, h)
            if self.cara["tamanio"] and self.cara[
                "tamanio"][1] < self.etiqueta_unselect.rect[
                3] + self.base["detalle"]:
                h = self.etiqueta_unselect.rect[3] + self.base["detalle"]
                self.cara["tamanio"] = (w, h)
            unselect = VG.get_Rectangulo(
                self.cara["color"], self.cara["tamanio"])
            select = VG.get_Rectangulo(
                self.base["colorbor"], self.cara["tamanio"])

            if self.alineacion == "centro":
                unselect = VG.pegar_imagenes_centradas(
                    self.etiqueta_unselect.image, unselect)
                select = VG.pegar_imagenes_centradas(
                    self.etiqueta_select.image, select)
            elif self.alineacion == "izquierda":
                unselect = VG.pegar_imagenes_alineado_izquierda(
                    self.etiqueta_unselect.image, unselect)
                select = VG.pegar_imagenes_alineado_izquierda(
                    self.etiqueta_select.image, select)
            elif self.alineacion == "derecha":
                unselect = VG.pegar_imagenes_alineado_derecha(
                    self.etiqueta_unselect.image, unselect)
                select = VG.pegar_imagenes_alineado_derecha(
                    self.etiqueta_select.image, select)
            else:
                self.alineacion = "centro"
                unselect = VG.pegar_imagenes_centradas(
                    self.etiqueta_unselect.image, unselect)
                select = VG.pegar_imagenes_centradas(
                    self.etiqueta_select.image, select)

        if self.borde_label["grosor"] > 1 and self.borde_label[
            "grosor"] != None:
            if not self.borde_label["color"]:
                self.borde_label["color"] = VG.get_negro()
            if self.tipo == "elipse":
                pass
            else:
                unselect = VG.get_my_surface_whit_border(
                    unselect, self.borde_label["color"],
                    self.borde_label["grosor"])
                select = VG.get_my_surface_whit_border(
                    select, self.borde_label["color"],
                    self.borde_label["grosor"])
        return unselect, select

    def construye_boton(self):
        """
        Construye las imagenes finales del botón.
        """
        unselect = None
        select = None
        if self.tipo == "elipse":
            x = self.base["grosorbor"] + int(self.base["espesor"] / 3)
            ancho = x + self.cara["tamanio"][0] + self.base[
                "espesor"] + self.base["grosorbor"]
            y = self.base["grosorbor"] + int(self.base["espesor"] / 3)
            alto = y + self.cara["tamanio"][1] + self.base[
                "espesor"] + self.base["grosorbor"]
            self.base["tamanio"] = (ancho, alto)
            unselect = VG.get_Elipse(self.base[
                "colorbas"], self.base["tamanio"])
            unselect = VG.get_my_surface_whit_elipse_border(
                unselect, self.base["colorbor"], self.base["grosorbor"])
            select = VG.get_Elipse(
                self.base["colorbas"], self.base["tamanio"])
            select = VG.get_my_surface_whit_elipse_border(
                select, self.base["colorbor"], self.base["grosorbor"])
        else:
            x = self.base["grosorbor"] + int(self.base["espesor"] / 3)
            ancho = x + self.cara["tamanio"][0] + self.base[
                "espesor"] + self.base["grosorbor"]
            y = self.base["grosorbor"] + int(self.base["espesor"] / 3)
            alto = y + self.cara["tamanio"][1] + self.base[
                "espesor"] + self.base["grosorbor"]
            self.base["tamanio"] = (ancho, alto)
            unselect = VG.get_Rectangulo(
                self.base["colorbas"], self.base["tamanio"])
            unselect = VG.get_my_surface_whit_border(
                unselect, self.base["colorbor"], self.base["grosorbor"])
            select = VG.get_Rectangulo(
                self.base["colorbas"], self.base["tamanio"])
            select = VG.get_my_surface_whit_border(
                select, self.base["colorbor"], self.base["grosorbor"])

        unselect.blit(self.imagen_cara_unselect, (x, y))
        select.blit(self.imagen_cara_select, (x, y))
        return unselect, select
    # ------------------ FIN DE METODOS DE CONSTRUCCION -------------------- #

    # ---------- INICIO DE METODOS INTERNOS AUTOMÁTICOS -------------------- #
    def update(self):
        """
        responde a los eventos del mouse sobre el sprite.
        """
        eventos_republicar = []
        eventos = pygame.event.get(pygame.MOUSEBUTTONDOWN)
        for event in eventos:
            posicion = event.pos
            if self.rect.collidepoint(posicion):
                # Si el mouse está presionado sobre el botón.
                if  self.callback:
                    # y si además hay callback para esta acción.
                    pygame.event.clear()
                    return self.callback(self)
            else:
                # Si el mouse no está presionado sobre el botón.
                if not event in eventos_republicar:
                    eventos_republicar.append(event)

        eventos = pygame.event.get(pygame.MOUSEMOTION)
        for event in eventos:
            posicion = event.pos
            if self.rect.collidepoint(posicion):
                # Si el mouse está sobre el botón.
                if self.select == False:
                    self.image = self.final_select
                    self.select = True
            else:
                # Si el mouse no está sobre el botón.
                if self.select == True:
                    self.image = self.final_unselect
                    self.select = False
            if not event in eventos_republicar:
                eventos_republicar.append(event)

        for event in eventos_republicar:
            # Se republican todos los eventos que este control no debe manejar.
            pygame.event.post(event)
class JAMatrix():
	''' Main de JAMatrix. '''
	def __init__(self, juego, ventana, resolucion):
		self.juego= juego		# el juego base
		self.ventana= ventana		# la ventana pygame
		self.resolucion= resolucion	# la resolucion de la pantalla

		self.widgets= None		# grupo de terrones
		self.interval= 0		# intervalo para agregar terrones
		self.reloj= None		# pygame.time
		self.fondo= None		# el fondo
		self.etiqueta= None		# el mensaje sobre lo que se está cargando
		self.posicion_label= None	# la posicion de la etiqueta para cambiar el mensaje
		self.imagen_matrix= None 	# pygame.image.load(VG.get_terron())

		try:
			self.imagen_matrix= pygame.image.load(VG.get_terron())
		except:
			pass

		self.callback_handle_event= None
		self.latencia= 10
		self.setup()
		#self.ventana.blit(self.fondo, (0,0))
	
	# -------- SETEOS ----------------------
	def set_imagen_matrix(self, imagen):
		''' Setea una imagen para remplazar terron. '''
		if imagen:
			self.imagen_matrix = pygame.image.load(imagen)
		else:
			self.imagen_matrix= None

	def set_callback_event(self, callback):
		''' Conecta una función para detectar eventos mientras se ejecuta JAMatrix. '''
		self.callback_handle_event= callback
	def set_latencia(self, latencia):
		''' Setea la latencia de generación de terrones. '''
		if type(latencia)== int: self.latencia= latencia
	# -------- SETEOS ----------------------

	def carga_game(self):
		''' Carga este juego en un thread en segundo plano. '''
		thread = threading.Thread( target=self.juego.load )
		thread.start()
		while not self.juego.estado:
			self.run()
		self.unload() # descarga todo lo que puede para liberar memoria

	def unload(self):
		''' Al cambiar el estado del juego porque se han cargado todos sus objetos, se descarga JAMatrix en un thread en segundo plano. '''
		thread = threading.Thread( target=self.descarga_todo )
		thread.start()
		gc.collect()

	def run(self):
		''' JAMatrix corriendo. '''
		self.setup()
		pygame.mouse.set_visible(False)
		self.reloj.tick(35)
		if self.interval == self.latencia:
			self.genera_terrones()
			self.interval = 0
		cambios=[]
		self.widgets.clear(self.ventana, self.fondo)
		self.widgets.update()
		
		cambios.extend ( self.widgets.draw(self.ventana) )
		pygame.display.update(cambios)
		pygame.event.clear()
		#pygame.time.wait(1)
		self.interval += 1

		if self.callback_handle_event:
			return self.callback_handle_event()

	def descarga_todo(self):
		''' Libera memoria. '''
		self.widgets = None
		self.interval = 0
		self.reloj = None
		self.fondo = None
		self.etiqueta = None
		self.posicion_label = None

	def setup(self):
		''' Configura los objetos. '''
		if not self.widgets:
			self.widgets = pygame.sprite.OrderedUpdates()
		if not self.reloj:
			self.reloj = pygame.time.Clock()
		if not self.fondo:
			self.fondo = self.get_fondo(color= VG.get_negro(), tamanio=self.resolucion) # superficie
		if not self.etiqueta:
			self.etiqueta = JAMLabel (texto="Cargando %s" % (self.juego.name))
			self.etiqueta.set_text(tamanio= 50, color= VG.get_blanco())
		if not self.posicion_label:
			self.posicion_label = (self.resolucion[0]/2 - self.etiqueta.rect.w/2, self.resolucion[1]/2 - self.etiqueta.rect.h/2)
		self.etiqueta.set_posicion(punto= self.posicion_label)
		if not self.etiqueta in self.widgets.sprites():
			self.widgets.add(self.etiqueta)

	def get_fondo(self, color=(100,100,100,1), tamanio=(800,600)):
		''' El fondo de la ventana. '''
		superficie = pygame.Surface( tamanio, flags=HWSURFACE )
		superficie.fill(color)
		return superficie

	def genera_terrones(self):
		''' Nace un Terron. '''
		if not self.imagen_matrix: return
		x = random.randrange(0, self.resolucion[0], self.imagen_matrix.get_size()[0])
		terron = Terron(self)
		terron.rect.x, terron.rect.y = (x,-50)
		self.widgets.add(terron)