Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/pilas/depurador.py
diff options
context:
space:
mode:
Diffstat (limited to 'pilas/depurador.py')
-rw-r--r--pilas/depurador.py202
1 files changed, 202 insertions, 0 deletions
diff --git a/pilas/depurador.py b/pilas/depurador.py
new file mode 100644
index 0000000..9a662f9
--- /dev/null
+++ b/pilas/depurador.py
@@ -0,0 +1,202 @@
+# -*- encoding: utf-8 -*-
+# pilas engine - a video game framework.
+#
+# copyright 2010 - hugo ruscitti
+# license: lgplv3 (see http://www.gnu.org/licenses/lgpl.html)
+#
+# website - http://www.pilas-engine.com.ar
+
+import pilas
+from pilas import pilasversion
+import sys
+
+class Depurador(object):
+ """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.
+ """
+
+ def __init__(self, lienzo, fps):
+ self.modos = []
+ self.lienzo = lienzo
+ ModoDepurador.grosor_de_lineas = 1
+ self.fps = fps
+ self.posicion_del_mouse = (0, 0)
+ pilas.eventos.mueve_mouse.conectar(self.cuando_mueve_el_mouse)
+ pilas.eventos.pulsa_tecla.conectar(self.cuando_pulsa_tecla)
+
+ def cuando_mueve_el_mouse(self, evento):
+ self.posicion_del_mouse = (evento.x, evento.y)
+ return True
+
+ def comienza_dibujado(self, motor):
+ for m in self.modos:
+ m.comienza_dibujado(motor, self.lienzo)
+
+ def dibuja_al_actor(self, motor, actor):
+ for m in self.modos:
+ m.dibuja_al_actor(motor, self.lienzo, actor)
+
+ def termina_dibujado(self, motor):
+ if self.modos:
+ self._mostrar_cantidad_de_actores(motor)
+ self._mostrar_cuadros_por_segundo(motor)
+ self._mostrar_posicion_del_mouse(motor)
+ self._mostrar_nombres_de_modos(motor)
+
+ for m in self.modos:
+ m.termina_dibujado(motor, self.lienzo)
+
+ def cuando_pulsa_tecla(self, evento):
+ if evento.codigo == 'F7':
+ self._alternar_modo(ModoInformacionDeSistema)
+ elif evento.codigo == 'F8':
+ self._alternar_modo(ModoPuntosDeControl)
+ elif evento.codigo == 'F9':
+ self._alternar_modo(ModoRadiosDeColision)
+ elif evento.codigo == 'F10':
+ self._alternar_modo(ModoArea)
+ elif evento.codigo == 'F11':
+ self._alternar_modo(ModoFisica)
+ elif evento.codigo == 'F12':
+ self._alternar_modo(ModoPosicion)
+ elif evento.texto == '+':
+ self._cambiar_grosor_de_bordes(+1)
+ elif evento.texto == '-':
+ self._cambiar_grosor_de_bordes(-1)
+
+ def _cambiar_grosor_de_bordes(self, cambio):
+ ModoDepurador.grosor_de_lineas = max(1, ModoDepurador.grosor_de_lineas + cambio)
+
+ def _alternar_modo(self, clase_del_modo):
+ clases_activas = [x.__class__ for x in self.modos]
+
+ if clase_del_modo in clases_activas:
+ self._desactivar_modo(clase_del_modo)
+ else:
+ self._activar_modo(clase_del_modo)
+
+ def _activar_modo(self, clase_del_modo):
+ pilas.eventos.inicia_modo_depuracion.send('depurador')
+ instancia_del_modo = clase_del_modo(self)
+ self.modos.append(instancia_del_modo)
+ # Ordena todos los registros por numero de tecla.
+ self.modos.sort(key=lambda x: x.orden_de_tecla())
+
+ def _desactivar_modo(self, clase_del_modo):
+ instancia_a_eliminar = [x for x in self.modos
+ if x.__class__ == clase_del_modo]
+ self.modos.remove(instancia_a_eliminar[0])
+
+ if not self.modos:
+ pilas.eventos.sale_modo_depuracion.send('depurador')
+
+ def _mostrar_nombres_de_modos(self, motor):
+ dy = 0
+ izquierda, derecha, arriba, abajo = pilas.utils.obtener_bordes()
+
+ for modo in self.modos:
+ texto = modo.tecla + " " + modo.__class__.__name__ + " habilitado."
+ self.lienzo.texto_absoluto(motor, texto, izquierda + 10, arriba -20 +dy,
+ color=pilas.colores.violeta)
+ dy -= 20
+
+ def _mostrar_posicion_del_mouse(self, motor):
+ izquierda, derecha, arriba, abajo = pilas.utils.obtener_bordes()
+ x, y = self.posicion_del_mouse
+ texto = u"PosiciĆ³n del mouse: x=%d y=%d " %(x, y)
+ self.lienzo.texto_absoluto(motor, texto, derecha - 230, abajo + 10, color=pilas.colores.violeta)
+
+ def _mostrar_cuadros_por_segundo(self, motor):
+ izquierda, derecha, arriba, abajo = pilas.utils.obtener_bordes()
+ rendimiento = self.fps.obtener_cuadros_por_segundo()
+ texto = "Cuadros por segundo: %s" %(rendimiento)
+ self.lienzo.texto_absoluto(motor, texto, izquierda + 10, abajo + 10,
+ color=pilas.colores.violeta)
+
+ def _mostrar_cantidad_de_actores(self, motor):
+ izquierda, derecha, arriba, abajo = pilas.utils.obtener_bordes()
+ total_de_actores = len(pilas.actores.todos)
+ texto = "Cantidad de actores: %s" %(total_de_actores)
+ self.lienzo.texto_absoluto(motor, texto, izquierda + 10, abajo + 30,
+ color=pilas.colores.violeta)
+
+class ModoDepurador(object):
+ tecla = "F00"
+
+ def __init__(self, depurador):
+ self.depurador = depurador
+
+ def comienza_dibujado(self, motor, lienzo):
+ pass
+
+ def dibuja_al_actor(self, motor, lienzo, actor):
+ pass
+
+ def termina_dibujado(self, motor, lienzo):
+ pass
+
+ def orden_de_tecla(self):
+ return int(self.tecla[1:])
+
+class ModoPuntosDeControl(ModoDepurador):
+ tecla = "F8"
+
+ def dibuja_al_actor(self, motor, lienzo, actor):
+ lienzo.cruz(motor, actor.x, actor.y, color=pilas.colores.rojo, grosor=ModoDepurador.grosor_de_lineas)
+
+class ModoRadiosDeColision(ModoDepurador):
+ tecla = "F9"
+
+ def dibuja_al_actor(self, motor, lienzo, actor):
+ lienzo.circulo(motor, actor.x, actor.y, actor.radio_de_colision, color=pilas.colores.verde, grosor=ModoDepurador.grosor_de_lineas)
+
+class ModoArea(ModoDepurador):
+ tecla = "F10"
+
+ def dibuja_al_actor(self, motor, lienzo, actor):
+ dx, dy = actor.centro
+ lienzo.rectangulo(motor, actor.x - dx, actor.y + dy, actor.ancho, actor.alto, color=pilas.colores.azul, grosor=ModoDepurador.grosor_de_lineas)
+
+class ModoPosicion(ModoDepurador):
+ tecla = "F12"
+
+ def __init__(self, depurador):
+ ModoDepurador.__init__(self, depurador)
+
+ def dibuja_al_actor(self, motor, lienzo, actor):
+ if not isinstance(actor, pilas.fondos.Fondo):
+ texto = "(%d, %d)" %(actor.x, actor.y)
+ lienzo.texto(motor, texto, actor.derecha, actor.abajo, color=pilas.colores.violeta)
+
+class ModoFisica(ModoDepurador):
+ tecla = "F11"
+
+ def termina_dibujado(self, motor, lienzo):
+ grosor = ModoDepurador.grosor_de_lineas
+ pilas.mundo.fisica.dibujar_figuras_sobre_lienzo(motor, lienzo, grosor)
+
+class ModoInformacionDeSistema(ModoDepurador):
+ tecla = "F7"
+
+ def __init__(self, depurador):
+ ModoDepurador.__init__(self, depurador)
+
+ self.informacion = [
+ "Usando el motor: " + pilas.mundo.motor.__class__.__name__,
+ "Sistema: " + sys.platform,
+ "Version de pilas: " + pilasversion.VERSION,
+ "Version de python: " + sys.subversion[0] + " " + sys.subversion[1],
+ ]
+
+ def termina_dibujado(self, motor, lienzo):
+ izquierda, derecha, arriba, abajo = pilas.utils.obtener_bordes()
+
+ for (i, texto) in enumerate(self.informacion):
+ posicion_y = abajo + 50 + i * 20
+ lienzo.texto(motor, texto, izquierda + 10, posicion_y, color=pilas.colores.negro)