pilas.actores.dialogo

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

# Source Code for Module pilas.actores.dialogo

      1  # -*- encoding: utf-8 -*-
      2  # Pilas engine - A video game framework.
      3  #
      4  # Copyright 2010 - Hugo Ruscitti
      5  # License: LGPLv3 (see http://www.gnu.org/licenses/lgpl.html)
      6  #
      7  # Website - http://www.pilas-engine.com.ar
      8
      9  import pilas
     10
     11 -class Dialogo:
     12      """
     13          Representa una secuencia de mensajes entre varios actores.
     14
     15          >>> mono = pilas.actores.Mono()
     16          >>> mono2 = pilas.actores.Mono()
     17          >>> dialogo = pilas.actores.Dialogo()
     18          >>> dialogo.decir(mono, "Hola Mundo")
     19          >>> dialogo.decir(mono2, "Estoy diciendo algo")
     20          >>> dialogo.iniciar()
     21
     22          .. image:: images/actores/mono_dice.png
     23
     24
     25      """
     26
     27 -    def __init__(self, modo_automatico=True):
     28          """ Constructor del Diálogo
     29
     30          :param modo_automatico: Establece si el dialogo ira cambiando automatiamente.
     31          :type modo_automatico: boolean
     32          """
     33          self.dialogo = []
     34          self.dialogo_actual = None
     35          self.modo_automatico = modo_automatico
     36
     37 -    def decir(self, actor, texto):
     38          """ Añade un texto a la conversación y establece el actor que lo dice.
     39
     40          :param actor: Actor que dirá el texto.
     41          :type actor: Actor
     42          :param texto: Texto que dirá el actor.
     43          :type texto: string
     44          """
     45          self.dialogo.append((actor, texto))
     46
     47 -    def decir_inmediatamente(self, actor, texto):
     48          """ Muestra un texto de dialogo inmediatamente sin seguir una secuencia de dialogo.
     49
     50          :param actor: Actor que dirá el texto.
     51          :type actor: Actor
     52          :param texto: Texto que dirá el actor.
     53          :type texto: string
     54          """
     55          self.dialogo = []
     56          self._eliminar_dialogo_actual()
     57          self.decir(actor, texto)
     58          siguiente = self.obtener_siguiente_dialogo_o_funcion()
     59          self._mostrar_o_ejecutar_siguiente(siguiente)
     60
     61 -    def elegir(self, actor, texto, opciones, funcion_a_invocar):
     62          """ Muestra un texto de dialogo con una lista de opciones para poder seleccionar y ejecutar una accion cuando se seleccione una de las opciones del cuadro de dialogo.
     63
     64          :param actor: Actor que dirá el texto.
     65          :type actor: Actor
     66          :param texto: Texto que aparecerá en la parte superior del dialogo de opciones.
     67          :type texto: string
     68          :param opciones: Array de posibles opciones que mostrará el cuadrio de dialogo.
     69          :type opciones: Array
     70          :param funcion_a_invocar: Método al que se llamará cuando se seleccione una de las opciones del listado. Este metodo recibirá como parámetro la opción que se haya seleccinado.
     71
     72          >>> def cuando_responde_color_favorito(respuesta):
     73          >>>    colores = {
     74          >>>               'rojo': pilas.colores.rojo,
     75          >>>               'verde': pilas.colores.verde,
     76          >>>               'azul': pilas.colores.azul,
     77          >>>              }
     78          >>>
     79          >>>    pilas.fondos.Color(colores[respuesta])
     80          >>>    mono.sonreir()
     81          >>>    d.decir(mono, '¡mira!')
     82          >>>
     83          >>> d.elegir(mono_chiquito, 'Mi color favorito es el...', ['rojo', 'verde', 'azul'], cuando_responde_color_favorito)
     84
     85          """
     86          self.dialogo.append((actor, texto, opciones, funcion_a_invocar))
     87
     88 -    def ejecutar(self, funcion):
     89          self.dialogo.append(funcion)
     90
     91 -    def iniciar(self):
     92          """ Inicia el dialogo que se haya definido.
     93
     94              >>> d = pilas.actores.Dialogo()
     95              >>> d.decir(mono, "¿Cual es tu color favorito?")
     96              >>> d.iniciar()
     97
     98          """
     99          self.avanzar_al_siguiente_dialogo()
    100
    101 -    def obtener_siguiente_dialogo_o_funcion(self):
    102          if self.dialogo:
    103              return self.dialogo.pop(0)
    104
    105 -    def _eliminar_dialogo_actual(self):
    106          if self.dialogo_actual:
    107              self.dialogo_actual.eliminar()
    108              self.dialogo_actual = None
    109
    110 -    def _mostrar_o_ejecutar_siguiente(self, siguiente):
    111          if isinstance(siguiente, tuple):
    112              # Es un mensaje de dialogo simple
    113              if len(siguiente) == 2:
    114                  actor, texto = siguiente
    115                  self.dialogo_actual = pilas.actores.Globo(texto, dialogo=self, avance_con_clicks=self.modo_automatico)
    116              else:
    117                  # Es un mensaje con seleccion.
    118                  actor, texto, opciones, funcion_a_invocar = siguiente
    119                  self.dialogo_actual = pilas.actores.GloboElegir(texto, opciones, funcion_a_invocar, dialogo=self)
    120
    121              self.dialogo_actual.colocar_origen_del_globo(actor.x, actor.arriba)
    122          else:
    123              siguiente()
    124              self.avanzar_al_siguiente_dialogo()
    125
    126 -    def avanzar_al_siguiente_dialogo(self, evento=None):
    127          self._eliminar_dialogo_actual()
    128          siguiente = self.obtener_siguiente_dialogo_o_funcion()
    129
    130          if siguiente:
    131              self._mostrar_o_ejecutar_siguiente(siguiente)
    132          else:
    133              return False
    134
    135          return True
    136