Pilas engine Documentation Release 0.40
Hugo Ruscitti
March 13, 2011
CONTENTS
1
Presenta Prese ntació ción n 1.1 Car Caract acterí erísti sticas cas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1 1
2
Inst In stal alac ació ión n 2.1 Insta Instalació lación n para distri distribuir buir con un jueg juego o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 Insta Instalació lación n para desa desarrolla rrolladores dores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3 3 3
3
Empezando, la prime Empezando, primerr prueb prueba a 3.1 Ini Inicia ciando ndo la bib biblio liotec tecaa . . . . . . 3.2 Cre Creand ando o al pri primer mer per person sonaje aje . . . 3.3 Cos Cosas as en com común ún par paraa los los act actore oress . 3.4 3. 4 Pi Pidi dien endo do ay ayud udaa . . . . . . . . . . 3.5 Elim Elimina inando ndo a un act actor or . . . . . . 3.6 3. 6 Co Conc nclu lusi sión ón . . . . . . . . . . . .
. . . . . .
5 5 5 6 8 8 8
4
Inter Int erpol polaci acione oness 4.1 Gi 4.1 Gira rand ndo o un ac acto torr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2 4. 2 Es Esca cala land ndo o un ac acto torr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3 Int Interp erpola olacio ciones nes en cad cadena ena . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9 10 10 10
5
Contro Con trolan lando do la pan pantal talla la 5.1 Mo 5.1 Modo do de depu pura raci ción ón . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2 Ord Orden en de imp impres resión ión:: atrib atributo uto z . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3 Atr Atrib ibuto utoss de pos posici ición ón . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11 11 12 12
6
Manejo de imá Manejo imágen genes es 6.1 Gri Grilla llass de imá imágen genes es . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.2 Hac Hacien iendo do act actore oress con ani animac mación ión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13 13 14
7
Cargar son Cargar sonido idoss 7.1 7. 1 Re Repr prod oduc ucir ir . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.2 7. 2 Re Refe fere renc ncia iass . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
17 17 17
8
Comportam Compor tamien ientos tos 8.1 Un eje ejempl mplo, o, ir de un lad lado o a otr otro o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
19 19
9
Grupos Grup os 9.1 Crean Creando do grupo gruposs con la funci función ón fabri fabricar car . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
21 21
10 Física Física 10.1 El protag protagonist onistaa es es Box2D Box2D . 10.2 10. 2 Uno Unoss eje ejempl mplos os . . . . . . . 10.3 Modo depu depuració ración n de físic físicaa . 10.4 Físic Físicaa pers personali onalizada zada . . . .
. . . .
. . . .
. . . .
. . . . . .
. . . .
. . . . . .
. . . .
. . . . . .
. . . .
. . . . . .
. . . .
. . . . . .
. . . .
. . . . . .
. . . .
. . . . . .
. . . .
. . . . . .
. . . .
. . . . . .
. . . .
. . . . . .
. . . .
. . . . . .
. . . .
. . . . . .
. . . .
. . . . . .
. . . .
. . . . . .
. . . .
. . . . . .
. . . .
. . . . . .
. . . .
. . . . . .
. . . .
. . . . . .
. . . .
. . . . . .
. . . .
. . . . . .
. . . .
. . . . . .
. . . .
. . . . . .
. . . .
. . . . . .
. . . .
. . . . . .
. . . .
. . . . . .
. . . .
. . . . . .
. . . .
. . . . . .
. . . .
. . . . . .
. . . .
. . . . . .
. . . .
. . . . . .
. . . .
. . . . . .
. . . .
. . . . . .
. . . .
. . . . . .
. . . .
. . . .
25 25 25 25 27
i
11 Controles 11.1 Investigando al objeto control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
31 31
12 Escenas 12.1 La escena Normal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2 Cambiando el fondo de las escenas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
33 33 33
13 Ejemplos 13.1 Piezas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
35 35
14 Interfaz de usuario 14.1 Deslizador . . . . 14.2 Selector . . . . . . 14.3 Ingreso de texto . 14.4 Lista de selección
. . . .
37 37 38 39 40
15 Como crear menúes para tu juegos 15.1 Creando funciones de respuesta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15.2 Los menúes son actores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
41 42 43
16 Dibujando en pantalla
45
17 Usando la Tortuga 17.1 Inspeccionando a la tortuga . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
47 48
18 Usando una Pizarra 18.1 Dibujando usando lapices . . . . . . . . . . . 18.2 Pintando imágenes . . . . . . . . . . . . . . . 18.3 Pintando grillas de imágenes . . . . . . . . . . 18.4 La pizarra como actor . . . . . . . . . . . . . 18.5 Dibujo avanzado sobre la pizarra usando Cairo 18.6 Dibujando mas rápido . . . . . . . . . . . . .
. . . . . .
49 49 51 52 53 53 55
. . . . .
57 57 59 59 62 63
20 Colisiones 20.1 Un ejemplo sencillo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
65 65
21 Motores
69
22 Señales, callbacks y eventos 22.1 ¿Que es un Evento? . . . . . . . . . . 22.2 Conectando eventos a funciones . . . . 22.3 Viendo las señales antes de procesarlas 22.4 Desconectando señales . . . . . . . . . 22.5 Consultado señales conectadas . . . . . 22.6 Referencias . . . . . . . . . . . . . . .
. . . . . .
71 71 71 72 72 72 73
. . . .
75 75 76 76 76
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
19 Mapas y plataformas 19.1 Presentando el actor Mapa . . . . . . 19.2 Colisiones con el escenario . . . . . 19.3 Creando mapas con el programa tiled 19.4 Creando bloques sólidos con tiled . . 19.5 Un ejemplo completo . . . . . . . .
23 Textos 23.1 Crear cadenas de texto . . . . . . . . 23.2 Los textos son actores . . . . . . . . 23.3 Propiedades exclusivas de los textos . 23.4 Mostrando mensajes en pantalla . . .
ii
. . . .
. . . . .
. . . .
. . . .
. . . . .
. . . . . .
. . . .
. . . .
. . . . .
. . . . . .
. . . .
. . . .
. . . . .
. . . . . .
. . . .
. . . .
. . . . .
. . . . . .
. . . .
. . . .
. . . . . .
. . . . .
. . . . . .
. . . .
. . . .
. . . . . .
. . . . .
. . . . . .
. . . .
. . . .
. . . . . .
. . . . .
. . . . . .
. . . .
. . . .
. . . . . .
. . . . .
. . . . . .
. . . .
. . . .
. . . . . .
. . . . .
. . . . . .
. . . .
. . . .
. . . . . .
. . . . .
. . . . . .
. . . .
. . . .
. . . . . .
. . . . .
. . . . . .
. . . .
. . . .
. . . . . .
. . . . .
. . . . . .
. . . .
. . . .
. . . . . .
. . . . .
. . . . . .
. . . .
. . . .
. . . . . .
. . . . .
. . . . . .
. . . .
. . . .
. . . . . .
. . . . .
. . . . . .
. . . .
. . . .
. . . . . .
. . . . .
. . . . . .
. . . .
. . . .
. . . . . .
. . . . .
. . . . . .
. . . .
. . . .
. . . . . .
. . . . .
. . . . . .
. . . .
. . . .
. . . . . .
. . . . .
. . . . . .
. . . .
. . . .
. . . . . .
. . . . .
. . . . . .
. . . .
. . . .
. . . . . .
. . . . .
. . . . . .
. . . .
. . . .
. . . . . .
. . . . .
. . . . . .
. . . .
. . . .
. . . . . .
. . . . .
. . . . . .
. . . .
. . . .
. . . . . .
. . . . .
. . . . . .
. . . .
. . . .
. . . . . .
. . . . .
. . . . . .
. . . .
. . . .
. . . . . .
. . . . .
. . . . . .
. . . .
. . . .
. . . . . .
. . . . .
. . . . . .
. . . .
. . . .
. . . . . .
. . . . .
. . . . . .
. . . .
. . . .
. . . . . .
. . . . .
. . . . . .
. . . .
. . . .
. . . . . .
. . . . .
. . . . . .
. . . .
24 Habilidades 24.1 Un ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24.2 Un ejemplo mas: hacer que un actor sea arrastrable por el mouse 24.3 Otro ejemplo: un actor que cambia de posición . . . . . . . . . . 24.4 Mezclar habilidades . . . . . . . . . . . . . . . . . . . . . . . . 24.5 Otras habilidades para investigar . . . . . . . . . . . . . . . . . . 24.6 ¿Cómo funcionan las habilidades? . . . . . . . . . . . . . . . . . 24.7 ¿Ideas? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . .
77 . . . . . . 77 . . . . . . 77 . . . . . . 78 . . . . . . 78 . . . . . . 78 . . . . . . 78 . . . . . . 79
. . . .
. . . .
81 81 81 81 81
. . . . .
83 83 83 83 84 84
27 Guía de preguntas avanzadas 27.1 Obtengo errores de AttributeError por parte de pilas . . . . . . . . . . . . . . . . . . . . . . . . 27.2 ¿Cómo puedo personalizar el dibujado de un actor? . . . . . . . . . . . . . . . . . . . . . . . . . 27.3 ¿A veces los sonidos no se reproducen? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
85 85 85 85
28 Cómo funciona pilas por dentro 28.1 Filosofía de desarrollo . . . 28.2 API en español . . . . . . . 28.3 Objetos y módulos . . . . . 28.4 Modo interactivo . . . . . . 28.5 Motores multimedia . . . . 28.6 Sistema de actores . . . . . 28.7 Modo depuración . . . . . . 28.8 Sistema de eventos . . . . . 28.9 Habilidades . . . . . . . . .
. . . . . . . . .
87 87 87 87 89 89 90 91 92 94
. . . . . . . . . . . . . . . . . . . .
99 99 100 100 101 101 101 101 101 101 101 102 102 103 103 104 104 105 105 105 105
25 Depurando y buscando detalles 25.1 Modo pausa y manejo de tiempo 25.2 Modo depuración . . . . . . . . 25.3 Intercalando modos . . . . . . 25.4 Eventos . . . . . . . . . . . . . 26 Guía 26.1 26.2 26.3 26.4 26.5
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
para desarrolladores Repositorio . . . . . . . . . . . . . . . . . Obteniendo la última versión del repositio . Primer prueba . . . . . . . . . . . . . . . Instalación en modo desarrollo . . . . . . . Mantenerse actualizado, siempre... . . . . .
29 Referencia del módulo Pilas 29.1 Pilas . . . . . . . . . . . 29.2 Módulo pilas.tareas . . . . 29.3 Módulo pilas.escenas . . . 29.4 Módulo pilas.atajos . . . . 29.5 Módulo pilas.colisiones . 29.6 Módulo pilas.eventos . . . 29.7 Módulo pilas.ventana . . 29.8 Módulo pilas.grupo . . . . 29.9 Módulo pilas.colores . . . 29.10 Módulo pilas.sonidos . . . 29.11 Módulo pilas.habilidades . 29.12 Módulo pilas.imagenes . . 29.13 Módulo pilas.mundo . . . 29.14 Módulo pilas.control . . . 29.15 Módulo pilas.utils . . . . 29.16 Módulo pilas.estudiante . 29.17 Módulo pilas.fps . . . . . 29.18 Módulo pilas.fisica . . . . 29.19 Módulo pilas.xmlreader . 29.20 Módulo pilas.pytweener .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . .
. . . . .
. . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . .
. . . . .
. . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . .
. . . . .
. . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . .
. . . . .
. . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . .
. . . . .
. . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . .
. . . . .
. . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . .
. . . . .
. . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . .
. . . . .
. . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . .
. . . . .
. . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . .
. . . . .
. . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . .
. . . . .
. . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . .
. . . . .
. . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . .
. . . .
. . . . .
. . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . .
. . . .
. . . . .
. . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . .
. . . .
. . . . .
. . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . .
. . . .
. . . . .
. . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . .
. . . .
. . . . .
. . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . .
. . . .
. . . . .
. . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . .
. . . .
. . . . .
. . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . .
. . . .
. . . . .
. . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . .
. . . .
. . . . .
. . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . .
. . . .
. . . . .
. . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . .
. . . . .
. . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . .
. . . . .
. . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . .
. . . . .
. . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . .
. . . . .
. . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . .
. . . . .
. . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
iii
29.21 Módulo pilas.depurador . . . . . . . . 29.22 Módulo pilas.comportamientos . . . . 29.23 Módulo pilas.baseactor . . . . . . . . . 29.24 Módulo pilas.camara . . . . . . . . . . 29.25 Módulo pilas.interpolaciones . . . . . 29.26 Módulo pilas.fondos . . . . . . . . . . 29.27 Módulo pilas.lienzo . . . . . . . . . . 29.28 Módulo pilas.red . . . . . . . . . . . . 29.29 Módulo pilas.simbolos . . . . . . . . . 29.30 Módulo pilas.motores.motor . . . . . . 29.31 Módulo pilas.motores.motor_pygame . 29.32 Módulo pilas.motores.motor_sfml . . . 29.33 Módulo pilas.actores.actor . . . . . . . 29.34 Módulo pilas.actores.disparo . . . . . . 29.35 Módulo pilas.actores.puntaje . . . . . . 29.36 Módulo pilas.actores.nave . . . . . . . 29.37 Módulo pilas.actores.caja . . . . . . . 29.38 Módulo pilas.actores.piedra . . . . . . 29.39 Módulo pilas.actores.moneda . . . . . 29.40 Módulo pilas.actores.opcion . . . . . . 29.41 Módulo pilas.actores.pelota . . . . . . 29.42 Módulo pilas.actores.mono . . . . . . 29.43 Módulo pilas.actores.banana . . . . . . 29.44 Módulo pilas.actores.mapa . . . . . . . 29.45 Módulo pilas.actores.menu . . . . . . . 29.46 Módulo pilas.actores.cursordisparo . . 29.47 Módulo pilas.actores.animacion . . . . 29.48 Módulo pilas.actores.martian . . . . . 29.49 Módulo pilas.actores.utils . . . . . . . 29.50 Módulo pilas.actores.pingu . . . . . . 29.51 Módulo pilas.actores.entradadetexto . . 29.52 Módulo pilas.actores.aceituna . . . . . 29.53 Módulo pilas.actores.explosion . . . . 29.54 Módulo pilas.actores.boton . . . . . . 29.55 Módulo pilas.actores.temporizador . . 29.56 Módulo pilas.actores.animado . . . . . 29.57 Módulo pilas.actores.ejes . . . . . . . 29.58 Módulo pilas.actores.bomba . . . . . . 29.59 Módulo pilas.actores.tortuga . . . . . . 29.60 Módulo pilas.actores.texto . . . . . . . 29.61 Módulo pilas.actores.pizarra . . . . . . 29.62 Módulo pilas.actores.estrella . . . . . . 29.63 Módulo pilas.dispatch.saferef . . . . . 29.64 Módulo pilas.dispatch.dispatcher . . . 29.65 Módulo pilas.data.juegobase.ejecutar . 29.66 Módulo pilas.ejemplos.colisiones . . . 29.67 Módulo pilas.ejemplos.naves . . . . . 29.68 Módulo pilas.ejemplos.listaseleccion . 29.69 Módulo pilas.ejemplos.piezas . . . . . 29.70 Módulo pilas.ejemplos.fisica . . . . . . 29.71 Módulo pilas.interfaz.ingreso_de_texto 29.72 Módulo pilas.interfaz.lista_seleccion . 29.73 Módulo pilas.interfaz.deslizador . . . . 29.74 Módulo pilas.interfaz.selector . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
105 106 106 107 107 108 108 108 108 108 108 110 110 111 111 111 111 112 112 112 112 112 112 112 113 113 113 113 113 114 114 114 114 114 114 114 114 115 115 115 115 115 116 117 118 118 118 118 118 119 119 119 119 119
Module Index
121
Index
123
iv
CHAPTER
ONE
PRESENTACIÓN Pilas es un motor para construir videjuegos de manera sencilla y didáctica. El objetivo principal de pilas es brindar ayuda a los desarrolladores de juegos casuales y novatos quieran hacer sus primeros videojuegos. Pilas está profundamente inspirada en conceptos de las bibliotecas cocos2d, pygame, rabbyt y squeak.
1.1 Características • Es multiplataforma (Funciona sobre GNU/Linux y Windows) • Cuenta con objetos prediseñados para agilizar el desarrollo. • Tiene documentación completamente en español. • Se utiliza desde python, lo que permite usarla desde sesiones interactivas. • Incluye interacción con el motor de física Chipmunk. • Es software libre.
1
Pilas engine Documentation, Release 0.40
2
Chapter 1. Presentación
CHAPTER
TWO
INSTALACIÓN Existen 3 formas de instalar la biblioteca, así que veremos cada una por separado.
2.1 Instalación para distribuir con un juego Si quieres que la biblioteca esté en un juego pero no quieres instalarla en cada equipo, puedes simplemente copiar todo el contenido del directorio pilas dentro del directorio del juego. Entonces, cuando ejecutes una sentencia como import pilas, la biblioteca se leerá desde el directorio.
2.2 Instalación para desarrolladores Si realizas videojuegos, pero no quieres tener la biblioteca como directorio físico en todos y cada uno de los juegos que realices, una buena idea es instalar la biblioteca en tu sistema. Primero tienes que instalar setuptools usando el siguiente comando: sudo apt-get install python-setuptools
Luego, para instalar pilas tienes dos opciones: sudo python setup.py install
o bien: sudo python setup.py develop
En el primer caso la biblioteca se instala y pasa a estar completamente instalada en tu sistema. No importa que borres el directorio que has descargador, la biblioteca ya se instala en el equipo. El segundo caso es el favorito por los desarrolladores, porque te permite actualizar mas fácilmente la biblioteca. Ya que no está complemente instalada en el equipo, si no que hace referencia al directorio de instalación. Si actualizas el directorio origen, los cambios se reflejarán en tu sistema.
3
Pilas engine Documentation, Release 0.40
4
Chapter 2. Instalación
CHAPTER
THREE
EMPEZANDO, LA PRIMER PRUEBA Si ya tienes instalada la biblioteca podemos comenzar a realizar nuestras primeras pruebas. Para empezar, pilas se puede usar directamente desde un intérprete iteractivo de python. Mi recomendación personal es que utilices una herramienta como IDLE, que te permite escribír código de python y autocompleta. Aunque si quieres puedes usar el intérprete estándar de python, abriendo un terminal de texto y ejecutando el comando python.
3.1 Iniciando la biblioteca Una vez dentro del intérprete, tienes que escribir estas dos lineas de código: import pilas pilas.iniciar()
En tu pantalla tiene que aparecer una ventana de color gris:
Esa pantalla será la que utilizaremos para interactuar con el motor. Y mas adelante será la única pantalla que verán los usuarios de nuestros juegos. A partir de ahora comenzaremos a escribir algunos ejemplos. Ten en cuenta que no es necesario que escribas todo el código de los ejemplos, el intérprete de python te permite autocompletar sentencias usando la tecla Tab.
3.2 Creando al primer personaje Un concepto importante en pilas es del de actores. Un actor en pilas es un objeto que aparece en pantalla, tiene una posición determinada y se puede manipular. Por ejemplo, una nave, un enemigo, una medalla... etc. Para agilizar el desarrollo de juegos se incluyen varios actores dentro del motor, un de ellos es Mono, un simpático chimpancé. Escriba la siguiente sentencia dentro del intérprete de python:
5
Pilas engine Documentation, Release 0.40
mono = pilas.actores.Mono()
En pantalla aparecerá un simpático personaje de color marrón:
Adoptaremos a este personaje dentro de nuestro juego bajo un nombre, en este caso mono. Así que para indicarle acciones solo tenemos que utilizar su nombre y sentencias simples. Por ejemplo, para que el personaje cambie su expresión facil podemos usar sentencias cómo: mono.sonreir()
o: mono.gritar()
En cualquiera de los dos casos el personaje cambiará su aspecto y emitirá un sonido.
3.3 Cosas en común para los actores Internamente, Mono es un actor, así que encontraremos mucha funcionalidad en él que la tendrán el resto de los actores. Veamos algunas de estas características: • Podemos cambiar la posición de un actor mediante las propiedades x e y : mono.x = 100 mono.y = 100
Ten en cuenta que x e y son las coordenadas de posición en el escenario. Por lo tanto el punto (0, 0) es el centro de la ventana. Y x aumenta hacia la derecha e y hacia arriba.
6
Chapter 3. Empezando, la primer prueba
Pilas engine Documentation, Release 0.40
• Todo actor tiene un atributo para indicar su tamaño en pantalla, el atributo escala (que originalmente vale 1): mono.escala = 2
• También contamos con un atributo que indica la rotación en ángulos que debe tener el actor en pantalla. El atributo rotacion: mono.rotacion = 40
o bien: mono.rotacion = 80
incluso puedes hacer un pequeña animación de rotación completa con el siguiente código: mono.rotacion = range(0, 360)
3.3. Cosas en común para los actores
7
Pilas engine Documentation, Release 0.40
3.4 Pidiendo ayuda Recuerda que cada componente de pilas está documentado como un módulo de python. Por lo tanto puedes ejecutar una sentencia cómo: help(mono)
y aparecerán en pantalla todos los instructivos de la funcionalidad del actor. Incluso puedes usar la función pilas.ver para conocer el código fuente de cualquier cosa de pilas. Por ejemplo podemos el código completo del mono ejecutando la sentencia: pilas.ver(mono)
3.5 Eliminando a un actor Para eliminar un actor de la escena tienes que llamar al método eliminar: mono.eliminar()
3.6 Conclusión Hemos visto los pasos principales para gestionar actores. Ten en cuenta que el módulo :mod: pilas.actores es donde se guardarán todos los actores. Un buen ejercicio es ponerse a investigar el módulo actores. Hay muchos actores, estos son algunos ejemplos de código para probar: b = pilas.actores.Bomba() b.explotar() p = pilas.actores.Pingu()
# se mueve con el teclado.
Es todo por ahora, a divertirse!
8
Chapter 3. Empezando, la primer prueba
CHAPTER
FOUR
INTERPOLACIONES Las interpolaciones nos pemiten lograr movimientos de los actores de manera sencilla. Por ejemplo, tradicionalmente si quisieramos cambiar posición de un actor en pantalla podemos usar estas sentencias: actor.x = 10 actor.x = 20 actor.x = 30 etc ...
una forma de lograr lo mismo con pilas es asignarle todos los valores en forma de lista: actor.x = range(10, 100)
o lo que es lo mismo: actor.x = [10, 20, 30, 40, 50 ... etc.
Y a estas interpolaciones, también le puedes decir cuantos segundos puede demorar. Por ejemplo, para dar un giro completo de 360 grados en 10 segundos puedes hacer algo como: actor.rotacion = [360], 10
de hecho, puede que te resulte mas conveniente tener mas control sobre la interpolación, así que puedes usar esta forma: actor.x = pilas.interpolar(100)
donde el valor inicial será la posición x del actor y el valor final será 100 . La función interpolar, como mencioné antes, te da mas control sobre la interpolación, porque admite otros parámetros de ajuste como los siguientes: • duracion: los segundos que durara la interpolacion. • demora: los segundos que tiene que esperar antes de iniciar la interpolacion. • tipo: tipo de interpolaciones, que generalmente es ‘lineal’. Por ejemplo, si queremos que un personaje dé un giro completo de 360 grados en 10 segundos podemos hacer algo así: actor.rotacion = 0 actor.rotacion = pilas.interpolar(360, duracion=10)
9
Pilas engine Documentation, Release 0.40
4.1 Girando un actor Esta herramienta se puede aplicar a muchas situaciones distintas, por ejemplo si queremos hacer girar un personaje podemos hacer algo como: actor.rotacion = pilas.interpolar(360, duracion=5)
con lo que estaríamos diciendo al personaje que dé un giro completo (de 0 a 360 grados) en 5 segundos. También existe un argumento delay para demorar el inicio de la interpolación.
4.2 Escalando un actor De manera similar a lo que hicimos anteriormente, podemos aplicarla a la propiedad escala una nueva interpolación: actor.escala = pilas.interpolar(2, duracion=5)
esto duplicará el tamaño del actor en 5 segundos. ¿Y mas simple?, bueno, como hicimos antes: actor.escala = [2]
pero recuerda, de esta forma no puedes controlar cuanto tiempo demorará la animación.
4.3 Interpolaciones en cadena Si queremos que una interpolación pase por distintos valores podemos hacer algo como esto: actor.x = pilas.interpolar([300, 0, 300], duracion=3)
lo que llevará al actor de su posición x actual, a 300 en un segundo, y luego a 0 en un segundo y por último de nuevo a 300 en un segundo. En total, ha consumido 3 segundos en pasar por todos los valores que le indicamos.
10
Chapter 4. Interpolaciones
CHAPTER
FIVE
CONTROLANDO LA PANTALLA Para posicionar actores en el escenario principal es importante conocer las propiedades de la pantalla. Estas propiedades se pueden ver y alternar accediendo al módulo pilas.ventana.
5.1 Modo depuración El modo depuración te permite ver información de utilidad cuando estás desarrollando un juego o simplemente buscando algún error. Para iniciar el modo depuración pulsa F12. En la ventana principal aparecerá un eje de coordenadas:
Este eje de coordenadas te mostrará que el centro de la ventana será tomado como la posición (0, 0).
11
Pilas engine Documentation, Release 0.40
5.2 Orden de impresión: atributo z Cuando tienes varios actores en pantalla notaras que a veces unos aparecen sobre otros. Para cambiar este comportamiento tienes que modificar el atributo z de cada actor. Los valores altos de z indican mucha distancia entre el observador y el escenario. Mientras que valores pequeños z harán que los actores tapen a los demás (porque aparecerán mas cerca del usuario). Este es un ejemplo de dos configuraciones distintas de atributos z :
Ten en cuenta que inicialmente todos los actores tienen un atributo z=0 .
5.3 Atributos de posición Todos los actores tienen atributos cómo: • x • y que sirven para cambiar la posición del actor dentro de la escena. También encontrarás atributos que permite hacer lo mismo pero tomando como referencia alguno de los bordes del actor. Por ejemplo: • izquierda • derecha • arriba • abajo Ten en cuenta que estos valores indicarán la posición del actor dentro del escenario, no de la ventana. Esto significa que si cambias la posición de la cámara los actores seguirán estando en la misma posición pero se verán un poco corridos.
12
Chapter 5. Controlando la pantalla
CHAPTER
SIX
MANEJO DE IMÁGENES En los videojuegos 2D las imágenes suelen estar en formatos gráficos como png o jpg ya diseñados con anterioridad. En pilas se pueden cargar estos recursos usando el módulo imagenes. Por ejemplo, si tenemos una imagen llamada hola.png podríamos incorporarla a nuestro juego así: import pilas hola = pilas.imagenes.cargar(’hola.png’)
Las imágenes no se imprimen directamente en pantalla, en su lugar tienes que crear un Actor y asignarle la imagen. Por ejemplo, el siguiente código muestra la imagen en pantalla: import pilas imagen = pilas.imagenes.cargar("mi_personaje.png") actor = pilas.actores.Actor(imagen)
6.1 Grillas de imágenes Un forma conveniente de almacenar las imágenes de tus personajes es usar una grilla. La siguiente imagen es una grilla de 10 columnas que utilizamos para crear al personaje “pingu”:
Internamente la imagen se almacena así, pero a la hora de mostrarse en pantalla se puede seleccionar el cuadro. Este es un ejemplo que carga la grilla de mas arriba y genera un actor para mostrar el cuadro 1: actor = pilas.actores.Actor() animacion = pilas.imagenes.cargar_grilla("pingu.png", 10) animacion.asignar(actor)
Luego, una vez que tienes asociado la grilla al actor, puedes cambiar el cuadro de animación ejecutando las sentencias: animacion.avanzar() animacion.asignar(actor)
13
Pilas engine Documentation, Release 0.40
Ten en cuenta que siempre tienes que llamar a al método asignar luego de hacer algo con la animación. De otra forma no verás reflejado el cambio en el actor...
6.1.1 Mas detalles sobre grillas En el ejemplo anterior usamos una grilla sin dar muchos detalles sobre la grilla, pero resulta que en python tienes la oportunidad de ser mas preciso y obtener mas funcionalidad de las grillas. El objeto grilla recibe mas parámetros, por ejemplo si tu grilla tiene filas y columnas puedes especificar las filas y columnas de esta forma: animacion = pilas.imagenes.cargar_grilla("pingu.png", 10, 5)
donde 10 es el número de columnas en la grilla y 5 es la cantidad de filas.
6.1.2 Haciendo animaciones sencillas En muchas oportunidades nos interesa hacer animaciones simples y que se repitan todo el tiempo sin mucho esfuerzo. Pilas incluye un actor llamado Animacion precisamente para estos casos. Por ejemplo, imagina que tienes una animación de un fuego que te gustaría repetir todo el tiempo:
Esta imagen de grilla tiene 6 cuadros de animación organizada mediante columnas. Una forma sencilla de convertir esta animación en un actor simple es crear la grilla, construir un actor Animacion e indicarle a pilas que será una animación cíclica, es decir, que se tendrá que repetir indefinidamente: grilla = pilas.imagenes.cargar_grilla("fuego.png", 6) actor = pilas.actores.Animacion(grilla, ciclica=True)
El resultado en la ventana será una animación de fuego que no terminará nunca. Cuando el actor termine de mostrar el cuadro 6 de la animación regresará al primero para comenzar nuevamente. Otra posibilidad es especificar el argumento ciclica=False. En ese caso el actor comenzará a mostrar la animación desde el cuadro 1 y cuanto termine eliminará al actor de la ventana. Esto es útil para hacer efectos especiales, como explosiones o destellos, cosas que quieres tener en la ventana un instante de tiempo.
6.2 Haciendo actores con animación Puede que quieras hacer un actor que tenga múltiples animaciones, y que las muestre en determinados momentos. Por ejemplo, si tienes una nave con motores, es probable que quieras mostrar una animación de motores en funcionamiento cuando la nave avanza y detener la animación de motores cuando finaliza el movimiento. Una forma de lograr esto de manera sencilla es crear tu propio actor, y que este tenga dos atributos, uno para cada animación: class MiNave(pilas.actores.Actor): def __init__ (self, x=0, y=0): Actor. __init__(self, x=x, y=y)
14
Chapter 6. Manejo de imágenes
Pilas engine Documentation, Release 0.40
self.animacion_detenida = pilas.imagenes.cargar_grilla("nave_detenida.png", 1) self.animacion_movimiento = pilas.imagenes.cargar_grilla("nave_en_movimiento.png", 3)
Luego, en el método actualizar del propio actor podrías avanzar la animación actual y permitirle al programador invocar métodos para intercambiar animaciones: class MiNave(...) [...] # codigo anterior def poner_en_movimiento(self): self.animacion_actual = self.animacion_movimiento self.animacion_movimiento.asignar(self) def poner_en_reposo(self): self.animacion_actual = self.animacion_detenida self.animacion_detenida.asignar(self) def actualizar(self): self.animacion_actual.avanzar() self.animacion_detenida.asignar(self)
6.2. Haciendo actores con animación
15
Pilas engine Documentation, Release 0.40
16
Chapter 6. Manejo de imágenes
CHAPTER
SEVEN
CARGAR SONIDOS Los sonidos se pueden cargar usando el módulo sonidos de la siguiente manera: sonido_de_grito = pilas.sonidos.cargar(’shout.wav’)
donde shout.wav es el nombre del archivo de audio que pilas buscará en el directorio data.
7.1 Reproducir La función sound.cargar nos retorna un objeto de tipo Sonido que tiene un método para reproducirse llamado reproducir(). Entonces, para reproducir un sonido solamente tienes que llamar al método reproducir: sonido_de_grito.reproducir()
7.2 Referencias Actualmente estamos usando varias llamadas al módulo de sonido de la biblioteca SFML, que es la capa multimedia que usamos en pilas. De ahí que tenemos algunas funciones en inglés y otras no... Nuestro deseo en pilas es que poco a poco podamos ir escribiendo funciones para el manejo de recursos sea mas sencillo que ahora.
17
Pilas engine Documentation, Release 0.40
18
Chapter 7. Cargar sonidos
CHAPTER
EIGHT
COMPORTAMIENTOS En el desarrollo de videojuegos es conveniente tener una forma de indicarle a los actores una rutina o tarea para que la realicen. En pilas usamos el concepto de comportamiento. Un comportamiento es un objeto que le dice a un actor que debe hacer en todo momento. La utilidad de usar componentes es que puedes asociarlos y intercambiarlos libremente para lograr efectos útiles. Por ejemplo: un guardia de un juego de acción puede ir de un lado a otro en un pasillo: • caminar hacia la izquierda hasta el fin del pasillo. • dar una vuelta completa. • caminar hacia la derecha hasta el fin del pasillo. • dar una vuelta completa. En este caso hay 4 comportamientos, y queda en nuestro control si queremos que luego de los 4 comportamientos comience nuevamente.
8.1 Un ejemplo, ir de un lado a otro Veamos un ejemplo sencillo, vamos a crear un actor Mono y decirle que se mueva de izquierda a derecha una sola vez: import pilas pilas.iniciar() mono = pilas.actores.Mono() pasos = 200 moverse_a_la_derecha = pilas.comportamientos.Avanzar(0, pasos) moverse_a_la_izquierda = pilas.comportamientos.Avanzar(180, pasos) mono.hacer_luego(moverse_a_la_derecha) mono.hacer_luego(moverse_a_la_izquierda) pilas.ejecutar()
De hecho, tenemos una variante que puede ser un poco mas interesante, decirle al mono que repita estas tareas todo el tiempo: mono.hacer_luego(moverse_a_la_derecha, True)
Donde el segundo argumento indica si el comportamiento se tiene que repetir todo el tiempo o no.
19
Pilas engine Documentation, Release 0.40
20
Chapter 8. Comportamientos
CHAPTER
NINE
GRUPOS Ahora que podemos manejar a los actores de manera individual. Vamos a ver organizarlos en grupos. Organizar a los actores en grupo es muy útil, porque es algo que hacemos todo el tiempo en el desarrollo de videojuegos. Por ejemplo, en un juego de naves espaciales, podríamos hacer un grupo de naves enemigas, o un grupo de estrellas, o un grupo de disparos.
9.1 Creando grupos con la función fabricar Para crear varios actores de una misma clase podríamos ejecutar algo como lo que sigue: bombas = pilas.atajos.fabricar(pilas.actor.Bomba, 30)
donde el primer argumento es la clase de la que buscamos crear actores, y el segundo argumento es la cantidad de actores que queremos. Esto es lo que veríamos en la ventana de pilas:
21
Pilas engine Documentation, Release 0.40
A partir de ahora, la referencia bombas nos servirá para controlar a todas las bombas al mismo tiempo. Veamos como alterar el atributo de posición horizontal: bombas.x = 0
Y en la ventana obtendremos:
22
Chapter 9. Grupos
Pilas engine Documentation, Release 0.40
Incluso, les podríamos enseñar a las bombas a reaccionar como si fueran pelotas, es decir, que reboten e interactúen con la aceleración gravitatoria: bombas.aprender(pilas.habilidades.RebotaComoPelota)
9.1. Creando grupos con la función fabricar
23
Pilas engine Documentation, Release 0.40
Note: Un consejo, la gravedad del escenario se puede modificar usando una sentencia como la que sigue: pilas.atajos.definir_gravedad(200, 0)
24
Chapter 9. Grupos
CHAPTER
TEN
FÍSICA Pilas incluye integración con un sistema de física para realizar simulaciones y dotar a tus juegos de mas realismo y diversión.
10.1 El protagonista es Box2D Así cómo pilas elegimos usar usar motores gráficos externos (pygame o sfml), también optamos por usar un motor de física externo libre y muy utilizado llamado Box2D. El módulo pilas.fisica es simplemente una facilidad que te permite integrar comportamiento realista a tus juegos de manera muy sencilla.
10.2 Unos ejemplos El motor de física se puede mostrar en funcionamiento usando un ejemplo, escribe el siguiente código: pelotas = pilas.atajos.fabricar(pilas.actor.Pelota, 10)
esto creará un grupo de circunferencias que rebotarán hasta la parte inferior de la pantalla. De manera similar puedes crear un montón de cajas y hacerlas rebotar: pelotas = pilas.atajos.fabricar(pilas.actor.Caja, 10)
10.3 Modo depuración de física Cuando haces juegos con física o movimientos realistas es muy importante tener la seguridad de que la geometría de las figuras está correctamente configurada. Observa esta escena:
25
Pilas engine Documentation, Release 0.40
Cada uno de esos actores está asociado a una figura geométrica, pero para asegurarte de ello puedes pulsar en cualquier momento la tecla F11 y observar las lineas de color amarillo:
26
Chapter 10. Física
Pilas engine Documentation, Release 0.40
Las lineas de color amarillo indican polígonos que el motor de física puede controlar, las cajas tienen forma rectangular, los actores Pelota tienen figuras circulares, y el suelo y las paredes también están en el sistema de física. Si por algún motivo quiere que los objetos “caigan” saliendo de la pantalla podrías eliminar el suelo o las paredes escribiendo lo siguiente: pilas.mundo.fisica.eliminar_suelo() pilas.mundo.fisica.eliminar_paredes()
10.4 Física personalizada Los actores Pelota y Caja están bien para simulaciones simples y generales. Pero, ¿cómo podemos dotar a nuestros propios actores de ese comportamiento?. Los objetos o figuras físicas viven dentro del módulo de física y son invisibles (al principio), pero luego se pueden vincular a cualquier actor con facilidad. Intenta lo siguiente, ingresa en el modo interactivo de pilas y pulsa la tecla F11. Tendrías que ver el texto “ModoFisica Habilitado” en la esquina superior de la ventana:
10.4. Física personalizada
27
Pilas engine Documentation, Release 0.40
Ahora genera dos figuras físicas, una circunferencia estática y otra dinámica: circulo = pilas.fisica.Circulo(0, 0, 50, dinamica=False) circulo_dinamico = pilas.fisica.Circulo(10, 200, 50)
El primer círculo aparecerá en el centro de la ventana, y el segundo comenzará en la posición (10, 200), es decir, en la parte superior de la ventana y luego caerá rebotando... algo así:
28
Chapter 10. Física
Pilas engine Documentation, Release 0.40
Ahora bien, habrás notado que estas dos circunferencias las podemos ver porque está habilitado el módulo de depuración (que activamos con F11), pero esto no lo va a ver alguien que juegue a nuestro juego. El modo depuración es solo para desarrolladores. Lo que nos falta hacer, es darles apariencia a esas figuras. Algo así como un piel.. Para esto podemos usar actores. La dinámica es así, tenemos que crear dos actores, y luego decirle a estos actores que se comporten cómo figuras geométricas. Agreguemos a nuestro programa estas 4 lineas de código, queremos que el primer circulo (el del centro) sea un mono, y el otro círculo que sea una bomba: mono = pilas.actores.Mono() mono.aprender(pilas.habilidades.Imitar(circulo)) bomba = pilas.actores.Bomba() bomba.aprender(pilas.habilidades.Imitar, circulo_dinamico)
Esto es diferente a lo anterior, los objetos físicos tienen apariencia:
10.4. Física personalizada
29
Pilas engine Documentation, Release 0.40
Ahora podríamos desactivar el modo depuración física (pulsando nuevamente F11) y jugar un poco impulsando la bomba de un lado a otro: circulo_dinamico.y = 200
Ten en cuenta que ahora la figura del motor físico es la que determina el movimiento y la rotación, así que ya no funcionará escribir algo cómo bomba.y = 200, ahora tienes que escribir circulo_dinamico.y = 200 para mover al actor... Otra cosa a considerar, es que en nuestro ejemplo no ajustamos muy bien el tamaño del circulo_dinamico con el de la bomba. Esto es un detalles poco relevante aquí, porque solo quiero explicar cómo se usar el motor, pero cuando hagas tus juegos recuerda usar el modo depuración de física para detectar estos detalles y corregirlos, son muy importantes para que tus usuarios disfruten del juego. Recuerda que ellos no verán los círculos amarillos...
30
Chapter 10. Física
CHAPTER
ELEVEN
CONTROLES Si quieres conocer el estado de los controles en pilas tienes que usar el objeto pilas.mundo.control. Por ejemplo, para hacer que un actor se mueva por la pantalla simplemente puedes crear al actor y escribir estas sentencias. if pilas.mundo.control.izquierda: mono.x -= 1 elif pilas.mundo.control.derecha: mono.x += 1
11.1 Investigando al objeto control En realidad, cuando usamos a pilas.mundo.control, accedemos a un objeto que tienen varios atributos. Estos atributos pueden valer True o False, dependiendo de la pulsación de las teclas: • izquierda • derecha • arriba • abajo • boton
31
Pilas engine Documentation, Release 0.40
32
Chapter 11. Controles
CHAPTER
TWELVE
ESCENAS Las escenas te permiten dividir el juego en partes reconocibles y que interactúan de manera diferente con el usuario. Algunas observaciones: • La escena actual siempre está señalada por el atributo pilas.escena. • Solo puede existir una escena a la vez. • Cuando se cambia de escena, generalmente la misma escena eliminará a todos los actores del escenario.
12.1 La escena Normal Cuando iniciamos pilas por primera vez se creará una escena llamada Normal. Esta escena no tiene un comportamiento muy elaborado, simplemente imprime toda la pantalla de gris para que podamos colocar actores sobre ella.
12.2 Cambiando el fondo de las escenas Para hacer un pequeña prueba sobre una escena, podrías ejecutar la siguiente sentencia de código: pilas.fondos.Volley()
Esto le dará a tu escena una vista mas agradable, porque carga un fondo de pantalla colorido y mas divertido:
33
Pilas engine Documentation, Release 0.40
34
Chapter 12. Escenas
CHAPTER
THIRTEEN
EJEMPLOS Pilas viene con un módulo de ejemplos muy sencillos para que puedas investigar y jugar. Este módulo de ejemplos es pilas.ejemplos y está organizado como una colección de clases.
13.1 Piezas Hay hay un pequeño rompecabezas que se puede iniciar con la siguiente sentencia: pilas.ejemplos.Piezas()
inmeditamente despúes de evaluar esa sentencia, aparecerá en pantalla un grupo de piezas para que puedas empezar a acomodarlas usando el mouse.
35
Pilas engine Documentation, Release 0.40
Ten en cuenta que los ejemplos también reciben parámetros, así podemos alterar un poco mas el funcionamiento del minijuego. Veamos cómo podemos crear un rompecabezas distinto a partir del ejemplo Piezas. Escribe lo siguiente: pilas.ejemplos.Piezas("monkey_normal.png", 2, 2)
Si, ahora en pantalla aparece la imagen del mono pero separado en 4 piezas. Dado que hemos especificado 2 (filas) y 2 (columnas).
36
Chapter 13. Ejemplos
CHAPTER
FOURTEEN
INTERFAZ DE USUARIO Pilas incluye un submódulo que te permitirá crear una interfaz de usuario con deslizadores, botones, cajas de texto y selectores. Este submódulo tiene objetos basados en actores, así que lo que conoces sobre actores vas a poder usarlo para construir una interfaz.
14.1 Deslizador El deslizador es útil para que el usuario pueda seleccionar un valor intermedio entre dos números, por ejemplo entre 0 y 1, 0 y 100 etc. Un ejemplo típico de este componente puedes encontrarlo en las preferencias de audio de algún programa de sonido, los deslizadores te permiten regular el grado de volumen. Esta es una imagen del ejemplo deslizador.py que está en el directorio ejemplos. Tiene tres deslizadores, y el usuario puede regular cualquiera de los tres para ver los cambios en el actor:
37
Pilas engine Documentation, Release 0.40
Para construir un deslizador y asociarlo a una función puedes escribir algo como esto: def cuando_cambia(valor): print "El deslizador tiene grado:", valor deslizador = pilas.interfaz.Deslizador() deslizador.conectar(cuando_cambia)
Entonces, a medida que muevas el deslizador se imprimirán en pantalla valores del 0 al 1, por ejemplo 0.25, 0.52777 etc... Si quieres cambiar los valores iniciales y finales de la escala de valores, lo mas sencillo es multiplicar el argumento valor de la función. Por ejemplo, si quieres valores entre 0 y 100: def cuando_cambia(valor): valor_entre_cero_y_cien = valor * 100
14.2 Selector El selector te permite seleccionar una opción con dos valores: habilitado, deshabilitado. Se puede usar para opciones cómo habilitar o deshabilitar el modo pantalla completa o algo así. Para usarlo, se tiene que crear un objeto de la clase Selector y un texto a mostrar: selector = pilas.interfaz.Selector("Habilitar pantalla completa.", x=0, y=200)
Y luego, puedes consultar el valor del selector mediante el atributo seleccionado:
38
Chapter 14. Interfaz de usuario
Pilas engine Documentation, Release 0.40
if selector.seleccionado: print "El selector esta seleccionado." else: print "El selector no esta seleccionado."
o directamente asociarle una función para que el selector la llame cuando cambia de estado: def cuando_el_selector_cambia(estado): print "El selector ahora esta en estado:", estado selector.definir_accion(cuando_el_selector_cambia)
14.3 Ingreso de texto Si quieres solicitar datos, como el nombre del usuario, puedes usar el objeto IngresoDeTexto. Ya que muestra una caja y un pequeño cursor para ingresar texto:
Para usar este componente tienes que crearlo y luego leer o escribir el atributo texto, que contiene la cadena de texto de la caja: entrada = pilas.interfaz.IngresoDeTexto() entrada.texto = "Texto inicial"
14.3. Ingreso de texto
39
Pilas engine Documentation, Release 0.40
14.4 Lista de selección La lista de selección se utiliza para mostrar al usuario una lista de cadenas, y permitirle seleccionarlas con el mouse. Para crear un lista de selección, se tiene que crear una lista de cadenas y declarar una función para que sea llamada cuando se termina de seleccionar. Por ejemplo, el siguiente código muestra una lista e imprime por consola cuando el usuario selecciona con el click del mouse: def cuando_selecciona(opcion): print "Ha seleccionado la opcion:", opcion consulta = pilas.interfaz.ListaSeleccion([’Uno’, ’Dos’, ’Tres’], cuando_selecciona)
40
Chapter 14. Interfaz de usuario
CHAPTER
FIFTEEN
COMO CREAR MENÚES PARA TU JUEGOS Para crear menúes en tus juegos puedes usar el actor Menu. El actor Menu tiene la funcionalidad de representar opciones y que le puedas asociar nombres de funciones para invocar. Un menú sencillo podría tener dos opciones, una para iniciar el juego y otra para salir: pilas.iniciar() pilas.iniciar() pilas.fondos.Pasto()
def iniciar_juego(): print "Tengo que iniciar el juego" def salir_del_juego(): print "Tengo que salir..." pilas.actores.Menu( [ (’iniciar juego’, iniciar_juego), (’salir’, salir_del_juego), ]) pilas.ejecutar()
Si escribes este texto en un programa, funciona, aunque no es muy útil: solamente creará una ventana con dos opciones, que se pueden seleccionar usando el teclado. Esta es una imagen de cómo se vé el menú del ejemplo de mas arriba:
41
Pilas engine Documentation, Release 0.40
Cada vez que selecciones una opción aparecerá un mensaje en la consola de python.
15.1 Creando funciones de respuesta Si observas con atención el primer ejemplo de código, hay dos partes que son muy importantes. Primero declaramos funciones que hacen algo, como por ejemplo: def iniciar_juego(): print "Tengo que iniciar el juego"
Y luego, cuando creamos el menú, armamos una lista de tuplas, donde el primer elemento es la cadena de texto que queremos mostrar, y el segundo elemento es la función a invocar: pilas.actores.Menu( [ (’iniciar juego’, iniciar_juego), (’salir’, salir_del_juego), ])
Es importante que el argumento se construya usando una lista como la anterior. Puedes crear tantas opciones como quieras, pero siempre tienen que estar en una tupla de dos elementos, el primer con un texto y el segundo con el nombre de la función que se tiene que invocar. Cuando colocamos un nombre de función de esa forma, es decir, sin los paréntesis, decimos que esa función será una función de repuesta para el menú. Y aunque parezca un recurso muy simple, funciona bastante bien en casi todos los casos. Por ejemplo, nuestro código anterior se podría poner mas interesante si mejoramos la función iniciar_juego y la funcion salir_del_juego:
42
Chapter 15. Como crear menúes para tu juegos
Pilas engine Documentation, Release 0.40
def iniciar_juego(): pilas.ejemplos.Piezas() def salir_del_juego(): pilas.terminar()
15.2 Los menúes son actores Ten en cuenta que el menú también es un actor, así que podrás posicionarlo en la ventana, o cambiar su tamaño como si se tratara de cualquier otro personaje del juego: mi_menu.escala = 2 mi_menu.rotacion = [360] mi_menu.x = [300, 0]
Muchos juegos hace uso de esta característica, por ejemplo, para que el menú aparezca por debajo de la pantalla o que se mueva constantemente como si estuviera flotando.
15.2. Los menúes son actores
43
Pilas engine Documentation, Release 0.40
44
Chapter 15. Como crear menúes para tu juegos
CHAPTER
SIXTEEN
DIBUJANDO EN PANTALLA Pilas te permite dibujar figuras en la ventana de muchas formas. En esta sección veremos las posibilidades de ofrece pilas desde lo mas simple a lo mas complejo.
45
Pilas engine Documentation, Release 0.40
46
Chapter 16. Dibujando en pantalla
CHAPTER
SEVENTEEN
USANDO LA TORTUGA El actor Tortuga está inspirado en una de las actividades mas divertidas y representativas del lenguaje de programación logo, creado por Seymour Papert. La Tortuga básicamente es un actor que sabe dibujar sobre la ventana de pilas. Para ello el programador tiene que indicarle a la tortuga qué movimiento tiene que hacer. La siguiente imagen muestra lo que podría dibujar la tortuga con algunas sentencias de movimientos:
Como puedes ver en la imagen, el código que he utilizado para crear la tortuga es el siguiente: tortuga = pilas.actores.Tortuga()
for x in range(36): tortuga.avanzar(5) tortuga.giraizquierda(10) tortuga.color = pilas.colores.verde tortuga.avanzar(200)
47
Pilas engine Documentation, Release 0.40
17.1 Inspeccionando a la tortuga Para manejar a este actor tienes varios comandos inspirados en logo. Esta es una lista de los comandos mas utilizados:
Método completo avanzar
nombre corto av
ejemplo
¿que hace?
tortuga.av(10)
giraderecha
gd
tortuga.gd(45)
giraizquierda
gi
tortuga.gi(45)
subelapiz
sl
tortuga.sl()
bajalapiz
bl
tortuga.bl()
pon_color pintar
pc <
>
tortuga.pc(pilas.colores.rojo) tortuga.pintar(pilas.colores.blanco)
avanza en dirección a donde mira la tortuga. gira hacia la derecha los grados indicados. gira hacia la izquierda los grados indicados. deja de dibujar cuando se mueve la tortuga. comienza a dibujar cuando la tortuga se mueve. dibuja con el color indicado. pinta toda la pantala del mismo color.
48
Chapter 17. Usando la Tortuga
CHAPTER
EIGHTEEN
USANDO UNA PIZARRA Si quieres dibujar sobre la pantalla pero de forma inmediata y con mas posibilidades puedes usar un actor llamado Pizarra. Este actor es cómo un lienzo invisible sobre el que podemos pintar imágenes, figuras geométricas y trazos de cualquier tipo. A diferencia de la tortuga, la Pizarra te permite hacer muchos trazos rápidamente y mostrarlos en pantalla todos a la vez. Además te permite acceder a funciones avanzadas de dibujo gracias a la biblioteca cairo. Comencemos con algo sencillo: para crear la pizarra y dibujar un punto en el centro de la pantalla se puede usar el siguiente código: pizarra = pilas.actores.Pizarra() pizarra.dibujar_punto(0, 0)
18.1 Dibujando usando lapices La pizarra tiene un componente interno que se parece a un lápiz de color. Este lápiz lo utilizaremos para dibujar sobre la pizarra. Este código es un ejemplo que imprime sobre la pizarra una linea de color negro en diagonal: pizarra = pilas.actores.Pizarra() pizarra.bajar_lapiz() pizarra.mover_lapiz(100, 0) pizarra.mover_lapiz(100, 100) pizarra.mover_lapiz(0, 0)
Así se verá:
49
Pilas engine Documentation, Release 0.40
De hecho, ahora que tienes el triangulo puedes pulsar la tecla F12 y observar con mas claridad dónde están situadas las puntas del triangulo:
50
Chapter 18. Usando una Pizarra
Pilas engine Documentation, Release 0.40
18.2 Pintando imágenes Las pizarras también pueden dibujar imágenes sobre la superficie, y esto es útil cuando quieras crear pinceles especiales sobre la pizarra o construir un escenario usando bloques tipo ladrillos. Para pintar una imagen solo tienes que cargarla e indicarla a la pizarra que la dibuje. imagen = pilas.imagenes.cargar("pelota.png") pizarra.pintar_imagen(imagen, 0, 0)
Así se verá:
18.2. Pintando imágenes
51
Pilas engine Documentation, Release 0.40
Ten en cuenta que la coordenada de la imagen es un poco diferente a las coordenadas que vimos antes, cuando pintas una imagen sobre una pizarra las coordenadas se dicen coordenadas de pantalla. Eso significa que la posición (0, 0) es la esquina superior izquierda. Los valores positivos de “x” son hacia la derecha y los valores positivos de “y” van hacia abajo.
18.3 Pintando grillas de imágenes De manera similar a las imágenes normales, sobre las pizarras también se pueden pintar grillas. Solamente tenemos que crear la grilla, seleccionar el cuadro de animación y después decirle a la pizarra que pinte el cuadro actual de la grilla: grilla = pilas.imagenes.Grilla("pingu.png", 10) pizarra.pintar_grilla(grilla, 0, 0) grilla.definir_cuadro(2) pizarra.pintar_grilla(grilla, 100, 100) grilla.definir_cuadro(3) pizarra.pintar_grilla(grilla, 200, 200)
Así se verá:
52
Chapter 18. Usando una Pizarra
Pilas engine Documentation, Release 0.40
Esto es útil cuando se quieren pintar bloques de un escenario completo, por ejemplo podríamos tener una grilla con distintos tipos de suelos (pasto, piedra, tierra) y luego ir imprimiendo sobre una pizarra para formar un escenario completo. Ten en cuenta que al igual que la impresión de imágenes, aquí también las coordenadas se comportan un poco distinto, tienes que usar coordenadas de pantalla. Observa la sección anterior para tener mas detalle de las coordenadas de pantalla.
18.4 La pizarra como actor Recuerda que la pizarra también es un actor, así que puedes enseñarle habilidades, cambiar su posición, rotación o lo que quieras.
18.5 Dibujo avanzado sobre la pizarra usando Cairo El actor pizarra tiene varios métodos para dibujar, y son simples de utilizar. Pero en algunas oportunidades puede que quieras hacer algo mas complejo, que la pizarra no sabe hacer. Por ejemplo, imagina que quieres imprimir un gráfico vectorial, o pintar un rectángulo con esquinas redondeadas o un degradé circular. Para operaciones de dibujo complejas, puedes usar la biblioteca cairo, la biblioteca que usa pilas para representar a la pizarra y permitirte dibujar una imagen sobre otra. Entonces, para dibujar de manera avanzada sobre la pizarra tienes que incorporar la biblioteca cairo, dibujar sobre el contexto de la pizarra y luego invocar al método actualizar_imagen.
18.4. La pizarra como actor
53
Pilas engine Documentation, Release 0.40
Lo que sigue es un ejemplo que dibujar sobre la pizarra usando cairo: # paso 1: crear la pizarra pizarra = pilas.actores.Pizarra() # paso 2: comienza el dibujo personalizado con cairo:
import cairo x1, y1 = (100, 100) x2, y2 = (600, 300) x3, y3 = (100, 400) pizarra.canvas.context.curve_to(x1, y1, x2, y2, x3, y3) pizarra.canvas.context.set_line_width(50) pizarra.canvas.context.set_dash([10]) pizarra.canvas.context.stroke() # paso 3: Decirle a la pizarra que se actualice. pizarra.actualizar_imagen()
Es decir, el resultado será una curva que pasa por los puntos (x1, y1), (x2, y2) y por último (x3, y3):
Si quieres obtener mas información sobre las posibilidades que te ofrece cairo, puedes consultar los siguientes sitios web: • http://cairographics.org/pycairo/ • http://cairographics.org/samples/ • http://www.tortall.net/mu/wiki/CairoTutorial Y si encuentras algo útil que se pueda simplificar mejorando la pizarra avísanos!.
54
Chapter 18. Usando una Pizarra
Pilas engine Documentation, Release 0.40
18.6 Dibujando mas rápido Si quieres hacer dibujos complejos, con muchos trazos o formas, seguramente notarás que la pizarra no es tan rápida como debería. Resulta que la pizarra, cuando se utiliza normalmente, muestra en cada momento el trazo que realizamos o cualquier dibujo que realicemos. Esto funciona así porque la mayoría de los usuarios quieren dibujar y observar su resultado inmediatamete, de forma interactiva. Si quieres dibujar mas rápidamente puedes hacer lo siguiente: dile a la pizarra que deshabilite el dibujado interactivo, realiza todos los trazos que quieras, y luego habilita nuevamente el dibujado interactivo. Esto producirá resultados mas rápidos y directos. Aquí hay un ejemplo de dibujado rápido. Ten en cuenta que la pizarra pasará, de un instante a otro, a tener los 64 puntos que dibujamos. Así que si usas este código desde la consola interactiva, solo verás los resultados cuando ejecutes la sentencia pizarra.habilitar_actualizacion_automatica.
18.6. Dibujando mas rápido
55
Pilas engine Documentation, Release 0.40
56
Chapter 18. Usando una Pizarra
CHAPTER
NINETEEN
MAPAS Y PLATAFORMAS En los años 80 uno de los géneros de videojuegos mas celebrados ha sido el genero de plataformas. En los juegos de este género el protagonista de la aventura estaba en un escenario armado de bloques y plataformas en donde podía saltar. Uno de los juegos mas populares de esos días era Super Mario Bros. Pilas incluye un actor llamado Mapa que te permite hacer juegos de plataformas fácilmente.
19.1 Pres Presentan entando do el actor actor Mapa El Mapa repres represent entaa un escena escenario rio compue compuesto sto de bloque bloquess que pueden pueden ser plataf plataform ormas, as, muros muros o simple simplemen mente te adorno adornoss del escenario. Para crear un Mapa necesitas una grilla de gráficos con los bloques que se usarán en el escenario. Luego puedes crear el Mapa: grilla = pilas. pilas.imagenes. imagenes.cargar_grilla("grillas/plataformas_10_10.png" cargar_grilla("grillas/plataformas_10_10.png", 10 10, , 10 10) ) mapa = pilas. pilas.actores. actores.Mapa(grilla)
Una vez que ejecutas esas sentencias no observarás cambios en la ventana, el mapa está, pero no tiene bloques aún. Si quieres dibujar bloques solo tienes que indicar un índice de bloque y la posición en pantalla a dibujar. Por ejemplo, un bloque cerca del centro de la ventana es la posición (8, 10): mapa. mapa.pintar_bloque(8 pintar_bloque(8, 10 10, , 1)
57
Pilas engine Documentation, Release 0.40
Otro ejemplo: ejemplo: si queremos dibujar dibujar en la parte inferior de la ventana, ventana, podemos podemos llamar muchas veces al método método pintar_bloque, una vez por cada bloque que necesitamos: El primer y segundo argumento del método pintar_bloque indica la posición en donde vamos a dibujar el bloque. bloque. En este caso la fila será 14 y la columna será será 0, 1, 2, 3, 4.. etc El tercer argumento será el índice de la grilla que indicamos anteriormente. Este será el resultado:
58
Chapter 19. Mapas y plataformas
Pilas engine Documentation, Release 0.40
19.2 Colisiones con el escenario En los juegos de plataformas es muy importante que los bloques puedan interactuar con los jugadores. Por ejemplo habrá bloques que sirvan como plataformas y otros impedirán que avancemos como si se trataran de muros. Los mapas de pilas te permiten crear esta interacción de manera sencilla. El método que usamos antes pintar_bloque, le dice al mapa que dibuje el bloque, pero a la vez te permite indicar si ese bloque es sólido o no. Diremos que un bloque es sólido cuando un personaje no puede pasar a través de él. Por ejemplo, una plataforma es un bloque sólido. Entonces, cada vez que invocas al método pintar_bloque tienes la posibilidad de indicar si el bloque es sólido o no: mapa.pintar_bloque(14, 10, 1, es_bloque_solido=True) mapa.pintar_bloque(14, 10, 1, es_bloque_solido=False)
Y ten en cuenta que si no especificas el último parámetro, pilas asumirá que el bloque debe ser sólido. Por cierto, los bloques “no sólidos” son útiles para representar adornos del escenario, como nubes o agua. Incluso en algunos juegos se usan para crear pasadizos secretos entre muros o plataformas...
19.3 Creando mapas con el programa tiled Crear los mapas directamente desde el código está bien, pero si tienes que hacer muchos mapas te llevará un montón de tiempo.
19.2. Colisiones con el escenario
59
Pilas engine Documentation, Release 0.40
Una buena alternativa a esto es usar un software de diseño de escenarios, crear un archivo con todo el escenario y luego cargarlo desde pilas. El software que te recomiendo para esta tarea se llama tiled (ver http://www.mapeditor.org). Así se ve la web del programa.
Veamos como usar tiled para crear un escenario sencillo, primero tienes que crear un mapa desde el menú File, se le solicitará indicar el tamaño del escenario:
Usa los valores por defecto, al menos por esta vez.
60
Chapter 19. Mapas y plataformas
Pilas engine Documentation, Release 0.40
Luego tienes que ir al menú Map y luego New tileset para indicar cual es la grilla de imágenes que usarás en los bloques. Te recomiendo usar la imagen batalhao.png (de Silveins Neto), que está en la carpeta de ejemplos de pilas:
Ahora, lo mas divertido, comienza a dibujar sobre el escenario seleccionando bloques. Observa que el programa tiene varias herramientas para hacer que esto sea mucho mas sencillo:
Luego, asegúrate de que el programa guarda todos los datos en formato CSV, esto es importante para que se pueda vincular con pilas. Para esto tienes que abrir el menú Edit y luego Preferences, la pantalla de opciones te tiene que quedar así:
19.3. Creando mapas con el programa tiled
61
Pilas engine Documentation, Release 0.40
Listo, ahora solamente hay que guardar el mapa en un archivo. Ve al menú File y luego selecciona Save as, tienes que darle un nombre al archivo .tmx. Luego, desde pilas, es muy simple, solamente tienes que crear el actor mapa indicando el nombre del archivo .tmx que has generado con el programa tiled: import pilas pilas.iniciar() mapa_desde_archivo = pilas.actores.Mapa("archivo.tmx")
19.4 Creando bloques sólidos con tiled Si quieres hacer bloques sólidos desde tiled solamente tienes que crear mas capas, la capa 0 se utilizará como decorado (todos los bloques son no-sólidos) y el resto de las capas serán siempre de bloques sólidos. Por ejemplo, en el escenario anterior, sería interesante colocar los bloques de pasto y la ruta en la capa que he llamado “suelo” y el resto de los objetos en otras capas como “obstáculos” y “paredes”:
62
Chapter 19. Mapas y plataformas
Pilas engine Documentation, Release 0.40
19.5 Un ejemplo completo Te recomiendo que observes el ejemplo mapa_desde_archivo.py del directorio de ejemplos de pilas, podrás observar un escenario muy simple con obstáculos y un personaje que rebota por las pareces y árboles:
Recuerda que en pilas puedes pulsar la tecla F11 para observar el area de colisión de todos los actores y plataformas:
19.5. Un ejemplo completo
63
Pilas engine Documentation, Release 0.40
64
Chapter 19. Mapas y plataformas
CHAPTER
TWENTY
COLISIONES En el desarrollo de videojuegos le damos el nombre de colisión a lo que ocurre cuando dos actores entran en contacto. Por ejemplo, cuando un personaje como Pacman toca a un Fantasma se produce una colisión. Para programar colisiones en pilas tienes seguir unos pocos pasos. • Tienes que pensar “qué” quieres hacer cuando se produce una colisión. • Escribir una función de respuesta a la colisión. • y por último decirle a pilas que actores son colisionables entre sí. Ten en cuenta que cada actor tiene un atributo llamado radio_de_colision, que se representa como un círculo de color verde cuando pulsas la tecla F12 sobre la ventana.
20.1 Un ejemplo sencillo Comencemos con un ejemplo, coloque dos actores en la pantalla de su juego: banana = pilas.actores.Banana() banana.x = 100 mono = pilas.actores.Mono()
Ahora pulse F12 para ver el área de colisión de cada actor.
65
Pilas engine Documentation, Release 0.40
El círculo de color verde indica cual es el area de colisión, y se puede cambiar si queremos con una sentencia cómo: banana.radio_de_colision = 30
Ahora, para poder mover al mono podemos enseñarle una habilidad: mono.aprender(pilas.habilidades.Arrastrable)
Ahora vamos a crear una función con lo que queremos que hagan los dos actores al entrar en contacto: def el_mono_come(mono, banana): mono.sonreir() banana.eliminar()
y por último crear dos listas de actores y decirle a pilas que asocie la función de mas arriba con la colisión: bananas = [banana] pilas.colisiones.agregar(mono, bananas, el_mono_come)
Perfecto, ahora si mueves al mono por la pantalla con el mouse podrá comer bananas. Intenta crear mas actores que representen bananas y agregarlos a la lista que usamos antes, por ejemplo: b = pilas.actores.Banana() b.x = -100 bananas.append(b)
66
Chapter 20. Colisiones
Pilas engine Documentation, Release 0.40
Ahora intenta nuevamente mover al mono... sí, las colisiones seguirán funcionando, cualquier objeto que agregues a la lista de bananas será alimento del mono... Bien, ¿y si queremos llenar la pantalla de comida?, una forma sencilla es ejecutar lo siguiente: bananas += pilas.atajos.fabricar(pilas.actores.Bananas, 20)
La pantalla se llenará de bananas, bah, habrá exactamente 20...
De hecho, si quieres tener mas control sobre las bananas que se crearán, puedes usar esta rutina de código en lugar de llamar a la función fabricar: import random cantidad_de_bananas = 20 for i in range(cantidad_de_bananas): banana = pilas.actores.Banana() banana.x = random.randrange(-200, +200) banana.y = random.randrange(-200, +200) bananas.append(banana)
20.1. Un ejemplo sencillo
67
Pilas engine Documentation, Release 0.40
68
Chapter 20. Colisiones
CHAPTER
TWENTYONE
MOTORES Internamente pilas delega toda la tarea de dibujar, manejo de eventos y multimedia en general a un motor llamado PySFML. Pero como PySFML no funciona en todos los equipos, pilas implementa una capa intermedia que le permite funcionar con otras bibliotecas, por ejemplo pygame, que funciona en muchos equipos y plataformas distintas (como OLPC). Para indicarle a pilas el motor que tiene que utilizar puede usar la siguiente sentencia: pilas.iniciar(usar_motor=’pygame’)
es decir, solamente tienes que cambiar la inicialización de la biblioteca, el resto funcionará normalmente. Ten en cuenta que generalmente en los tutoriales de pilas o en las presentanciones solamente llamamos a pilas.iniciar pero sin indicarle el motor a utilizar. Cuando no le decimos a pilas “qué” motor utilizar, pilas seleccionará a PySFML.
69
Pilas engine Documentation, Release 0.40
70
Chapter 21. Motores
CHAPTER
TWENTYTWO
SEÑALES, CALLBACKS Y EVENTOS En el desarrollo de videojuegos es muy importante tener herramientas para que el usuario pueda interactuar con el juego. En pilas se usa una estrategia llamada señales y callbacks, que se utiliza ampliamente en el desarrollo de interfaces gráficas, la web y sistemas de tiempo real.
22.1 ¿Que es un Evento? Un evento es un mensaje que emite algún componente del juego, y que pueden captar o escuchar distintos objetos para tomar una acción. Por ejemplo, el componente pilas emite señales de eventos cada vez que el usuario hace algo dentro del juego. Por ejemplo, si el usuario mueve el mouse, pilas emite la señal de evento mueve_mouse. Veamos un ejemplo de esto en la siguiente sección.
22.2 Conectando eventos a funciones Las señales de eventos solo representan un aviso de que algo ha ocurrido, pero no toman ninguna acción al respecto. Entonces, para darle utilidad a estas señales tenemos que vincularlas, de forma que puedan disparar acciones dentro de nuestro juego.
22.2.1 La función conectar La función conectar nos permite conectar una señal de evento a un método o una función. De esta forma, cada vez que se emita una determinada señal, se avisará a todos los objectos que hallamos conectado. Por ejemplo, si queremos que un personaje se mueva en pantalla siguiendo la posición del puntero del mouse, tendríamos que escribir algo como esto: import pilas mono = pilas.actores.Mono()
def mover_mono_a_la_posicion_del_mouse(evento): mono.x = evento.x mono.y = evento.y pilas.eventos.mueve_mouse.conectar(mover_mono_a_la_posicion_del_mouse)
71
Pilas engine Documentation, Release 0.40
Es decir, la señal de evento que nos interesa es mueve_mouse (que se emite cada vez que el usuario mueve el mouse). Y a esta señal le conectamos la función que buscamos ejecutar cada vez que se mueva el mouse. Nota que pueden existir tantas funciones conectadas a una señal como quieras. Y que si la función deja de existir no hace falta desconectarla. Las coordenadas que reporta el mouse son relativas al escenario y no de la ventana. Por lo tanto puedes asignar directamente el valor de las coordenadas del mouse a los actores sin efectos colaterales.
22.3 Viendo las señales antes de procesarlas Como puedes ver en la función mover_mono_a_la_posicion_del_mouse, hemos definido un parámetro llamado evento y accedimos a sus valores x e y . Cada evento tiene dentro un conjunto de valores que nos resultará de utilidad conocer. En el caso del movimiento de mouse usamos x e y , pero si el evento es la pulsación de una tecla, seguramente vamos a querer saber exactamente qué tecla se pulsó. Entonces, una forma fácil y simple de conocer el estado de un objeto es imprimir directamente su contenido, por ejemplo, en la función de arriba podíamos escribir: def mover_mono_a_la_posicion_del_mouse(evento): print evento
y en la ventana de nuestro terminar tendríamos que ver algo cómo: {’y’: 2.0, ’x’: -57.0, ’dx’: 0.0, ’dy’: -1.0}
donde claramente podemos ver lo que viene junto con el evento. Ten en cuenta que este argumento evento, en realidad, es un diccionario de python como cualquier otro, solo que puedes acceder a sus valores usando sentencias cómo diccionario.clave en lugar de diccionario[’clave’].
22.4 Desconectando señales Las señales se desconectan por cuenta propia cuando dejan de existir los objetos que le conectamos. En la mayoría de los casos podemos conectar señales y olvidarnos de desconectarlas, no habrá problemas, se deconectarán solas. De todas formas, puede que quieras conectar una señal, y por algún motivo desconectarla. Por ejemplo si el juego cambia de estado o algo así... Si ese es tú caso, simplemente asignarle un identificador único al manejador de la señal y luego usa la función desconectar indicando el identificador. Por ejemplo, las siguientes sentencias muestran eso: pilas.eventos.mueve_mouse.conectar(imprimir_posicion, uid=’drag’) pilas.eventos.mueve_mouse.desconectar(dispatch_uid=’drag’)
En la primer sentencia conecté la señal del evento a una función y le di un valor al argumento uid. Este valor será el identificador de ese enlace. Y en la siguiente linea se utilizó el identificador para desconectarla.
22.5 Consultado señales conectadas Durante el desarrollo es útil poder observar qué eventos se han conectado a funciones.
72
Chapter 22. Señales, callbacks y eventos
Pilas engine Documentation, Release 0.40
Una forma de observar la conexión de los eventos es pulsar la tecla F10. Eso imprimirá sobre consola los nombres de las señales conectadas junto a las funciones.
22.6 Referencias El concepto que hemos visto en esta sección se utiliza en muchos sistemas. Tal vez el mas conocido de estos es la biblioteca GTK, que se utiliza actualmente para construir el escritorio GNOME y Gimp entre otras aplicaciones. El sistema de señales que se utiliza en pilas se obtuvo (gentilmente) del núcleo del sistema django, dado que es brillante y se adapta muy bien a las necesidades de nuestro motor. Eso sí, lo adaptamos un poco para traducirlo a español y simplificar un poco su interfaz. Si quieres obtener mas información sobre los sistemas de señales y en particular sobre el que usamos aquí (el de django) puedes ver los siguientes documentos: • http://www.mercurytide.co.uk/news/article/django-signals/ • http://www.boduch.ca/2009/06/sending-django-dispatch-signals.html • http://docs.djangoproject.com/en/dev/topics/signals/
22.6. Referencias
73
Pilas engine Documentation, Release 0.40
74
Chapter 22. Señales, callbacks y eventos
CHAPTER
TWENTYTHREE
TEXTOS Los objetos que muestran texto en pantalla se tratan de manera similar a los actores. Por lo tanto, si ya sabes usar actores, no tendrás problemas en usar cadenas de texto.
23.1 Crear cadenas de texto El objeto que representa texto se llama Texto y está dentro del modulo actores. Para crear un mensaje tienes que escribir: texto = pilas.actores.Texto("Hola, este es mi primer texto.")
y tu cadena de texto aparecerá en pantalla en color negro y con un tamaño predeterminado:
Si quieres puedes escribir texto de varias lineas usando el caracter \n para indicar el salto de linea.
75
Pilas engine Documentation, Release 0.40
Por ejemplo, el siguiente código escribe el mismo mensaje de arriba pero en dos lineas: texto = pilas.actores.Texto("Hola (en la primer linea)\n este es mi primer texto.")
23.2 Los textos son actores Al principio comenté que los textos también son actores, esto significa que casi todo lo que puedes hacer con un actor aquí también funciona, por ejemplo: texto.x = 100 texto.escala = 2
incluso también funcionarán las interpolaciones: texto.rotacion = pilas.interpolar(360)
23.3 Propiedades exclusivas de los textos Existen varias propiedades que te permitirán alterar la apariencia de los textos. Esta es una lista de los mas importantes. • color • magnitud • texto Por ejemplo, para alterar el texto, color y tamaño de un texto podría escribir algo así: texto.magnitud = 50 # Color negro texto.color = (0, 0, 0) # Color rojo, semi transparente. texto.color = (255, 0, 0, 128) texto.texto = "Hola, este texto \n tiene 2 lineas separadas"
23.4 Mostrando mensajes en pantalla Si bien podemos crear actores Texto y manipularlos como quedarmos, hay una forma aún mas sencilla de imprimir mensajes para los usuarios. Existe una función llamada avisar que nos permite mostrar en pantalla un texto pequeño en la esquina izquierda inferior de la pantalla. pilas.avisar("Hola, esto es un mensaje.")
Esto te facilitará mucho el código en los programas pequeños como demostraciones o ejemplos.
76
Chapter 23. Textos
CHAPTER
TWENTYFOUR
HABILIDADES Pilas permite añadir funcionalidad a tus objetos de manera sencilla, dado que usamos el concepto de habilidades, un enfoque similar a la programación orientada a componentes 1 y mixins 2 .
24.1 Un ejemplo Una habilidad es una funcionalidad que está implementada en alguna clase, y que si quieres la puedes vincular a un actor cualquiera. Veamos un ejemplo, imagina que tienes un actor en tu escena y quieres que la rueda del mouse te permita cambiarle el tamaño. Puedes usar la habilidad AumentarConRueda y vincularla al actor fácilmente. El siguiente código hace eso: import pilas mono = pilas.actores.Mono() mono.aprender(pilas.habilidades.AumentarConRueda)
así, cuando uses la rueda del mouse el tamaño del personaje aumentará o disminuirá. Nota que aquí usamos la metáfora de “aprender habilidades”, porque las habilidades son algo que duran para toda la vida del actor.
24.2 Un ejemplo mas: hacer que un actor sea arrastrable por el mouse Algo muy común en los juegos es que puedas tomar piezas con el mouse y moverlas por la pantalla. Esta habilidad llamada Arrastrable representa eso, puedes vincularlo a cualquier actor y simplemente funciona: import pilas mono = pilas.actores.Mono() mono.aprender(pilas.habilidades.Arrastrable) 1 2
http://es.wikipedia.org/wiki / Programación_orientada_a_componentes http://es.wikipedia.org/wiki/Mixin
77
Pilas engine Documentation, Release 0.40
24.3 Otro ejemplo: un actor que cambia de posición Veamos otro ejemplo sencillo, si queremos que un actor se coloque en la posición del mouse cada vez que hacemos click, podemos usar la habilidad: SeguirClicks. import pilas mono = pilas.actores.Mono() mono.aprender(pilas.habilidades.SeguirClicks)
24.4 Mezclar habilidades En pilas se ha intentado hacer que las habilidades sean lo mas independientes posibles, porque claramente lo mas divertido de este enfoque es poder combinar distintas habilidades para lograr comportamientos complejos. Así que te invitamos a que pruebes y experimientes mezclando habilidades.
24.5 Otras habilidades para investigar Pilas viene con varias habiliades incluidas, pero lamentablemente este manual no las menciona a todas. Así que te recomendamos abrir un intérprete de python y consultarle directamente a él que habilidades tienes diponibles en tu versión de pilas. Para esto, abre un terminar de python y escribe lo siguiente: import pilas pilas.iniciar() dir(pilas.habilidades)
esto imprimirá en pantalla todas las habilidades como una lista de cadenas.
24.6 ¿Cómo funcionan las habilidades? Las habilidades son clases normales de python, solo que se han diseñado para representar funcionalidad y no entidades. La vinculación con los actores se produce usando herencia múltiple, una de las virtudes de python. Así que internamente lo que sucede cuando ejecutas una sentencia como: actor.aprender(pilas.habilidades.HabilidadDeEjemplo)
es que la instancia de la clase actor pasa a tener una superclase adicional, llamada HabilidadDeEjemplo. A diferencia de la programación orientada a objetos clásica, en pilas los objetos no guardan una estrecha relación con una jerarquía de clases. Por el contrario, los objetos se combinan a conveniencia, y cada clase intenta tener solamente la mínima funcionalidad que se necesita. Esta idea de combinación de objetos la hemos adoptado de la programación orientada a componentes. Por lo que puedes investigar en la red para conocer mas acerca de ello.
78
Chapter 24. Habilidades
Pilas engine Documentation, Release 0.40
24.7 ¿Ideas? Si encuentras habilidades interesantes para desarrollar te invitamos compartir tus ideas con las personas que hacemos pilas y estamos en el foro de losersjuegos 3 .
3
http://www.losersjuegos.com.ar/foro
24.7. ¿Ideas?
79
Pilas engine Documentation, Release 0.40
80
Chapter 24. Habilidades
CHAPTER
TWENTYFIVE
DEPURANDO Y BUSCANDO DETALLES Pilas incluye dos modos de ejecución que te pueden resultar de utilizar para ver en detalle el funcionamiento de tu juego.
25.1 Modo pausa pausa y manejo manejo de tiempo Si pulsas las teclas A L T + P durante la ejecución de pilas, el juego completo se detiene. En ese momento puedes espaciadora para avanzar un instante de la simulación o la tecla flech flecha a derecha derecha pulsar la tecla barra espaciadora para avanzar mas rápidamente. Esto es muy útil cuando trabajas con colisiones físicas, porque este modo de pausa y manejo de tiempo te permite ver en detalle la interacción de los objetos y detectar cualquier inconveniente rápidamente.
25.2 Modo depuración Pulsando la tecla F12 puedes ver en la pantalla de pilas un gráfico cartesiano con las posiciones en pantalla y varios figuras geométricas de los actores. Las figuras geométricas geométricas son útiles para ver las formas formas que tendrán tendrán los actores actores en una simulación simulación física. Ten en cuenta cuenta que para pilas, internamente internamente,, lo único que existen existen son esas figuras simples. simples. Las imágenes imágenes que verá un usuario al jugar a nuestros juegos serán disfraces de esas figuras.
25.3 Intercalando modos Ten en cuenta cuenta que puedes ir del modo depuración depuración al modo pausa pausa y al revés. revés. Los dos modos se pueden combinar combinar fácilmente. Mi recomendación es que ante la menor duda, pulses p para ir al modo pausa, luego F12 para ver las figuras geométricas del los objetos, y luego pulses la barra espaciadora para ir paso a paso inspeccionando la simulación del juego.
25.4 Eventos Para observar los eventos conectados a funciones puedes usar la tecla F10. Eso imprimirá sobre la consola de pilas todos los eventos que se conectaron a funciones. Esta lista es útil para esos casos donde no tienes mucha seguridad de si se han desconectado correctamentes las señales.
81
Pilas engine Documentation, Release 0.40
82
Chapter 25. Depurando y buscando detalles
CHAPTER
TWENTYSIX
GUÍA PARA DESARROLLADORES En esta sección veremos como contribuir en el desarrollo de pilas. Actualmente se utiliza un control de versiones mercurial 1 y un sistema de tickets.
26.1 Repositorio Para contribuir en el desarrollo de pilas necesitas una cuenta en bitbucket, nuestros proveedores del servicio de repositorios. La dirección de acceso web al respositorio es: • http://bitbucket.org/hugoruscitti/pilas Ten en cuenta que el servicio bitbucket es gratuito, aunque tienes que tomarte un poco de tiempo en crear la cuenta y comenzar a utilizarla.
26.2 Obteniendo la última versión del repositio Nuestro repositorio se encuentra bajo el control de versiones mercurial. Para obtener la última versión tienes que ejecutar el comando: hg clone http://bitbucket.org/hugoruscitti/pilas
El resultado del comando creará un nuevo directorio en tu sistema llamado pilas.
26.3 Primer prueba Ingresa en el directorio pilas, ejecuta el comando: python
y una vez dentro del intérprete ejecuta la sentencia: import pilas
entonces, si aparece una ventana de color gris significa que todo ha funcionado correctamente. Ahora puedes proceder a instalar la biblioteca en tu sistema. 1
http://mercurial.selenic.com
83
Pilas engine Documentation, Release 0.40
26.4 Instalación en modo desarrollo La opción de instalación mas recomendada, es la instalación en modo desarrollo. Ya que te permite mantener actualizada todo el tiempo tu versión de la biblioteca. Para usar esta opción de instalación tienes que ejecutar el siguiente comando: sudo python setup.py develop
26.5 Mantenerse actualizado, siempre... Dado que pilas está creciendo, es una buena idea mantener tu copia del motor actualizada. Para ello tienes que ingresar en el directorio pilas y ejecutar el siguiente comando de manera periodica: hg pull hg update
De hecho, si usas un lector de noticias sería recomendable que agregues este feed: • http://bitbucket.org/hugoruscitti/pilas/rss Ahí se publicarán todas las actualizaciones que se realicen sobre el repositorio.
84
Chapter 26. Guía para desarrolladores
CHAPTER
TWENTYSEVEN
GUÍA DE PREGUNTAS AVANZADAS 27.1 Obtengo errores de AttributeError por parte de pilas El funcionamiento de pilas como módulo de python es un poquito especial... porque sentencias como pilas.actores no funcionarán a menos que antes escribas pilas.iniciar(). Por lo tanto, te recomiendo que en tus programas siempre comiences con un archivo que tenga algo como esto: import pilas pilas.iniciar()
es decir, tu programa principal tiene que importar pilas y luego inicializarlo. Recién ahí podrás usar el resto de los módulos de pilas.
27.2 ¿Cómo puedo personalizar el dibujado de un actor? Cada vez que se actualiza el bucle de juego se llama al método dibujar de cada actor. Si quieres personalizar por completo la forma en que se dibuja un actor puedes redefinir el método dibujar y listo. Para mas referencias puedes ver el método dibujar de la clase Actor o el método dibujar de la clase escena.Normal, que en lugar de pintar una imagen borra todo el fondo de pantalla.
27.3 ¿A veces los sonidos no se reproducen? sip... a veces los sonidos no se reproducen porque python los libera de memoria mientras están sonando. Entonces, para solucionar el problema tienes que mantener viva la referencia al objeto Sonido cuando quieras reproducir algo. Por ejemplo:
Ejemplo incompleto def reproducir_sonido(): mi_sonido_que_no_suena = pilas.sonidos.cargar("sonido.wav.") mi_sonido_que_no_suena.reproducir() reproducir_sonido()
Ejemplo correcto
85
Pilas engine Documentation, Release 0.40
sonido = None
def reproducir_sonido(): sonido = pilas.sonidos.cargar("sonido.wav") sonido.reproducir() reproducir_sonido()
¿Cual es la diferencia?, en el primer ejemplo el sonido no se reproducirá porque la referencia mi_sonido_que_no_suena se eliminará cuando termine de ejecutar la función reproducir_sonido, mientras que en el segundo la referencia sonido seguirá existiendo mientras el sonido esté reproduciéndose.
86
Chapter 27. Guía de preguntas avanzadas
CHAPTER
TWENTYEIGHT
CÓMO FUNCIONA PILAS POR DENTRO Pilas es un proyecto con una arquitectura de objetos grande. Tiene mucha funcionalidad, incluye un motor de física, muchos personaje pre-diseñados y soporta (hasta el momento) dos motores multimedia opcionales (pygame y sfml). Mediante este capítulo quisiera explicar a grandes rasgos los componentes de pilas. Cómo están estructurados los módulos, qué hacen las clases mas importantes. El objetivo es orientar a los programadores mas avanzados para que puedan investigar pilas por dentro.
28.1 Filosofía de desarrollo Pilas es un proyecto de software libre, orientado a facilitar el desarrollo de videojuegos a personas que generalmente no hacen juegos... Por ese motivo que gran parte de las decisiones de desarrollo se tomaron reflexionando sobre cómo diseñar una interfaz de programación simple y fácil de utilizar. Un ejemplo de ello, es que elegimos el lenguaje de programación python, y tratamos de aprovechar al máximo su modo interactivo.
28.2 API en español Dado que pilas está orientado a principiantes, docentes y programadores de habla hispana. Preferimos hacer el motor en español, permitirle a los mas chicos usar su idioma para hacer juegos es alentador, tanto para ellos que observan que el idioma no es una barrera, como para los que enseñamos y queremos entusiasmar. Esta es una decisión de diseño importante, porque al mismo tiempo que incluye a muchas personas, no coincide con lo que acostumbran muchos programadores (escribir en inglés). Posiblemente en el futuro podamos ofrecer una versión de pilas alternativa en inglés, pero actualmente no es una prioridad.
28.3 Objetos y módulos Pilas incluye muchos objetos y es un sistema complejo. Pero hay una forma sencilla de abordarlo, porque hay solamente 3 componentes que son indispensables, y han sido los pilares desde las primeras versiones de pilas hasta la fecha: • Mundo • Actor • Motor
87
Pilas engine Documentation, Release 0.40
Si puedes comprender el rol y las características de estos 3 componentes el resto del motor es mas fácil de analizar. Veamos los 3 componentes rápidamente: Mundo es un objeto singleton, hay una sola instancia de esta clase en todo el sistema y se encarga de mantener
el juego en funcionamiento e interactuando con el usuario. Los actores (clase Actor) representan a los personajes de los juegos, la clase se encarga de representar todos sus atributos como la posición y comportamiento como “dibujarse en la ventana”. Si has usado otras herramientas para hacer juegos, habrás notado que se los denomina Sprites. Luego, el Motor, permite que pilas sea un motor multimedia portable y multiplaforma. Básicamente pilas delega la tarea de dibujar, emitir sonidos y controlar eventos a una biblioteca externa. Actualmente esa biblioteca puede ser pygame o SFML, y ambas reciben en nombre ‘Motor’ dentro de pilas. Ahora que lo he mencionado, veamos con un poco mas de profundidad lo que hace cada uno.
28.3.1 Inspeccionando: Mundo El objeto de la clase Mundo se construye cuando se invoca a la función pilas.iniciar. Su implementación está en el archivo mundo.py:
Su responsabilidad es inicializar varios componentes de pilas, como el sistema de controles, la ventana, etc. Uno de sus métodos mas importantes es ejecutar_bucle_principal. Un método que se invoca directamente cuando alguien escribe la sentencia pilas.ejecutar(). Si observas el código, notarás que es el responsable de mantener a todo el motor en funcionamiento. Esta es una versión muy simplificada del método ejecutar_bucle_principal: def ejecutar_bucle_principal(self, ignorar_errores=False): while not self.salir: pilas.motor.procesar_y_emitir_eventos() if not self.pausa_habilitada: self. _realizar_actualizacion_logica(ignorar_errores) self. _realizar_actualizacion_grafica()
Lo primero que debemos tener en cuenta es que este método contiene un bucle while que lo mantendrá en ejecución. Este bucle solo se detendrá cuando alguien llame al método terminar (que cambia el valor de la variable salir a True). Luego hay tres métodos importantes: • procesar_y_emitir_eventos analiza el estado de los controles y avisa al resto del sistema si ocurre algo externo, como el movimiento del mouse..
88
Chapter 28. Cómo funciona pilas por dentro
Pilas engine Documentation, Release 0.40
• _realizar_actualizacion_logica le permite a los personajes realizar una fracción muy pequeña de movimiento, poder leer el estado de los controles o hacer otro tipo de acciones. • _realizar_actualizacion_logica simplemente vuelca sobre la pantalla a todos los actores y muestra el resultado del dibujo al usuario. Otra tarea que sabe hacer el objeto Mundo, es administrar escenas. Las escenas son objetos que representan una parte individual del juego: un menú, una pantalla de opciones, el momento de acción del juego etc...
28.4 Modo interactivo Pilas soporta dos modos de funcionamiento, que técnicamente son muy similares, pero que a la hora de programar hacen una gran diferencia. • modo normal: si estás haciendo un archivo .py con el código de tu juego usarás este modo, tu programa comienza con una sentencia como iniciar y la simulación se inicia cuando llamas a pilas.ejecutar (que se encarga de llamar a ejecutar_bucle_principal del objeto mundo). • modo interactivo: el modo que generalmente se usa en las demostraciones o cursos es el modo interactivo. Este modo funciona gracias a una estructura de hilos, que se encargan de ejecutar la simulación pero a la vez no interrumpe al programador y le permite ir escribiendo código mientras la simulación está en funcionamiento.
28.5 Motores multimedia Al principio pilas delegaba todo el manejo multimedia a una biblioteca llamada SFML. Pero esta biblioteca requería que todos los equipos en donde funcionan tengan aceleradoras gráficas (al menos con soporte OpenGL básico). Pero como queremos que pilas funcione en la mayor cantidad de equipos, incluso en los equipos antiguos de algunas escuelas, añadimos soporte alternativo para una biblioteca mas accesible llamada pygame. Entonces, cuanto inicializas pilas tienes la oportunidad de seleccionar el motor a utilizar, por ejemplo la siguiente sentencia habilita el usuario de la biblioteca pygame: pilas.iniciar(usar_motor=’pygame’)
Ahora bien, ¿cómo funciona?. Dado que pilas está realizado usando orientación a objetos, usamos un concepto llamado polimorfismo: El objeto motor sabe que tiene que delegar el manejo multimedia a una instancia (o derivada) de la clase Motor (ver directorio pilas/motores/:
28.4. Modo interactivo
89
Pilas engine Documentation, Release 0.40
El motor expone toda la funcionalidad que se necesita para hace un juego: sabe crear una ventana, pintar una imagen o reproducir sonidos, entre tantas otras cosas. El objeto mundo no sabe exactamente que motor está utilizando, solo tiene una referencia a un motor y delega en él todas las tareas multimedia. La diferencia de funcionamiento radica en cómo está implementado el motor. En el caso de SFML, todas las tareas se terminan realizando sobre un contexto OpenGL (que es rápido, pero requiere un equipo relativamente moderno), y la implementación de motor que usa pygame es algo mas lenta, pero funciona en todos los equipos: OLPCs, netbook, PC antiguas o nuevas. Solo puede haber una instancia de motor en funcionamiento, y se define cuando se inicia el motor.
28.6 Sistema de actores Los actores permiten que los juegos cobren atractivo, porque un actor puede representarse con una imagen en pantalla. La implementación de todos los actores están en el directorio pilas/actores. Todos los actores heredan de la clase Actor, que define el comportamiento común de todos los actores. Por ejemplo, esta sería una versión reducida de la jerarquía de clases de los actores Mono, Pingu y Tortuga:
90
Chapter 28. Cómo funciona pilas por dentro
Pilas engine Documentation, Release 0.40
Hay dos métodos en los actores que se invocarán en todo momento: el método actualizar se invocará cuando el bucle de juego del mundo llame al método _realizar_actualizacion_logica, esto ocurre unas 60 veces por segundo. Y el otro método es dibujar, que se también se invoca desde el objeto mundo, pero esta vez en el método _realizar_actualizacion_grafica.
28.7 Modo depuración Cuando pulsas teclas como F8, F9, F10, F11 o F12 durante la ejecución de pilas, vas a ver que la pantalla comienza a mostrar información valiosa para los desarrolladores. Esta modalidad de dibujo la llamamos modo depuración, y ayuda mucho a la hora de encontrar errores o ajustar detalles. El objeto Mundo, que mantiene en ejecución al juego, tiene una instancia de objeto Depurador que se encarga de hacer estos dibujos.
28.7. Modo depuración
91
Pilas engine Documentation, Release 0.40
Las clases mas importantes a la hora de investigar el depurador están en el archivo depurador.py:
El Depurador tiene dos atributos, tiene una pizarra para dibujar y una lista de modos. Los modos pueden ser cualquiera de los que están en la jerarquía de ModoDepuracion, por ejemplo, podría tener instancias de ModoArea y ModoPuntoDeControl.
28.8 Sistema de eventos Hay varios enfoques para resolver el manejo de eventos en los videojuegos. Pilas usa un modelo conocido y elaborado llamado Observator, un patrón de diseño. Pero que lamentablemente no es muy intuitivo a primera vista. En esta sección intentaré mostrar por qué usamos esa solución y qué problemas nos ayuda a resolver. Comenzaré explicando sobre el problema de gestionar eventos y luego cómo el modelo Observator se volvió una buena solución para el manejo de eventos.
28.8.1 El problema: pooling de eventos Originalmente, en un modelo muy simple de aplicación multimedia, manejar eventos de usuario es algo sencillo, pero con el tiempo comienza a crecer y se hace cada vez mas difícil de mantener. Resulta que las bibliotecas multimedia suelen entregar un objeto evento cada vez que ocurre algo y tu responsabilidad es consultar sobre ese objeto en búsqueda de datos. Imagina que quieres crear un actor Bomba cada vez que el usuario hace click en la pantalla. El código podría ser algo así: evento = obtener_evento_actual() if evento.tipo == ’click_de_mouse’: crear_bomba(evento.x) crear_bomba(evento.x) else: # el evento de otro tipo (teclado, ventana ...) # lo descartamos.
A esta solución podríamos llamarla preguntar y responder, porque efectivamente así funciona el código, primero nos aseguramos de que el evento nos importa y luego hacemos algo. En algunos sitios suelen llamar a esta estrategia pooling. Pero este enfoque tiene varios problemas, y cuando hacemos juegos o bibliotecas se hace mas evidente. El código, a medida que crece, comienza a mezclar manejo de eventos y lógica del juego. Para ver el problema de cerca, imagina que en determinadas ocasiones quieres deshabilitar la creación de bombas, ¿cómo harías?. ¿Y si quieres que las bombas creadas se puedan mover con el teclado?.
92
Chapter 28. Cómo funciona pilas por dentro
Pilas engine Documentation, Release 0.40
28.8.2 Otro enfoque, en pilas usamos ‘Observator’ Hay otro enfoque para el manejo de eventos que me parece mas interesante, y lo he seleccionado para el motor pilas: En lugar de administrar los eventos uno a uno por consultas, delegamos esa tarea a un sistema que nos permite suscribir y ser notificado. Aquí no mezclamos nuestro código con el sistema de eventos, si queremos hacer algo relacionado con un evento, escribimos una función y le pedimos al evento que llame a nuestra función cuando sea necesario. Veamos el ejemplo anterior pero usando este enfoque, se creará una Bomba cada vez que el usuario hace click en la pantalla: def crear_bomba(evento): pilas.actores.Bomba(x=evento.x, y=evento.y) return true pilas.eventos.click_de_mouse.conectar(crear_bomba)
Si queremos que el mouse deje de crear bombas podemos ejecutar la función desconectar: pilas.eventos.click_de_mouse.conectar(crear_bomba)
o simplemente retornar False en la función crear_bomba. Nuestro código tendrá bajo acoplamiento con los eventos del motor, y no se nos mezclarán. De hecho, cada vez que tengas dudas sobre las funciones suscritas a eventos pulsa F7 y se imprimirán en pantalla.
28.8.3 ¿Cómo funciona? Ahora bien, ¿cómo funciona el sistema de eventos por dentro?: El sistema de eventos que usamos es una ligera adaptación del sistema de señales de django (un framework para desarrollo de sitios web) dónde cada evento es un objeto que puede hacer dos cosas: • suscribir funciones. • invocar a las funciones que se han suscrito.
28.8.4 1 Suscribir Por
ejemplo,
el
evento mueve_mouse es
un
objeto,
y cuando invocamos la sentencia pilas.eventos.mueve_mouse.conectar(mi_funcion), le estamos diciendo al objeto “quiero que guardes una referencia a mi_funcion“. Puedes imaginar al evento como un objeto contenedor (similar a una lista), que guarda cada una de las funciones que le enviamos con el método conectar.
28.8.5 2 Notificar La segunda tarea del evento es notificar a todas las funciones que se suscribieron. Esto se hace, retomando el ejemplo anterior, cuando el usuario hace click con el mouse. Los eventos son objetos Signal y se inicializan en el archivo eventos.py, cada uno con sus respectivos argumentos o detalles:
28.8. Sistema de eventos
93
Pilas engine Documentation, Release 0.40
click_de_mouse = dispatch.Signal(providing_args=[’button’, ’x’, ’y’]) pulsa_tecla = dispatch.Signal(providing_args=[’codigo’]) [ etc...]
Los argumentos indican información adicional del evento, en el caso del click observarás que los argumentos con el botón pulsado y la coordenada del puntero. Cuanto se quiere notificar a las funciones conectadas a un eventos simplemente se tiene que invocar al método emitir del evento y proveer los argumentos que necesita: click_de_mouse.emitir(button=1, x=30, y=50)
Eso hará que todas las funciones suscritas al evento click_de_mouse se invoquen con el argumento evento representando esos detalles: def crear_bomba(evento): print evento.x # imprimirá 30
print evento.y # imprimirá 50
[ etc...]
La
parte de pilas que se encarga de llamar a los métodos emitir es el método procesar_y_emitir_eventos del motor, por ejemplo en el archivo motores/motor_sfml.py.
28.9 Habilidades Los actores de pilas tienen la cualidad de poder ir obteniendo comportamiento desde otras clases. Esto te permite lograr resultados de forma rápida, y a la vez, es un modelo tan flexible que podrías hacer muchos juegos distintos combinando los mismos actores pero con distintas habilidades. Veamos un ejemplo, un actor sencillo como Mono no hace muchas cosas. Pero si escribimos lo siguiente, podremos controlarlo con el mouse: mono = pilas.actores.Mono() mono.aprender(pilas.habilidades.Arrastrable)
Lo que en realidad estamos haciendo, es vincular dos objetos en tiempo de ejecución. mono es un objeto Actor, y tiene una lista de habilidades que puede aumentar usando el método aprender. El método aprender toma la clase que le enviamos como argumento, construye un objeto y lo guarda en su lista de habilidades. Este es un modelo de cómo se conocen las clases entre sí:
94
Chapter 28. Cómo funciona pilas por dentro
Pilas engine Documentation, Release 0.40
Entonces, una vez que invocamos a la sentencia, nuestro actor tendrá un nuevo objeto en su lista de habilidades, listo para ejecutarse en cada cuadro de animación.
28.9.1 ¿Cómo se ejecutan las habilidades? Retomando un poco lo que vimos al principio de este capítulo, lo que mantiene con vida al juego es el bucle principal, la clase Mundo tiene un bucle que recorre la lista de actores en pantalla y por cada uno llama al método actualizar. Bien, las habilidades se mantienen en ejecución desde ahí también. Esta es una versión muy simplificada del bucle que encontrarás en el archivo mundo.py‘: def ejecutar_bucle_principa ejecutar_bucle_principal(self, l(self, ignorar_errores=False) ignorar_errores=False): : while not self.salir self.salir: : self.actualizar_actores() [ etc etc ...] ...] def actualizar_actores(self): actualizar_actores(self): for actor in pilas.acto pilas.actores.t res.todos: odos: actor.actualizar() actor.actualizar_habilidades()
Aquí puedes ver dos llamadas a métodos del actor, el método actualizar se creó para que cada programar escriba escriba ahí lo que quiera que el personaje personaje haga (leer el teclado, hacer validacion validaciones, es, moverse moverse etc). Y el método método actualizar_habilidades es el encargado de dar vida a las habilidades. Técnicamente hablando, el método actualizar_habilidades es muy simple, solamente toma la lista de objetos habilidades y los actualiza, al Actor no le preocupa en lo mas mínimo “qué” hace cada habilidad, solamente les permite ejecutar código (ver código estudiante.py, una superclase de Actor): def actualizar_habilidades( actualizar_habilidades(self self): ): for h in self. self.habilidades: h.actualizar()
28.9. Habilidades
95
Pilas engine Documentation, Release 0.40
Entonces, si queremos que un actor haga muchas cosas, podemos crear un objeto habilidad y vincularlo con el actor. actor. Esto permite generar generar “comportam “comportamiento ientos” s” re-utilizables re-utilizables,, la habilidad se codifica codifica una vez, y se puede usar muchas veces.
28.9.2 Objetos habilidad Las habilidades interactúan con los actores, y por ese motivo tienen que tener una interfaz en común, de modo tal que desde cualquier parte de pilas puedas tratar a una habilidad como a cualquier otra. La interfaz que toda habilidad debe tener es la que define la clase Habilidad del archivo habilidades.py: class Habilidad: Habilidad: def __init__(s __init__(self, elf, receptor): receptor): self.recep self.receptor tor = receptor receptor def actualizar actualizar(self (self): ): pass def eliminar(s eliminar(self): elf): pass
Tiene que tener tres métodos, uno que se ejecuta al producirle la relación con un actor, un método que se ejecutará en cada iteración del bucle de juego ( actualizar) y un último método para ejecutar cuando la habilidad se desconect desconectaa del actor. actor. Este método eliminar suele ser el que desconecta eventos o cualquier otra cosa creada temporalmente. Ten en cuenta que el método __init__ , que construye al objeto, lo invoca el propio actor desde su método aprender. Y el argumento argumento receptor será una referencia al actor que aprende la habilidad. Veamos un ejemplo muy básico, imagina que quieres hacer una habilidad muy simple, que gire al personaje todo el tiempo, cómo una aguja de reloj. Podrías hacer algo así: class GirarPorSiempre(pilas GirarPorSiempre(pilas.habilidades.Habilidad): .habilidades.Habilidad): def __init__(s __init__(self, elf, receptor): receptor): self.recep self.receptor tor = receptor receptor def actualizar actualizar(self (self): ): self.recep self.receptor.r tor.rotaci otacion on += 1 mono = pilas.acto pilas.actores.M res.Mono() ono() mono.aprender(GirarPorSiempre)
La sentencia aprender construirá construirá un objeto objeto de la clase que le indiquemos indiquemos,, y el bucle bucle de pilas (en mundo.py) dará la orden para ejecutar los métodos actualizar de cada habilidad conocida por los actores.
28.9.3 Argumentos de las habilidades En el ejemplo anterior podríamos encontrar una limitación. El actor siempre girará a la misma velocidad. Si queremos que los personajes puedan girar a diferentes velocidades tendríamos que agregarle argumentos a la habilidad, habilidad, esto es simple: simple: solo tienes tienes que llamar al método método aprender con los argumentos que quieras y asegurarte de que la habilidad los tenga definidos en su método __init__ . Este es un ejemplo de la habilidad pero que permite definir la velocidad de giro: class GirarPorSiempre (pilas. (pilas.habilidades. habilidades.Habilidad): def __init__ (self self, , receptor, receptor, velocidad velocidad= =1):
96
Chapter 28. Cómo funciona pilas por dentro
Pilas engine Documentation, Release 0.40
self.receptor = receptor self. self. self .velocidad = velocidad
def actualizar( actualizar(self self): ): self. self .receptor. receptor.rotacion += self. self.velocidad a = pilas. pilas.actores. actores.Mono() a.aprender(GirarPorSiempre, 20 20) )
Listo, es casi idéntico al anterior, si llamas a aprender con un argumento como 20 , el actor girará mucho mas rápido que antes. Y si no especificas la velocidad, se asumirá que la velocidad es 1, porque así lo indica el método __init__ .
28.9. Habilidades
97
Pilas engine Documentation, Release 0.40
98
Chapter 28. Cómo funciona pilas por dentro
CHAPTER
TWENTYNINE
REFERENCIA DEL MÓDULO PILAS Aquí encontrarás la documentación técnica del toda la biblioteca pilas, puedes usar esta sección para profundizar tus conocimientos o simplemente como referencia ante cualquier duda.
29.1 Pilas Pilas es un motor para crear videojuegos de manera simple y didáctica. Para iniciar el módulo debes llamar a la función iniciar: pilas.iniciar()
y opcionalmente puedes indicarle parámetros si quieres. Te recomiendo ejecutar la siguiente funcion para obtener mas informacion: help(pilas.iniciar)
Ten en cuenta que este motor se pude ejecutar directamente desde la consola interactiva de python, así podrás investigar y divertirte de forma interactiva. Puedes obtener mas información en nuestro sitio: • http:://www.pilas-engine.com.ar iniciar(ancho=640, alto=480, titulo=’Pilas’, usar_motor=’pysfml’, modo=’detectar’, rendimiento=60, economico=True, gravedad=(0, -90)) Inicia el motor y abre la ventana principal del videojuego. Esta funcion se ejecuta al principio de cualquier juego, porque además de crear la ventana principal inicializa otros submódulos de pilas que te permites hacer mas cosas. Un ejemplo de invocación para esta función es: pilas.iniciar()
aunque también puedes indicarle puntualmente el valor de algún argumento: pilas.iniciar(titulo=’titulo de mi juego’)
terminar() Finaliza la ejecución de pilas y cierra la ventana principal. ejecutar(ignorar_errores=False) Pone en funcionamiento el ejecutar principal. Esta función se comporta diferente en modo interactivo y modo script: •En modo interactivo pilas generará un hilo que te permitirá seguir escribiendo comandos interactivamente y viendo los resultados en la ventana.
99
Pilas engine Documentation, Release 0.40
•En modo script, la función bloqueará la ejecución lineal de tu script y llevará todo el control al bucle de juego interno de pilas. Por lo que es buena idea poner la linea pilas.ejecutar() al final del script... interpolar(valor_o_valores, duracion=1, demora=0, tipo=’lineal’) Retorna un objeto que representa cambios de atributos progresivos. El resultado de esta función se puede aplicar a varios atributos de los actores, por ejemplo: bomba = pilas.actores.Bomba() bomba.escala = pilas.interpolar(3)
Esta función también admite otros parámetros cómo: •duracion: es la cantidad de segundos que demorará toda la interpolación. •demora: cuantos segundos se deben esperar antes de iniciar. •tipo: es el algoritmo de la interpolación, puede ser ‘lineal’. avisar(mensaje) Emite un mensaje en la ventana principal.
29.2 Módulo pilas.tareas class Tareas() Contenedor de tareas a ejecutar por tiempo. El Tareas es un planificador de tareas, permite que podamos ejecutar funciones y métodos luego de transcurrido el tiempo que queramos. Por ejemplo, si se quiere que el planificardor ejecute una función dentro de dos segundos podemos escribir: pilas.add_task(2, hola) o bien, especificando argumentos para esa función: pilas.add_task(4, hola, ‘persona’) La función que se especifique como segundo argumento tiene que retornar True o False. Si retorna True será colocada nuevamente en la cola de tareas una vez que se ejecute (esto es útil para crear bucles). agregar(time_out, function, params) Agrega una nueva tarea para ejecutarse luego. update(dt ) Actualiza los contadores de tiempo y ejecuta las tareas pendientes.
29.3 Módulo pilas.escenas class Escena() Escena abstracta. class Normal(color_de_fondo=None) Representa la escena inicial mas simple.
100
Chapter 29. Referencia del módulo Pilas
Pilas engine Documentation, Release 0.40
29.4 Módulo pilas.atajos 29.5 Módulo pilas.colisiones class Colisiones() Administra todas las colisiones entre actores. agregar(grupo_a, grupo_b, funcion_a_llamar ) Agrega dos listas de actores para analizar colisiones. obtener_colisiones(actor, grupo_de_actores) Retorna una lista de los actores que colisionan con uno en particular.
29.6 Módulo pilas.eventos imprimir_todos() Muestra en consola los eventos activos y a quienes invocan
29.7 Módulo pilas.ventana 29.8 Módulo pilas.grupo class Grupo() Un grupo es un contenedor que funciona como una lista normal, pero mejorada. Los grupos pueden contener actores, y permite que a todos los actores se los pueda tratar como uno. Por ejemplo si tienes un contenedor con 20 actores, podrías ampliar el tamaño de todos ellos juntos usando la sentencia: grupo = pilas.atajos.fabricar(pilas.actores.Mono, 20) grupo.escala = 2
29.9 Módulo pilas.colores class Color(r, g, b, a=255) Representa un color en base a 4 componentes.
29.10 Módulo pilas.sonidos cargar(ruta) Carga un sonido para reproducir, donde el argumento ruta indica cual es el archivo. Por ejemplo: import pilas risa = pilas.sonidos.cargar("risa.ogg")
En caso de éxito retorna el objeto Sound, que se puede reproducir usando el método reproducir(), por ejemplo:
29.4. Módulo pilas.atajos
101
Pilas engine Documentation, Release 0.40
risa.reproducir()
El directorio de búsqueda del sonido sigue el siguiente orden: •primero busca en el directorio actual. •luego en ‘data’. •por último en el directorio estándar de la biblioteca. En caso de error genera una excepción de tipo IOError.
29.11 Módulo pilas.habilidades class Arrastrable(receptor ) Hace que un objeto se pueda arrastrar con el puntero del mouse. Cuando comienza a mover al actor se llama al metodo ‘’comienza_a_arrastrar” y cuando termina llama a ‘’termina_de_arrastrar’‘. Estos nombres de metodos se llaman para que puedas personalizar estos eventos, dado que puedes usar polimorfismo para redefinir el comportamiento de estos dos metodos. Observa un ejemplo de esto en el ejemplo pilas.ejemplos.Piezas. drag(evento ) Arrastra el actor a la posicion indicada por el puntero del mouse. drag_end (evento ) Suelta al actor porque se ha soltado el botón del mouse. try_to_drag(evento ) Intenta mover el objeto con el mouse cuando se pulsa sobre el.
class AumentarConRueda(receptor ) Permite cambiar el tamaño de un actor usando la ruedita scroll del mouse. class MoverseConElTeclado(receptor ) Hace que un actor cambie de posición con pulsar el teclado. class PuedeExplotar(receptor ) Hace que un actor se pueda hacer explotar invocando al metodo eliminar. class SeMantieneEnPantalla(receptor ) Se asegura de que el actor regrese a la pantalla si sale. Si el actor sale por la derecha de la pantalla, entonces regresa por la izquiera. Si sale por arriba regresa por abajo y asi...
class SeguirAlMouse(receptor ) Hace que un actor siga la posición del mouse en todo momento. class SeguirClicks(receptor ) Hace que el actor se coloque la posición del cursor cuando se hace click.
29.12 Módulo pilas.imagenes cargar(ruta) Intenta cargar la imagen indicada por el argumento ruta. Por ejemplo: import pilas imagen = pilas.imagenes.cargar("mi_archivo.png")
102
Chapter 29. Referencia del módulo Pilas
Pilas engine Documentation, Release 0.40
En caso de éxito retorna el objeto Image, que se puede asignar a un Actor. El directorio de búsqueda de la imagen sigue el siguiente orden: •primero busca en el directorio actual. •luego en ‘data’. •por último en el directorio estándar de la biblioteca. En caso de error genera una excepción de tipo IOError. cargar_grilla(ruta, columnas=1, filas=1) Representa una grilla de imagenes con varios cuadros de animación. Una grilla es un objeto que se tiene que inicializar con la ruta a una imagen, la cantidad de columnas y filas. Por ejemplo, si tenemos una grilla con 2 columnas y 3 filas podemos asociarla a un actor de la siguiente manera: grilla = pilas.imagenes.cargar_grilla("animacion.png", 2, 3) grilla.asignar(actor)
Entonces, a partir de ahora nuestro actor muestra solamente un cuadro de toda la grilla. Si quieres avanzar la animacion tienes que modificar el objeto grilla y asignarlo nuevamente al actor: grilla.avanzar() grilla.asignar(actor)
cargar_lienzo(ancho=640, alto=480) Representa un rectangulo (inicialmente transparente) para dibujar. Internamente el lienzo tiene un contexto cairo, lo que permite realizar dibujos vectoriales avanzados. Generalmente este objeto se utiliza usando al actor Pizarra.
29.13 Módulo pilas.mundo class Mundo(ancho, alto, titulo, fps=60, economico=True, gravedad=(0, -90) ) Representa un objeto unico que mantiene en funcionamiento al motor. Mundo tiene como responsabilidad iniciar los componentes del motor y mantener el bucle de juego. definir_escena(escena_nueva) Cambia la escena que se muestra en pantalla ejecutar_bucle_principal(ignorar_errores=False) Mantiene en funcionamiento el motor completo.
29.14 Módulo pilas.control class Control() Representa un control de teclado sencillo. Este objeto permite acceder al estado del teclado usando atributos. Por ejemplo, con este objeto, para saber si el usuario está pulsando el direccional hacia la izquierda de puede ejecutar: if pilas.control.izquierda: print ’Ha pulsado hacia la izquierda’
29.13. Módulo pilas.mundo
103
Pilas engine Documentation, Release 0.40
29.15 Módulo pilas.utils cargar_autocompletado() Carga los modulos de python para autocompletar desde la consola interactiva. colisionan(a, b ) Retorna True si dos actores estan en contacto. distancia(a, b ) Retorna la distancia entre dos numeros. distancia_entre_dos_puntos((x1, y1), (x2, y2) ) Retorna la distancia entre dos puntos en dos dimensiones. es_interpolacion(an_object ) Indica si un objeto se comporta como una colisión. esta_en_sesion_interactiva() Indica si pilas se ha ejecutado desde una consola interactiva de python. hacer_flotante_la_ventana() Hace flotante la ventana para i3 (el manejador de ventanas que utiliza hugo...) interpolable( f ) Decorador que se aplica a un metodo para que permita animaciones de interpolaciones. obtener_ruta_al_recurso(ruta) Busca la ruta a un archivo de recursos. Los archivos de recursos (como las imagenes) se buscan en varios directorios (ver docstring de image.load), así que esta función intentará dar con el archivo en cuestión.
29.16 Módulo pilas.estudiante class Estudiante() Representa la habilidad de poder realizar habiliadades y comportamientos. aprender(classname, *k, **w ) Comienza a realizar una habilidad indicada por parametros. eliminar_comportamientos() Elimina todos los comportamientos que tiene que hacer el actor. eliminar_habilidades() Elimina todas las habilidades asociadas al actor. hacer(comportamiento) Define el comportamiento para el actor de manera inmediata. hacer_luego(comportamiento, repetir_por_siempre=False ) Define un nuevo comportamiento para realizar al final. Los actores pueden tener una cadena de comportamientos, este metodo agrega el comportamiento al final de la cadena.
104
Chapter 29. Referencia del módulo Pilas
Pilas engine Documentation, Release 0.40
29.17 Módulo pilas.fps 29.18 Módulo pilas.fisica class Circulo( x, y, radio, dinamica=True, densidad=1.0, restitucion=0.56000000000000005, friccion=10.5, amortiguacion=0, fisica=None) Representa un cuerpo de circulo. class Figura() Representa un figura que simula un cuerpo fisico. class Fisica(gravedad=(0, -90)) Representa un simulador de mundo fisico, usando la biblioteca box2d. dibujar_figuras_sobre_pizarra( pizarra) Dibuja todas las figuras en una pizarra. Indicado para depuracion. obtener_cuerpos_en( x, y ) Retorna una lista de cuerpos que se encuentran en la posicion (x, y) o retorna una lista vacia []. obtener_distancia_al_suelo( x, y, dy ) Obtiene la distancia hacia abajo desde el punto (x,y). El valor de ‘dy’ tiene que ser positivo. Si la funcion no encuentra obstaculos retornara dy, pero en paso contrario retornara un valor menor a dy.
29.19 Módulo pilas.xmlreader class XmlNode(domElement ) An XML node represents a single field in an XML document. getAttributeValue(name) Returns the value of the attribute having the specified name. getChild (tag) Returns the first child node having the specified tag. getChildren(tag) Returns a list of child nodes having the specified tag. getData() Extract data from a DOM node. makeRootNode( xmlFileName) Creates the root node from an XML file.
29.20 Módulo pilas.pytweener 29.21 Módulo pilas.depurador class Depurador( fps) Esta clase permite hacer depuraciones visuales. La depuracion visual en pilas consiste en poder mostrar informacion que generalmente es invisible a los jugadores. Por ejemplo, donde estan situados los puntos de control, los radios de colision etc. Esta clase administra varios modos depuracion, que son los que dibujan figuras geometricas.
29.17. Módulo pilas.fps
105
Pilas engine Documentation, Release 0.40
29.22 Módulo pilas.comportamientos class Avanzar( pasos, velocidad=5) Desplaza al actor en la dirección y sentido indicado por una rotación. class CambiarColor(nuevo_color ) Llama a un metodo para cambiar el color de un actor. class Comportamiento() Representa un comportamiento (estrategia) que se puede anexar a un actor. actualizar() Actualiza el comportamiento en un instante dado. Si este metodo retorna True entonces el actor dejará de ejecutar este comportamiento. iniciar(receptor ) Se invoca cuando se anexa el comportamiento a un actor.
class Girar(delta, velocidad ) Hace girar constantemente al actor respecto de su eje de forma relativa. iniciar(receptor ) Define el angulo inicial.
29.23 Módulo pilas.baseactor class BaseActor( x=0, y=0 ) Define la funciondad abstracta de un actor. La responsabilidad de esta clase es: •Controlar la posicion y el area que ocupa en pantalla. La clase que extienda a este debe tener métodos para dar el tamano del sprite, informar y alterar la posicion en pantalla. actualizar() Actualiza el estado del actor. Este metodo se llama una vez por frame, y generalmente se redefine en alguna subclase. colisiona_con_un_punto( x, y ) Determina si un punto colisiona con el area del actor. eliminar() Elimina el actor de la lista de actores que se imprimen en pantalla. escala Escala de tamaño, 1 es normal, 2 al doble de tamaño etc...) espejado Indica si se tiene que invertir horizonaltamente la imagen del actor. imagen Define la imagen a mostrar. rotacion Angulo de rotación (en grados, de 0 a 360) transparencia Define el nivel de transparencia, 0 indica opaco y 100 la maxima transparencia. x Define la posición horizontal.
106
Chapter 29. Referencia del módulo Pilas
Pilas engine Documentation, Release 0.40 y Define la posición vertical. z Define lejania respecto del observador.
class Estudiante() Representa la habilidad de poder realizar habiliadades y comportamientos. aprender(classname, *k, **w ) Comienza a realizar una habilidad indicada por parametros. eliminar_comportamientos() Elimina todos los comportamientos que tiene que hacer el actor. eliminar_habilidades() Elimina todas las habilidades asociadas al actor. hacer(comportamiento) Define el comportamiento para el actor de manera inmediata. hacer_luego(comportamiento, repetir_por_siempre=False ) Define un nuevo comportamiento para realizar al final. Los actores pueden tener una cadena de comportamientos, este metodo agrega el comportamiento al final de la cadena.
29.24 Módulo pilas.camara class Camara(app) Representa el punto de vista de la ventana. Los atributos x e y indican cual debe ser el punto central de la pantalla. Por defecto estos valores con (0, 0).
29.25 Módulo pilas.interpolaciones class Interpolacion() Representa una interpolacion, que pasa por varios puntos clave. Las interpolacione se utilizan para realizar movimientos de actores en la pantalla. O simplemente para cambiar el estado de un actor de un punto a otro, por ejemplo, de 0 a 360 grados de manera gradual. Todo objeto de interpolaciones se puede asignar directamente a una propiedad de un actor. Por ejemplo: actor.rotation = pilas.interpolations.Lineal(400) note que hay un atajo para usar estos objetos, es mejor utilizar directamente una sentencias como la que sigue: actor.rotation = pilas.interpolate(360)
class Lineal(values, duration, delay ) Representa una interpolación lineal. apply(target, function) Aplica la interpolación a un actor usando un método. Esta funcionalidad se utiliza para que toda interpolación se pueda acoplar a un actor. La idea es contar con la interpolación, un actor y luego ponerla en funcionamiento: mi_interpolacion.apply(mono, set_rotation)
29.24. Módulo pilas.camara
107
Pilas engine Documentation, Release 0.40
de esta forma los dos objetos están y seguirán estando desacoplados.
29.26 Módulo pilas.fondos class Blanco() Un fondo de color blanco. class Espacio() Es un espacio con estrellas. class Noche() Muestra una escena que tiene un fondo de pantalla de paisaje. class Pasto() Muestra una escena que tiene un fondo de pantalla de paisaje. class Selva() Muestra una escena que tiene un fondo de pantalla de paisaje. class Tarde() Representa una escena de fondo casi naranja. class Volley() Muestra una escena que tiene un fondo de pantalla de paisaje.
29.27 Módulo pilas.lienzo 29.28 Módulo pilas.red 29.29 Módulo pilas.simbolos 29.30 Módulo pilas.motores.motor 29.31 Módulo pilas.motores.motor_pygame ALTO pilas.baseactor.BaseActor,
class Pygame() Representa la capa de interaccion con la biblioteca Pygame. Esto permite que tus juegos realizados con pilas funcionen en cualquier equipo que tenga instalada la biblioteca pygame, por ejemplo equipos como OLPC o simplemente aquellos que no tengan aceleradoras de graficos OpenGL.
class Canvas() Representa una superficie sobre la que se puede dibujar usando cairo. class Grilla(ruta, columnas=1, filas=1) Representa una grilla de imagenes con varios cuadros de animación. Una grilla es un objeto que se tiene que inicializar con la ruta a una imagen, la cantidad de columnas y filas. Por ejemplo, si tenemos una grilla con 2 columnas y 3 filas podemos asociarla a un actor de la siguiente manera:
108
Chapter 29. Referencia del módulo Pilas
Pilas engine Documentation, Release 0.40
grilla = pilas.imagenes.Grilla("animacion.png", 2, 3) grilla.asignar(actor)
Entonces, a partir de ahora nuestro actor muestra solamente un cuadro de toda la grilla. Si quieres avanzar la animacion tienes que modificar el objeto grilla y asignarlo nuevamente al actor: grilla.avanzar() grilla.asignar(actor)
asignar(sprite) Sets the sprite’s image with animation state. crear_grilla_de_imagenes() Genera una lista con los cuadros de animación en una grilla
class Texto(texto=’None’, x=0, y=0) Representa un texto en pantalla. El texto tiene atributos como texto, magnitud y color. color Color del texto. magnitud El tamaño del texto. texto El texto que se tiene que mostrar. generar_imagen_cairo(imagen) Retorna una superficie de cairo representando a la imagen. Esta funcion es util para pintar imagenes sobre una pizarra o el escenario de un videojuego. procesar_y_emitir_eventos() Procesa todos los eventos que la biblioteca pygame pone en una cola. pulsa_tecla(tecla) Indica si una tecla esta siendo pulsada en este instante.
class PygameActor(image=’sin_imagen.png’, x=0, y=0) Representa un objeto visible en pantalla, algo que se ve y tiene posicion. Un objeto Actor se tiene que crear siempre indicando la imagen, ya sea como una ruta a un archivo como con un objeto Image. Por ejemplo: protagonista = Actor("protagonista_de_frente.png")
es equivalente a: imagen = pilas.imagenes.cargar(“protagonista_de_frente.png”) protagonista = Actor(imagen) Luego, na vez que ha sido ejecutada la sentencia aparecerá en el centro de la pantalla el nuevo actor para que pueda manipularlo. Por ejemplo alterando sus propiedades: protagonista.x = 100 protagonista.scale = 2 protagonista.rotation = 30
Estas propiedades tambien se pueden manipular mediante interpolaciones. Por ejemplo, para aumentar el tamaño del personaje de 1 a 5 en 7 segundos: protagonista.scale = pilas.interpolar(1, 5, 7)
29.31. Módulo pilas.motores.motor_pygame
109
Pilas engine Documentation, Release 0.40
Si creas un sprite sin indicar la imagen se cargará una por defecto.
29.32 Módulo pilas.motores.motor_sfml class SFMLCanvas(ancho, alto) Representa una superficie sobre la que se puede dibujar usando cairo.
29.33 Módulo pilas.actores.actor class Actor(imagen=’sin_imagen.png’, x=0, y=0) Representa un objeto visible en pantalla, algo que se ve y tiene posicion. Un objeto Actor se tiene que crear siempre indicando la imagen, ya sea como una ruta a un archivo como con un objeto Image. Por ejemplo: protagonista = Actor("protagonista_de_frente.png")
es equivalente a: imagen = pilas.imagenes.cargar("protagonista_de_frente.png") protagonista = Actor(imagen)
Luego, na vez que ha sido ejecutada la sentencia aparecerá en el centro de la pantalla el nuevo actor para que pueda manipularlo. Por ejemplo alterando sus propiedades: protagonista.x = 100 protagonista.escala = 2 protagonista.rotacion = 30
Estas propiedades tambien se pueden manipular mediante interpolaciones. Por ejemplo, para aumentar el tamaño del personaje de 1 a 5 en 7 segundos: protagonista.escala = 1 protagonista.escala = [5], 7
Si creas un actor sin indicarle la imagen, se cargará una imagen de una pila por defecto. Usa el nombre de imagen ‘invisible.png’ si no quieres motrar ninguna imagen. actualizar() Actualiza el estado del actor. Este metodo se llama una vez por frame, y generalmente se redefine en alguna subclase. colisiona_con_un_punto( x, y ) Determina si un punto colisiona con el area del actor. destruir() Elimina a un actor pero de manera inmediata. eliminar() Elimina el actor de la lista de actores que se imprimen en pantalla. escala Escala de tamaño, 1 es normal, 2 al doble de tamaño etc...) espejado Indica si se tiene que invertir horizonaltamente la imagen del actor. imagen Define la imagen a mostrar.
110
Chapter 29. Referencia del módulo Pilas
Pilas engine Documentation, Release 0.40 rotacion Angulo de rotación (en grados, de 0 a 360) transparencia Define el nivel de transparencia, 0 indica opaco y 100 la maxima transparencia. x Define la posición horizontal. y Define la posición vertical. z Define lejania respecto del observador.
29.34 Módulo pilas.actores.disparo class Disparo( x=0, y=0, rotacion=0, velocidad=2 ) Representa un disparo que avanza. avanzar() Hace avanzar la nave en direccion a su angulo.
29.35 Módulo pilas.actores.puntaje class Puntaje(texto=’0’, x=0, y=0, color= ) Representa un contador de Puntaje
29.36 Módulo pilas.actores.nave class Nave( x=0, y=0, velocidad=2) Representa una nave que puede disparar. avanzar() Hace avanzar la nave en direccion a su angulo. definir_enemigos(grupo, cuando_elimina_enemigo=None) hace que una nave tenga como enemigos a todos los actores del grupo. El argumento cuando_elimina_enemigo tiene que ser una funcion que se ejecutara cuando se produzca la colision. disparar() Hace que la nave dispare. hacer_explotar_al_enemigo(mi_disparo, el_enemigo) Es el método que se invoca cuando se produce una colisión ‘tiro <-> enemigo’
29.37 Módulo pilas.actores.caja class Caja( x=0, y=0 ) Representa un bloque que tiene fisica como una caja.
29.34. Módulo pilas.actores.disparo
111
Pilas engine Documentation, Release 0.40
29.38 Módulo pilas.actores.piedra class Piedra( x=0, y=0, tamano=’grande’, dx=0, dy=0 ) Representa un bloque que tiene fisica como una caja.
29.39 Módulo pilas.actores.moneda 29.40 Módulo pilas.actores.opcion 29.41 Módulo pilas.actores.pelota class Pelota( x=0, y=0 ) Representa una pelota de Volley.
29.42 Módulo pilas.actores.mono class Mono( x=0, y=0 ) Representa la cara de un mono de color marrón. Este personaje se usa como ejemplo básico de un actor. Sus métodos mas usados son: •sonreir •gritar El primero hace que el mono se ría y el segundo que grite.
29.43 Módulo pilas.actores.banana class Banana( x=0, y=0 ) Representa una explosion para una bomba, dinamita etc...
29.44 Módulo pilas.actores.mapa class Mapa(grilla_o_mapa, x=0, y=0, restitucion=0.56000000000000005) Representa mapas creados a partir de imagenes mas pequeñas. Este actor te permite crear escenarios tipo tiles, una técnica de contrucción de escenarios muy popular en los videojuegos. Puedes crear un actor a partir de una grilla, e indicando cada uno los bloques o simplemente usando un programa externo llamado tiled (ver http://www.mapeditor.org). Por ejemplo, para crear un mapa desde un archivo del programa tiled puedes escribir: >>> mapa = pilas.actores.Mapa(’untitled2.tmx’)
112
Chapter 29. Referencia del módulo Pilas
Pilas engine Documentation, Release 0.40
29.45 Módulo pilas.actores.menu class Menu(opciones, x=0, y=0) Representa un bloque que tiene fisica como una caja. actualizar() Se ejecuta de manera periodica. crear_texto_de_las_opciones(opciones) Genera un actor por cada opcion del menu. cuando_mueve_el_mouse(evento ) Permite cambiar la opcion actual moviendo el mouse. Retorna True si el mouse esta sobre alguna opcion.
29.46 Módulo pilas.actores.cursordisparo class CursorDisparo( x=0, y=0 ) Representa un bloque que tiene fisica como una caja.
29.47 Módulo pilas.actores.animacion class Animacion(grilla, ciclica=False, x=0, y=0 ) Representa una animacion de una grilla de imagenes. Este actor toma una grilla de cuadros de animacion y los reproduce hasta que la animacion termina. Cuando la animacion termina se elimina a si mismo.
29.48 Módulo pilas.actores.martian class Esperando() Un actor en posicion normal o esperando a que el usuario pulse alguna tecla.
29.49 Módulo pilas.actores.utils destruir_a_todos() Elimina a los actores inmediatamente (evita que exploten o hagan algo). fabricar(clase, cantidad=1, posiciones_al_azar=True, *k, **kv ) Genera muchas intancias de objetos asignando posiciones aleatorias. insertar_como_nuevo_actor(actor ) Coloca a un actor en la lista de actores a imprimir en pantalla. obtener_actor_en( x, y ) Intenta obtener el actor mas cerca de la pantalla (z mas pequeño) en la posición (x, y) ordenar_actores_por_valor_z() Ordena todos los actores para que se impriman con ‘z’ como criterio de orden.
29.45. Módulo pilas.actores.menu
113
Pilas engine Documentation, Release 0.40
29.50 Módulo pilas.actores.pingu class Esperando() Un actor en posicion normal o esperando a que el usuario pulse alguna tecla. class Pingu( x=0, y=0 ) Representa una tortuga que se mueve por la pantalla como la tortuga de Logo.
29.51 Módulo pilas.actores.entradadetexto class EntradaDeTexto( x=0, y=0, imagen=’invisible.png’, color=, limite=10, tamano=32, fuente=’Arial’, cursor_intermitente=True) Representa una caja de texto que puede servir para ingresar texto. Este actor, en la mayoria de los casos, se utiliza para solicitarle el nombre a un usuario. Por ejemplo, cuando completa un record de puntaje.
29.52 Módulo pilas.actores.aceituna 29.53 Módulo pilas.actores.explosion class Explosion( x=0, y=0 ) Representa una explosion para una bomba, dinamita etc...
29.54 Módulo pilas.actores.boton class Boton( x=0, y=0, ruta_normal=’boton/boton_normal.png’, ruta_over=’boton/boton_over.png’ ) Representa un boton que reacciona al ser presionado.
ruta_press=’boton/boton_press.png’,
29.55 Módulo pilas.actores.temporizador 29.56 Módulo pilas.actores.animado class Animado(grilla, x=0, y=0) Representa un actor que tiene asociada una grilla con cuadros de animacion. Una de las variantes que introduce este actor es el método ‘definir_cuadro’, que facilita la animación de personajes.
29.57 Módulo pilas.actores.ejes class Ejes( x=0, y=0 ) Representa el eje de coordenadas tomado como sistema de referencia.
114
Chapter 29. Referencia del módulo Pilas
Pilas engine Documentation, Release 0.40
29.58 Módulo pilas.actores.bomba class Bomba( x=0, y=0 ) Representa una explosion para una bomba, dinamita etc... La bomba adquiere la habilidad explotar al momento de crearse, así que puedes invocar a su método “explotar” y la bomba hará un explosión con sonido en pantalla. Este es un ejemplo de uso del actor: bomba = pilas.actores.Bomba() bomba.explotar()
29.59 Módulo pilas.actores.tortuga class Tortuga( x=0, y=0, dibuja=True) Representa una tortuga que se mueve por la pantalla como la tortuga de Logo. crear_circulo(radio=30, sentido=-1) dibuja un circulo crear_poligono(lados=4, escala=100, sentido=-1) dibuja un poligono de n lados
29.60 Módulo pilas.actores.texto class Texto(texto=’None’, x=0, y=0) Representa un texto en pantalla. El texto tiene atributos como texto, magnitud y color. color Color del texto. magnitud El tamaño del texto. texto El texto que se tiene que mostrar.
29.61 Módulo pilas.actores.pizarra class Pizarra( x=0, y=0 ) Representa una superficie de dibujo inicialmente transparente. Puedes pintar sobre esta pizarra usando métodos que simulan un lapiz, que se puede mover sobre una superficie. actualizar_imagen() Se encarga de actualizar la vista de la pizarra.
29.62 Módulo pilas.actores.estrella class Estrella( x=0, y=0 ) Representa una estrella de color amarillo.
29.58. Módulo pilas.actores.bomba
115
Pilas engine Documentation, Release 0.40
29.63 Módulo pilas.dispatch.saferef “Safe weakrefs”, originally from pyDispatcher. Provides a way to safely weakref any function, including bound methods (which aren’t handled by the core weakref module).
class BoundMethodWeakref(target, onDelete=None) ‘Safe’ and reusable weak references to instance methods BoundMethodWeakref objects provide a mechanism for referencing a bound method without requiring that the method object itself (which is normally a transient object) is kept alive. Instead, the BoundMethodWeakref object keeps weak references to both the object and the function which together define the instance method.
Attributes: key – the identity key for the reference, calculated by the class’s calculateKey method applied to the target instance method deletionMethods – sequence of callable objects taking single argument, a reference to this object which will be called when either the target object or target function is garbage collected (i.e. when this object becomes invalid). These are specified as the onDelete parameters of safeRef calls. weakSelf – weak reference to the target object weakFunc – weak reference to the target function
Class Attributes: _allInstances – class attribute pointing to all live BoundMethodWeakref objects indexed by the class’s calculateKey(target) method applied to the target objects. This weak value dictionary is used to short-circuit creation so that multiple references to the same (object, function) pair produce the same BoundMethodWeakref instance. class calculateKey(target ) Calculate the reference key for this reference Currently this is a two-tuple of the id()’s of the target object and the target function respectively.
class BoundNonDescriptorMethodWeakref(target, onDelete=None) A specialized BoundMethodWeakref, for platforms where instance methods are not descriptors. It assumes that the function name and the target attribute name are the same, instead of assuming that the function is a descriptor. This approach is equally fast, but not 100% reliable because functions can be stored on an attribute named differenty than the function’s name such as in: class A: pass def foo(self): return “foo” A.bar = foo But this shouldn’t be a common use case. So, on platforms where methods aren’t descriptors (such as Jython) this implementation has the advantage of working in the most cases. get_bound_method_weakref(target, onDelete) Instantiates the appropiate BoundMethodWeakRef, depending on the details of the underlying class method implementation safeRef(target, onDelete=None) Return a safe weak reference to a callable target
target – the object to be weakly referenced, if it’s a bound method reference, will create a BoundMethodWeakref, otherwise creates a simple weakref. onDelete – if provided, will have a hard reference stored to the callable to be called after the safe reference goes out of scope with the reference object, (either a weakref or a BoundMethodWeakref) as argument.
116
Chapter 29. Referencia del módulo Pilas
Pilas engine Documentation, Release 0.40
29.64 Módulo pilas.dispatch.dispatcher class Signal( providing_args=None) Base class for all signals Internal attributes:
receivers { receriverkey (id) : weakref(receiver) } connect(receiver, sender=None, weak=True, uid=None ) Connect receiver to sender for signal. Arguments:
receiver A function or an instance method which is to receive signals. Receivers must be hashable objects. if weak is True, then receiver must be weak-referencable (more precisely saferef.safeRef() must be able to create a reference to the receiver). Receivers must be able to accept keyword arguments. If receivers have a uid attribute, the receiver will not be added if another receiver already exists with that uid.
sender The sender to which the receiver should respond Must either be of type Signal, or None to receive events from any sender. weak Whether to use weak references to the receiver By default, the module will attempt to use weak references to the receiver objects. If this parameter is false, then strong references will be used. uid An identifier used to uniquely identify a particular instance of a receiver. This will usually be a string, though it may be anything hashable. disconnect(receiver=None, sender=None, weak=True, uid=None) Disconnect receiver from sender for signal. If weak references are used, disconnect need not be called. The receiver will be remove from dispatch automatically. Arguments:
receiver The registered receiver to disconnect. May be none if uid is specified. sender The registered sender to disconnect weak The weakref state to disconnect uid the unique identifier of the receiver to disconnect esta_conectado() Indica si tiene alguna funcion conectada. imprimir_funciones_conectadas() Imprime todas las funciones que tiene conectado el evento. send (sender, **named ) Send signal from sender to all connected receivers. If any receiver raises an error, the error propagates back through send, terminating the dispatch loop, so it is quite possible to not have all receivers called if a raises an error. Arguments:
sender The sender of the signal Either a specific object or None. named Named arguments which will be passed to receivers. Returns a list of tuple pairs [(receiver, response), ... ].
29.64. Módulo pilas.dispatch.dispatcher
117
Pilas engine Documentation, Release 0.40 send_robust(sender, **named ) Send signal from sender to all connected receivers catching errors. Arguments:
sender The sender of the signal Can be any python object (normally one registered with a connect if you actually want something to occur). named Named arguments which will be passed to receivers. These arguments must be a subset of the argument names defined in providing_args. Return a list of tuple pairs [(receiver, response), ... ]. May raise DispatcherKeyError. if any receiver raises an error (specifically any subclass of Exception), the error instance is returned as the result for that receiver.
29.65 Módulo pilas.data.juegobase.ejecutar 29.66 Módulo pilas.ejemplos.colisiones class Colisiones() Es una escena que tiene un mono y algunas frutas para comer.
29.67 Módulo pilas.ejemplos.naves 29.68 Módulo pilas.ejemplos.listaseleccion 29.69 Módulo pilas.ejemplos.piezas class Pieza(escena_padre, grilla, cuadro, filas, columnas ) Representa una pieza del rompecabezas. Esta pieza se puede arrastrar con el mouse y cuando se suelta intentará conectarse con las demás. asignar_numero_de_piezas_laterales(cuadro, columnas) Guarda el numero de las piezas que se pueden conectar en sus bordes. intentar_conectarse_a(otra) Intenta vincular dos piezas, siempre y cuando coincidan en sus bordes. set_x( x) A diferencia de los actores normales, las piezas tienen que mover a todo su grupo. set_y( y) A diferencia de los actores normales, las piezas tienen que mover a todo su grupo. x Define la posición horizontal. y Define la posición vertical.
class Piezas(ruta_a_la_imagen=’ejemplos/data/piezas.png’, filas=4, columnas=4) Representa la escena de rompecabezas. La escena comienza con una imagen que se descompone en muchos actores Pieza. al_hacer_click(evento ) Atiente cualquier click que realice el usuario en la pantalla.
118
Chapter 29. Referencia del módulo Pilas
Pilas engine Documentation, Release 0.40 crear_piezas(grilla, filas, columnas ) Genera todas las piezas en base al tamaño del constructor.
29.70 Módulo pilas.ejemplos.fisica 29.71 Módulo pilas.interfaz.ingreso_de_texto 29.72 Módulo pilas.interfaz.lista_seleccion 29.73 Módulo pilas.interfaz.deslizador 29.74 Módulo pilas.interfaz.selector
29.70. Módulo pilas.ejemplos.fisica
119
Pilas engine Documentation, Release 0.40
120
Chapter 29. Referencia del módulo Pilas
MODULE INDEX
P pilas, 99 pilas.actores.aceituna, 114 pilas.actores.actor, 110 pilas.actores.animacion, 113 pilas.actores.animado, 114 pilas.actores.banana, 112 pilas.actores.bomba, 115 pilas.actores.boton, 114 pilas.actores.caja, 111 pilas.actores.cursordisparo, 113 pilas.actores.disparo, 111 pilas.actores.ejes, 114 pilas.actores.entradadetexto, 114 pilas.actores.estrella, 115 pilas.actores.explosion, 114 pilas.actores.mapa, 112 pilas.actores.martian, 113 pilas.actores.menu, 113 pilas.actores.moneda, 112 pilas.actores.mono, 112 pilas.actores.nave, 111 pilas.actores.opcion, 112 pilas.actores.pelota, 112 pilas.actores.piedra, 112 pilas.actores.pingu, 114 pilas.actores.pizarra, 115 pilas.actores.puntaje, 111 pilas.actores.temporizador, 114 pilas.actores.texto, 115 pilas.actores.tortuga, 115 pilas.actores.utils, 113 pilas.atajos, 101 pilas.baseactor, 106 pilas.camara, 107 pilas.colisiones, 101 pilas.colores, 101 pilas.comportamientos, 106 pilas.control, 103 pilas.depurador, 105 pilas.dispatch.dispatcher, 117 pilas.dispatch.saferef, 116 pilas.ejemplos.colisiones, 118 pilas.ejemplos.fisica, 119 pilas.ejemplos.piezas, 118
pilas.escenas, 100 pilas.estudiante, 104 pilas.eventos, 101 pilas.fisica, 105 pilas.fondos, 108 pilas.fps, 105 pilas.grupo, 101 pilas.habilidades, 102 pilas.imagenes, 102 pilas.interfaz.deslizador, 119 pilas.interfaz.ingreso_de_texto, 119 pilas.interfaz.lista_seleccion, 119 pilas.interfaz.selector, 119 pilas.interpolaciones, 107 pilas.lienzo, 108 pilas.motores.motor, 108 pilas.motores.motor_pygame, 108 pilas.motores.motor_sfml, 110 pilas.mundo, 103 pilas.pytweener, 105 pilas.red, 108 pilas.simbolos, 108 pilas.sonidos, 101 pilas.tareas, 100 pilas.utils, 104 pilas.ventana, 101 pilas.xmlreader, 105
121
Pilas engine Documentation, Release 0.40
122
Module Index
INDEX
A
Camara (class in pilas.camara), 107 CambiarColor (class in pilas.comportamientos), 106 Actor (class in pilas.actores.actor), 110 cargar() (in module pilas.imagenes), 102 actualizar() (pilas.actores.actor.Actor method), 110 cargar() (in module pilas.sonidos), 101 actualizar() (pilas.actores.menu.Menu method), 113 cargar_autocompletado() (in module pilas.utils), 104 actualizar() (pilas.baseactor.BaseActor method), 106 actualizar() (pilas.comportamientos.Comportamiento cargar_grilla() (in module pilas.imagenes), 103 cargar_lienzo() (in module pilas.imagenes), 103 method), 106 actualizar_imagen() (pilas.actores.pizarra.Pizarra Circulo (class in pilas.fisica), 105 colisiona_con_un_punto() (pilas.actores.actor.Actor method), 115 method), 110 agregar() (pilas.colisiones.Colisiones method), 101 colisiona_con_un_punto() (pilas.baseactor.BaseActor agregar() (pilas.tareas.Tareas method), 100 method), 106 al_hacer_click() (pilas.ejemplos.piezas.Piezas method), colisionan() (in module pilas.utils), 104 118 Colisiones (class in pilas.colisiones), 101 ALTO (in module pilas.motores.motor_pygame), 108 Colisiones (class in pilas.ejemplos.colisiones), 118 Animacion (class in pilas.actores.animacion), 113 Color (class in pilas.colores), 101 Animado (class in pilas.actores.animado), 114 color (pilas.actores.texto.Texto attribute), 115 apply() (pilas.interpolaciones.Lineal method), 107 color (pilas.motores.motor_pygame.Pygame.Texto ataprender() (pilas.baseactor.Estudiante method), 107 tribute), 109 aprender() (pilas.estudiante.Estudiante method), 104 Comportamiento (class in pilas.comportamientos), 106 Arrastrable (class in pilas.habilidades), 102 asignar() (pilas.motores.motor_pygame.Pygame.Grilla connect() (pilas.dispatch.dispatcher.Signal method), 117 method), 109 asignar_numero_de_piezas_laterales() (pi- Control (class in pilas.control), 103 crear_circulo() (pilas.actores.tortuga.Tortuga method), las.ejemplos.piezas.Pieza method), 118 115 AumentarConRueda (class in pilas.habilidades), 102 crear_grilla_de_imagenes() (piAvanzar (class in pilas.comportamientos), 106 las.motores.motor_pygame.Pygame.Grilla avanzar() (pilas.actores.disparo.Disparo method), 111 method), 109 avanzar() (pilas.actores.nave.Nave method), 111 crear_piezas() (pilas.ejemplos.piezas.Piezas method), avisar() (in module pilas), 100 118 crear_poligono() (pilas.actores.tortuga.Tortuga B method), 115 Banana (class in pilas.actores.banana), 112 crear_texto_de_las_opciones() (piBaseActor (class in pilas.baseactor), 106 las.actores.menu.Menu method), 113 Blanco (class in pilas.fondos), 108 cuando_mueve_el_mouse() (pilas.actores.menu.Menu Bomba (class in pilas.actores.bomba), 115 method), 113 Boton (class in pilas.actores.boton), 114 CursorDisparo (class in pilas.actores.cursordisparo), BoundMethodWeakref (class in pilas.dispatch.saferef), 113 116 BoundNonDescriptorMethodWeakref (class in pi- D las.dispatch.saferef), 116 definir_enemigos() (pilas.actores.nave.Nave method), 111 C definir_escena() (pilas.mundo.Mundo method), 103 Caja (class in pilas.actores.caja), 111 Depurador (class in pilas.depurador), 105 calculateKey() (pilas.dispatch.saferef.BoundMethodWeakref destruir() (pilas.actores.actor.Actor method), 110 class method), 116 destruir_a_todos() (in module pilas.actores.utils), 113
123
Pilas engine Documentation, Release 0.40
dibujar_figuras_sobre_pizarra() (pilas.fisica.Fisica method), 105 disconnect() (pilas.dispatch.dispatcher.Signal method), 117 disparar() (pilas.actores.nave.Nave method), 111 Disparo (class in pilas.actores.disparo), 111 distancia() (in module pilas.utils), 104 distancia_entre_dos_puntos() (in module pilas.utils), 104 drag() (pilas.habilidades.Arrastrable method), 102 drag_end() (pilas.habilidades.Arrastrable method), 102
getAttributeValue() (pilas.xmlreader.XmlNode method), 105 getChild() (pilas.xmlreader.XmlNode method), 105 getChildren() (pilas.xmlreader.XmlNode method), 105 getData() (pilas.xmlreader.XmlNode method), 105 Girar (class in pilas.comportamientos), 106 Grupo (class in pilas.grupo), 101
H
hacer() (pilas.baseactor.Estudiante method), 107 hacer() (pilas.estudiante.Estudiante method), 104 hacer_explotar_al_enemigo() (pilas.actores.nave.Nave E method), 111 hacer_flotante_la_ventana() (in module pilas.utils), 104 ejecutar() (in module pilas), 99 ejecutar_bucle_principal() (pilas.mundo.Mundo hacer_luego() (pilas.baseactor.Estudiante method), 107 hacer_luego() (pilas.estudiante.Estudiante method), method), 103 104 Ejes (class in pilas.actores.ejes), 114 eliminar() (pilas.actores.actor.Actor method), 110 I eliminar() (pilas.baseactor.BaseActor method), 106 eliminar_comportamientos() (pi- imagen (pilas.actores.actor.Actor attribute), 110 imagen (pilas.baseactor.BaseActor attribute), 106 las.baseactor.Estudiante method), 107 (pieliminar_comportamientos() (pi- imprimir_funciones_conectadas() las.dispatch.dispatcher.Signal method), las.estudiante.Estudiante method), 104 117 eliminar_habilidades() (pilas.baseactor.Estudiante imprimir_todos() (in module pilas.eventos), 101 method), 107 eliminar_habilidades() (pilas.estudiante.Estudiante iniciar() (in module pilas), 99 iniciar() (pilas.comportamientos.Comportamiento method), 104 method), 106 EntradaDeTexto (class in pilas.actores.entradadetexto), iniciar() (pilas.comportamientos.Girar method), 106 114 insertar_como_nuevo_actor() (in module pies_interpolacion() (in module pilas.utils), 104 las.actores.utils), 113 escala (pilas.actores.actor.Actor attribute), 110 intentar_conectarse_a() (pilas.ejemplos.piezas.Pieza escala (pilas.baseactor.BaseActor attribute), 106 method), 118 Escena (class in pilas.escenas), 100 interpolable() (in module pilas.utils), 104 Espacio (class in pilas.fondos), 108 Interpolacion (class in pilas.interpolaciones), 107 espejado (pilas.actores.actor.Actor attribute), 110 interpolar() (in module pilas), 100 espejado (pilas.baseactor.BaseActor attribute), 106 Esperando (class in pilas.actores.martian), 113 L Esperando (class in pilas.actores.pingu), 114 esta_conectado() (pilas.dispatch.dispatcher.Signal Lineal (class in pilas.interpolaciones), 107 method), 117 esta_en_sesion_interactiva() (in module pilas.utils), M 104 magnitud (pilas.actores.texto.Texto attribute), 115 Estrella (class in pilas.actores.estrella), 115 magnitud (pilas.motores.motor_pygame.Pygame.Texto Estudiante (class in pilas.baseactor), 107 attribute), 109 Estudiante (class in pilas.estudiante), 104 makeRootNode() (in module pilas.xmlreader), 105 Explosion (class in pilas.actores.explosion), 114 Mapa (class in pilas.actores.mapa), 112 Menu (class in pilas.actores.menu), 113 F Mono (class in pilas.actores.mono), 112 MoverseConElTeclado (class in pilas.habilidades), 102 fabricar() (in module pilas.actores.utils), 113 Mundo (class in pilas.mundo), 103 Figura (class in pilas.fisica), 105 Fisica (class in pilas.fisica), 105
N
G generar_imagen_cairo() (pilas.motores.motor_pygame.Pygame method), 109 get_bound_method_weakref() (in module pilas.dispatch.saferef), 116
124
Nave (class in pilas.actores.nave), 111 Noche (class in pilas.fondos), 108 Normal (class in pilas.escenas), 100
O obtener_actor_en() (in module pilas.actores.utils), 113
Index
Pilas engine Documentation, Release 0.40
obtener_colisiones() (pilas.colisiones.Colisiones method), 101 obtener_cuerpos_en() (pilas.fisica.Fisica method), 105 obtener_distancia_al_suelo() (pilas.fisica.Fisica method), 105 obtener_ruta_al_recurso() (in module pilas.utils), 104 ordenar_actores_por_valor_z() (in module pilas.actores.utils), 113
P Pasto (class in pilas.fondos), 108 Pelota (class in pilas.actores.pelota), 112 Piedra (class in pilas.actores.piedra), 112 Pieza (class in pilas.ejemplos.piezas), 118 Piezas (class in pilas.ejemplos.piezas), 118 pilas (module), 99 pilas.actores.aceituna (module), 114 pilas.actores.actor (module), 110 pilas.actores.animacion (module), 113 pilas.actores.animado (module), 114 pilas.actores.banana (module), 112 pilas.actores.bomba (module), 115 pilas.actores.boton (module), 114 pilas.actores.caja (module), 111 pilas.actores.cursordisparo (module), 113 pilas.actores.disparo (module), 111 pilas.actores.ejes (module), 114 pilas.actores.entradadetexto (module), 114 pilas.actores.estrella (module), 115 pilas.actores.explosion (module), 114 pilas.actores.mapa (module), 112 pilas.actores.martian (module), 113 pilas.actores.menu (module), 113 pilas.actores.moneda (module), 112 pilas.actores.mono (module), 112 pilas.actores.nave (module), 111 pilas.actores.opcion (module), 112 pilas.actores.pelota (module), 112 pilas.actores.piedra (module), 112 pilas.actores.pingu (module), 114 pilas.actores.pizarra (module), 115 pilas.actores.puntaje (module), 111 pilas.actores.temporizador (module), 114 pilas.actores.texto (module), 115 pilas.actores.tortuga (module), 115 pilas.actores.utils (module), 113 pilas.atajos (module), 101 pilas.baseactor (module), 106 pilas.camara (module), 107 pilas.colisiones (module), 101 pilas.colores (module), 101 pilas.comportamientos (module), 106 pilas.control (module), 103 pilas.depurador (module), 105 pilas.dispatch.dispatcher (module), 117 pilas.dispatch.saferef (module), 116 pilas.ejemplos.colisiones (module), 118 pilas.ejemplos.fisica (module), 119
Index
pilas.ejemplos.piezas (module), 118 pilas.escenas (module), 100 pilas.estudiante (module), 104 pilas.eventos (module), 101 pilas.fisica (module), 105 pilas.fondos (module), 108 pilas.fps (module), 105 pilas.grupo (module), 101 pilas.habilidades (module), 102 pilas.imagenes (module), 102 pilas.interfaz.deslizador (module), 119 pilas.interfaz.ingreso_de_texto (module), 119 pilas.interfaz.lista_seleccion (module), 119 pilas.interfaz.selector (module), 119 pilas.interpolaciones (module), 107 pilas.lienzo (module), 108 pilas.motores.motor (module), 108 pilas.motores.motor_pygame (module), 108 pilas.motores.motor_sfml (module), 110 pilas.mundo (module), 103 pilas.pytweener (module), 105 pilas.red (module), 108 pilas.simbolos (module), 108 pilas.sonidos (module), 101 pilas.tareas (module), 100 pilas.utils (module), 104 pilas.ventana (module), 101 pilas.xmlreader (module), 105 Pingu (class in pilas.actores.pingu), 114 Pizarra (class in pilas.actores.pizarra), 115 procesar_y_emitir_eventos() (pilas.motores.motor_pygame.Pygame method), 109 PuedeExplotar (class in pilas.habilidades), 102 pulsa_tecla() (pilas.motores.motor_pygame.Pygame method), 109 Puntaje (class in pilas.actores.puntaje), 111 Pygame (class in pilas.motores.motor_pygame), 108 Pygame.Canvas (class in pilas.motores.motor_pygame), 108 Pygame.Grilla (class in pilas.motores.motor_pygame), 108 Pygame.Texto (class in pilas.motores.motor_pygame), 109 PygameActor (class in pilas.motores.motor_pygame), 109
R rotacion (pilas.actores.actor.Actor attribute), 110 rotacion (pilas.baseactor.BaseActor attribute), 106
S safeRef() (in module pilas.dispatch.saferef), 116 SeguirAlMouse (class in pilas.habilidades), 102 SeguirClicks (class in pilas.habilidades), 102 Selva (class in pilas.fondos), 108 SeMantieneEnPantalla (class in pilas.habilidades), 102 send() (pilas.dispatch.dispatcher.Signal method), 117
125