pilas.control

Package pilas :: Module control |
[hide private]
[frames] | no frames]

# Source Code for Module pilas.control

      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  from pilas.simbolos import *
     11
     12  __doc__ = """
     13  Módulo pilas.control
     14  ====================
     15
     16  """
     17
     18 -class Control(object):
     19      """Representa un control de teclado sencillo.
     20
     21      Este objeto permite acceder al estado del teclado usando
     22      atributos.
     23
     24      Por ejemplo, con este objeto, para saber si el usuario
     25      está pulsando el direccional hacia la izquierda de
     26      puedes ejecutar::
     27
     28          if pilas.escena_actual().control.izquierda:
     29              print 'Ha pulsado hacia la izquierda'
     30
     31      Es decir, si bien Control es una clase, no hace falta
     32      instanciarla. Ya existe un objeto que se puede consultar
     33      bajo el nombre ``pilas.escena_actual().control``.
     34
     35      Entonces, una vez que tienes la referencia para consultar, los
     36      atributos que tiene este objeto control son::
     37
     38          izquierda
     39          derecha
     40          arriba
     41          abajo
     42          boton
     43
     44      Cada uno de estos atributos te pueden devolver True, o False, indicando
     45      si el control está pulsado o no.
     46
     47      Ten en cuenta que este objeto también se puede imprimir usando
     48      la sentencia ``print``. Esto es útil para ver el estado completo
     49      del control de una sola vez:
     50
     51          >>> print pilas.mundo.control
     52          <Control izquierda: False derecha: False arriba: False abajo: False boton: False>
     53
     54      También tienes la posibilidad de crearte un control estableciendo las teclas
     55      personalizadas.
     56      Para ello debes crearte un diccionario con las claves izquierda, derecha,
     57      arriba, abajo y boton.
     58      Con las constantes de pilas.simbolos, puedes asignar una tecla a cada una
     59      de las entradas del diccionario.
     60
     61
     62      >>>    teclas = {pilas.simbolos.a: 'izquierda',
     63                                pilas.simbolos.d: 'derecha',
     64                                pilas.simbolos.w: 'arriba',
     65                                pilas.simbolos.s: 'abajo',
     66                                pilas.simbolos.ESPACIO: 'boton'}
     67
     68      >>>    mi_control = pilas.control.Control(pilas.escena_actual(), teclas)
     69
     70
     71      Consultando controles desde un actor:
     72
     73      Una forma habitual de usar los controles, es consultarlos
     74      directamente desde el codigo de un actor.
     75
     76      Para consultar los controles para cambiar la posicion horizontal de
     77      un actor podrías implementar el método ``actualizar``::
     78
     79          class Patito(pilas.actores.Actor):
     80
     81              def __init__(self):
     82                  pilas.actores.Actor.__init__(self)
     83                  self.imagen = "patito.png"
     84
     85              def actualizar(self):
     86                  if pilas.escena_actual().control.izquierda:
     87                      self.x -= 5
     88                      self.espejado = True
     89                  elif pilas.escena_actual().control.derecha:
     90                      self.x += 5
     91                      self.espejado = False
     92
     93      .. image:: ../../pilas/data/patito.png
     94      """
     95
     96 -    def __init__(self, escena, mapa_teclado=None):
     97          self.izquierda = False
     98          self.derecha = False
     99          self.arriba = False
    100          self.abajo = False
    101          self.boton = False
    102
    103          escena.pulsa_tecla.conectar(self.cuando_pulsa_una_tecla)
    104          escena.suelta_tecla.conectar(self.cuando_suelta_una_tecla)
    105
    106          if mapa_teclado == None:
    107              self.mapa_teclado = {IZQUIERDA: 'izquierda',
    108                                    DERECHA: 'derecha',
    109                                    ARRIBA: 'arriba',
    110                                    ABAJO: 'abajo',
    111                                    ESPACIO: 'boton'}
    112          else:
    113              self.mapa_teclado = mapa_teclado
    114
    115 -    def cuando_pulsa_una_tecla(self, evento):
    116          self.procesar_cambio_de_estado_en_la_tecla(evento.codigo, True)
    117
    118 -    def cuando_suelta_una_tecla(self, evento):
    119          self.procesar_cambio_de_estado_en_la_tecla(evento.codigo, False)
    120
    121 -    def procesar_cambio_de_estado_en_la_tecla(self, codigo, estado):
    122          if self. mapa_teclado.has_key(codigo):
    123              setattr(self, self. mapa_teclado[codigo], estado)
    124
    125 -    def __str__(self):
    126          return "<Control izquierda: %s derecha: %s arriba: %s abajo: %s boton: %s>" %(
    127                  str(self.izquierda), str(self.derecha), str(self.arriba),
    128                  str(self.abajo), str(self.boton))
    129
    130 -    def limpiar(self):
    131          self.izquierda = False
    132          self.derecha = False
    133          self.arriba = False
    134          self.abajo = False
    135          self.boton = False
    136