pilas.actores.globo

Package pilas :: Package actores :: Module globo |
[hide private]
[frames] | no frames]

# Source Code for Module pilas.actores.globo

      1  # -*- encoding: utf-8 -*-
      2  import pilas
      3  from pilas.actores import Actor
      4
      5 -class Globo(Actor):
      6      """Representa un cuadro de dialogo estilo historietas.
      7
      8      El actor se tiene que inicializar con una cadena de texto:
      9
     10          >>> globo = pilas.actores.Globo("Hola mundo")
     11
     12      .. image:: images/actores/globo.png
     13      """
     14
     15 -    def __init__(self, texto, x=0, y=0, dialogo=None, avance_con_clicks=True, autoeliminar=False, ancho_globo=0, alto_globo=0):
     16          """ Constructor del Globo
     17
     18          :param texto: Texto a mostrar en el globo.
     19          :type texto: boolean
     20          :param x: posicion horizontal del globo.
     21          :type x: int
     22          :param y: posicion vertical del globo.
     23          :type y: int
     24          :param dialogo: Dialogo que contiene las frases a mostrar en el globo.
     25          :type dialogo: Dialogo
     26          :param avance_con_clicks: Permite avanzar el dialogo pulsando el ratón.
     27          :type avance_con_clicks: boolean
     28          :param autoeliminar: Indica si se desea eliminar el globo cuando pasen 3 segundos.
     29          :type autoeliminar: boolean
     30          :param ancho_globo: Estabece el ancho del globo en pixeles.
     31          :type ancho_globo: int
     32          :param alto_globo: Estabece el alto del globo en pixeles.
     33          :type alto_globo: int
     34
     35          """
     36          self.dialogo = dialogo
     37          Actor.__init__(self, imagen='invisible.png', x=x, y=y)
     38
     39          ancho, alto = pilas.utils.obtener_area_de_texto(texto)
     40
     41          # Podemos pasar el ancho del globo ya que si contiene opciones
     42          # cuyo texto es más largo que la cabecera del globo, no queda bien.
     43          if ancho_globo == 0:
     44              ancho = int((ancho + 12) - (ancho % 12))
     45          else:
     46              if ancho_globo > ancho:
     47                  ancho = ancho_globo
     48              else:
     49                  ancho = int((ancho + 12) - (ancho % 12))
     50
     51          # Lo mismo para el alto
     52          if alto_globo == 0:
     53              alto = int((alto + 12) - alto % 12)
     54          else:
     55              alto = alto + alto_globo
     56
     57          self.imagen = pilas.imagenes.cargar_superficie(ancho + 36, alto + 24 + 35)
     58
     59          self._pintar_globo(ancho, alto)
     60          self.imagen.texto(texto, 17, 30)
     61          self.centro = ("derecha", "abajo")
     62          self.escala = 0.1
     63          self.escala = [1], 0.2
     64
     65          self.ancho_globo = ancho
     66          self.alto_globo = alto
     67
     68          if avance_con_clicks:
     69              self.escena.click_de_mouse.conectar(self.cuando_quieren_avanzar)
     70
     71          if autoeliminar:
     72              pilas.escena_actual().tareas.una_vez(3, self.eliminar)
     73
     74 -    def colocar_origen_del_globo(self, x, y):
     75          """ Cambia la posicion del globo para que el punto de donde se emite el globo sea (x, y).
     76
     77          :param x: Posición horizontal del globo.
     78          :type x: int
     79          :param y: Posición vertical del globo.
     80          :type y: int
     81          """
     82          self.x = x
     83          self.y = y
     84
     85 -    def cuando_quieren_avanzar(self, *k):
     86          "Función que se ejecuta al hacer click para avanzar o eliminar el globo."
     87          if self.dialogo:
     88              self.dialogo.avanzar_al_siguiente_dialogo()
     89          else:
     90              self.eliminar()
     91
     92 -    def _pintar_globo(self, ancho, alto):
     93          imagen = pilas.imagenes.cargar("globo.png")
     94
     95          # esquina sup-izq
     96          self.imagen.pintar_parte_de_imagen(imagen, 0, 0, 12, 12, 0, 0)
     97
     98          # borde superior
     99          for x in range(0, int(ancho) + 12, 12):
    100              self.imagen.pintar_parte_de_imagen(imagen, 12, 0, 12, 12, 12 + x, 0)
    101
    102           # esquina sup-der
    103          self.imagen.pintar_parte_de_imagen(imagen, 100, 0, 12, 12, 12 + int(ancho) + 12, 0)
    104
    105          # centro del dialogo
    106          for y in range(0, int(alto) + 12, 12):
    107              # borde izquierdo
    108              self.imagen.pintar_parte_de_imagen(imagen, 0, 12, 12, 12, 0, 12 + y)
    109              # linea horizontal blanca, para el centro del dialogo.
    110              for x in range(0, int(ancho) + 12, 12):
    111                  self.imagen.pintar_parte_de_imagen(imagen, 12, 12, 12, 12, 12 + x, 12 + y)
    112
    113              # borde derecho
    114              self.imagen.pintar_parte_de_imagen(imagen, 100, 12, 12, 12, 12 + int(ancho) + 12, 12 + y)
    115
    116          # parte inferior
    117          self.imagen.pintar_parte_de_imagen(imagen, 0, 35, 12, 12, 0, 0 + int(alto) + 12 + 12)
    118
    119          # linea horizontal de la parte inferior
    120          for x in range(0, int(ancho) + 12, 12):
    121              self.imagen.pintar_parte_de_imagen(imagen, 12, 35, 12, 12, 12 + x, 0 + int(alto) + 12 + 12)
    122
    123          self.imagen.pintar_parte_de_imagen(imagen, 100, 35, 12, 12, 12 + int(ancho) + 12, 0 + int(alto) + 12 + 12)
    124          # Pico de la parte de abajo
    125          self.imagen.pintar_parte_de_imagen(imagen, 67, 35, 33, 25, int(ancho) - 12, 0 + int(alto) + 12 + 12)
    126
    127 -    def eliminar(self):
    128          Actor.eliminar(self)
    129