bucle del juego falla cuando se cambian escenas

Consulte acerca de programas, técnicas, algoritmos etc.

bucle del juego falla cuando se cambian escenas

Notapor shackra » Sab Dic 29, 2012 6:45 am

También publicado en el bugtrack del proyecto xd: https://bitbucket.org/shackra/thomas-aq ... se-cambian

Muy buenas! :D

Trabajando en mi framework, thomas-aquinas, logre dibujar los tiles del escenario usando pytmx (sí quieres saber como se renderiza con SFML, revisa src/scenefactory.py de la rama task-4) para procesar archivos hechos con Tiled.

Sin embargo, tope con un enorme bache, cuando intento cambiar de una escena a otra el programa de prueba se rompe :(
La primer llamada al método changescene() (de la instancia de Director) funciona de lo más bien (como aparece en la salida del programa), sin embargo, cuando presiono la tecla flecha abajo para cambiar de escenas, el programa falla de forma repentina por una excepción AttributeError, antes de la excepción no aparece ningún mensaje que indique que la escena a cambiado, algo que me deja completamente confundido @_@.

En fin, les dejo la salida de mi programa de prueba:

jorge [~/coders/desarrollo/thomas-aquinas-prueba] ~> python2 main.py
INFO - #34 - __init__: Iniciando una instancia de la clase Conf
DEBUG - #35 - __init__: Cargando la configuración: None...
DEBUG - #180 - joinpaths: Se han de unir las siguientes carpetas ('/home/jorge', '.{game}')
DEBUG - #189 - joinpaths: Resultado hasta el momento: /home/jorge/
DEBUG - #193 - joinpaths: Retornando el resultado de la operación: /home/jorge/
DEBUG - #189 - joinpaths: Resultado hasta el momento: /home/jorge/.{game}
DEBUG - #193 - joinpaths: Retornando el resultado de la operación: /home/jorge/.{game}
/usr/lib/python2.7/site-packages/chardet/universaldetector.py:72: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
elif aBuf[:4] == '\xFF\xFE\x00\x00':
/usr/lib/python2.7/site-packages/chardet/universaldetector.py:75: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
elif aBuf[:4] == '\x00\x00\xFE\xFF':
/usr/lib/python2.7/site-packages/chardet/universaldetector.py:78: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
elif aBuf[:4] == '\xFE\xFF\x00\x00':
/usr/lib/python2.7/site-packages/chardet/universaldetector.py:81: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
elif aBuf[:4] == '\x00\x00\xFF\xFE':
/usr/lib/python2.7/site-packages/chardet/universaldetector.py:84: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
elif aBuf[:2] == '\xFF\xFE':
/usr/lib/python2.7/site-packages/chardet/universaldetector.py:87: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
elif aBuf[:2] == '\xFE\xFF':
DEBUG - #214 - __convertpath: Cadena /home/jorge/.{game} tiene codificación 'ascii'
DEBUG - #221 - __convertpath: No hay nada que convertir, no estamos en Windows
DEBUG - #214 - __convertpath: Cadena /home/jorge/.thomas-aquinas-prueba tiene codificación 'ascii'
DEBUG - #221 - __convertpath: No hay nada que convertir, no estamos en Windows
DEBUG - #180 - joinpaths: Se han de unir las siguientes carpetas (u'/home/jorge/.thomas-aquinas-prueba', 'gameconf.ini')
DEBUG - #189 - joinpaths: Resultado hasta el momento: /home/jorge/.thomas-aquinas-prueba/
DEBUG - #193 - joinpaths: Retornando el resultado de la operación: /home/jorge/.thomas-aquinas-prueba/
DEBUG - #189 - joinpaths: Resultado hasta el momento: /home/jorge/.thomas-aquinas-prueba/gameconf.ini
DEBUG - #193 - joinpaths: Retornando el resultado de la operación: /home/jorge/.thomas-aquinas-prueba/gameconf.ini
DEBUG - #214 - __convertpath: Cadena /home/jorge/.thomas-aquinas-prueba/gameconf.ini tiene codificación 'ascii'
DEBUG - #221 - __convertpath: No hay nada que convertir, no estamos en Windows
INFO - #67 - loadconf: Cargando configuración del juego...
DEBUG - #228 - __convertpath: Hemos recibido una lista
DEBUG - #230 - __convertpath: Iterando la lista...
DEBUG - #232 - __convertpath: Convirtiendo la cadena: /home/jorge/coders/desarrollo/thomas-aquinas-prueba/src/gameconf.ini...
DEBUG - #214 - __convertpath: Cadena /home/jorge/coders/desarrollo/thomas-aquinas-prueba/src/gameconf.ini tiene codificación 'ascii'
DEBUG - #221 - __convertpath: No hay nada que convertir, no estamos en Windows
DEBUG - #234 - __convertpath: Convertido: /home/jorge/coders/desarrollo/thomas-aquinas-prueba/src/gameconf.ini
DEBUG - #232 - __convertpath: Convirtiendo la cadena: /home/jorge/.thomas-aquinas-prueba/gameconf.ini...
DEBUG - #214 - __convertpath: Cadena /home/jorge/.thomas-aquinas-prueba/gameconf.ini tiene codificación 'ascii'
DEBUG - #221 - __convertpath: No hay nada que convertir, no estamos en Windows
DEBUG - #234 - __convertpath: Convertido: /home/jorge/.thomas-aquinas-prueba/gameconf.ini
INFO - #72 - loadconf: Configuración del juego cargada de forma exitosa!
INFO - #45 - loadmedia: Buscando por el audiovisual icon.png
DEBUG - #47 - loadmedia: Extensión del audiovisual: .png
DEBUG - #52 - loadmedia: El archivo icon.png es un archivo de imagen
DEBUG - #214 - __convertpath: Cadena /home/jorge/coders/desarrollo/thomas-aquinas-prueba/data/ tiene codificación 'ascii'
DEBUG - #221 - __convertpath: No hay nada que convertir, no estamos en Windows
DEBUG - #180 - joinpaths: Se han de unir las siguientes carpetas (u'/home/jorge/coders/desarrollo/thomas-aquinas-prueba/data/', 'icon.png')
DEBUG - #189 - joinpaths: Resultado hasta el momento: /home/jorge/coders/desarrollo/thomas-aquinas-prueba/data//
DEBUG - #193 - joinpaths: Retornando el resultado de la operación: /home/jorge/coders/desarrollo/thomas-aquinas-prueba/data/
DEBUG - #189 - joinpaths: Resultado hasta el momento: /home/jorge/coders/desarrollo/thomas-aquinas-prueba/data/icon.png
DEBUG - #193 - joinpaths: Retornando el resultado de la operación: /home/jorge/coders/desarrollo/thomas-aquinas-prueba/data/icon.png
DEBUG - #214 - __convertpath: Cadena /home/jorge/coders/desarrollo/thomas-aquinas-prueba/data/icon.png tiene codificación 'ascii'
DEBUG - #221 - __convertpath: No hay nada que convertir, no estamos en Windows
INFO - #101 - loadimg: Cargado el archivo de imagen /home/jorge/coders/desarrollo/thomas-aquinas-prueba/data/icon.png
DEBUG - #214 - __convertpath: Cadena /home/jorge/coders/desarrollo/thomas-aquinas-prueba/data/ tiene codificación 'ascii'
DEBUG - #221 - __convertpath: No hay nada que convertir, no estamos en Windows
DEBUG - #180 - joinpaths: Se han de unir las siguientes carpetas (u'/home/jorge/coders/desarrollo/thomas-aquinas-prueba/data/', 'maps', 'tmx/mapa de prueba isometrico.tmx')
DEBUG - #189 - joinpaths: Resultado hasta el momento: /home/jorge/coders/desarrollo/thomas-aquinas-prueba/data//
DEBUG - #193 - joinpaths: Retornando el resultado de la operación: /home/jorge/coders/desarrollo/thomas-aquinas-prueba/data/
DEBUG - #189 - joinpaths: Resultado hasta el momento: /home/jorge/coders/desarrollo/thomas-aquinas-prueba/data/maps/
DEBUG - #193 - joinpaths: Retornando el resultado de la operación: /home/jorge/coders/desarrollo/thomas-aquinas-prueba/data/maps/
DEBUG - #189 - joinpaths: Resultado hasta el momento: /home/jorge/coders/desarrollo/thomas-aquinas-prueba/data/maps/tmx/mapa de prueba isometrico.tmx
DEBUG - #193 - joinpaths: Retornando el resultado de la operación: /home/jorge/coders/desarrollo/thomas-aquinas-prueba/data/maps/tmx/mapa de prueba isometrico.tmx
DEBUG - #214 - __convertpath: Cadena /home/jorge/coders/desarrollo/thomas-aquinas-prueba/data/maps/tmx/mapa de prueba isometrico.tmx tiene codificación 'ascii'
DEBUG - #221 - __convertpath: No hay nada que convertir, no estamos en Windows
INFO - #70 - loadmap: Cargando las baldosas del escenario...
DEBUG - #214 - __convertpath: Cadena /home/jorge/coders/desarrollo/thomas-aquinas-prueba/data/ tiene codificación 'ascii'
DEBUG - #221 - __convertpath: No hay nada que convertir, no estamos en Windows
DEBUG - #180 - joinpaths: Se han de unir las siguientes carpetas (u'/home/jorge/coders/desarrollo/thomas-aquinas-prueba/data/', 'maps/tilesets/baldosas isometricas de prueba.png')
DEBUG - #189 - joinpaths: Resultado hasta el momento: /home/jorge/coders/desarrollo/thomas-aquinas-prueba/data//
DEBUG - #193 - joinpaths: Retornando el resultado de la operación: /home/jorge/coders/desarrollo/thomas-aquinas-prueba/data/
DEBUG - #189 - joinpaths: Resultado hasta el momento: /home/jorge/coders/desarrollo/thomas-aquinas-prueba/data/maps/tilesets/baldosas isometricas de prueba.png
DEBUG - #193 - joinpaths: Retornando el resultado de la operación: /home/jorge/coders/desarrollo/thomas-aquinas-prueba/data/maps/tilesets/baldosas isometricas de prueba.png
DEBUG - #214 - __convertpath: Cadena /home/jorge/coders/desarrollo/thomas-aquinas-prueba/data/maps/tilesets/baldosas isometricas de prueba.png tiene codificación 'ascii'
DEBUG - #221 - __convertpath: No hay nada que convertir, no estamos en Windows
INFO - #101 - loadimg: Cargado el archivo de imagen /home/jorge/coders/desarrollo/thomas-aquinas-prueba/data/maps/tilesets/baldosas isometricas de prueba.png
DEBUG - #131 - loadmap: gid: 1, flag: 0
DEBUG - #131 - loadmap: gid: 4, flag: 0
DEBUG - #131 - loadmap: gid: 2, flag: 0
DEBUG - #131 - loadmap: gid: 3, flag: 0
DEBUG - #131 - loadmap: gid: 5, flag: 0
DEBUG - #131 - loadmap: gid: 6, flag: 0
INFO - #134 - loadmap: Carga de baldosas exitosa!
INFO - #155 - changescene: Cambiando de escena: <Scene: HelloWorld, file: /home/jorge/coders/desarrollo/thomas-aquinas-prueba/src/scenes/escena_1.py>
Traceback (most recent call last):
File "main.py", line 9, in <module>
director.loop()
File "/home/jorge/coders/desarrollo/thomas-aquinas-prueba/src/scenemanager.py", line 118, in loop
type(self.__actualscene)))
src.scenemanager.TAAttrIsNotScene: Objeto <type 'instance'> no es instancia de SceneFactory


Sé que mi programa de prueba no les va a correr, pero aquí le dejos el código fuente de susodicho programa:

main.py:
# encoding: utf-8
from src import common
from src import scenemanager
from src.scenes import escena_1

director = scenemanager.Director("icon.png")
holamundo_1 = escena_1.Helloworld(director)
director.changescene(holamundo_1)
director.loop()


escena_1.py:
# encoding: utf-8
from src.scenefactory import AbstractScene
import sfml
from src import common
import escena_2

class Helloworld(AbstractScene):
def __init__(self, scenemanager):
AbstractScene.__init__(self, scenemanager)
self.__tipografia = sfml.Font.get_default_font()
self.texto = sfml.Text(self.__str__())
self.texto.font = self.__tipografia
self.texto.character_size = 10
self.texto.style = sfml.Text.BOLD
self.texto.color = sfml.Color.WHITE
self.loadmap("tmx/mapa de prueba isometrico.tmx")

def on_event(self, event):
if type(event) is sfml.KeyEvent and event.pressed:
if event.code == common.settings.getcontrollerbutton("down_button"):
self.irescena2()

def on_update(self):
pass

def on_draw(self, window):
self.drawmap()
window.draw(self.texto)

def irescena2(self):
escena = escena_2.HelloWorld(self.scenemanager)
self.scenemanager.changescene(escena)

def __str__(self):
return "<Scene: HelloWorld, file: {0}>".format(__file__)


escena_2.py:
# encoding: utf-8
from src.scenefactory import AbstractScene
import sfml
from src import common
import escena_1

class Helloworld(AbstractScene):
def __init__(self, scenemanager):
AbstractScene.__init__(self, scenemanager)
self.__tipografia = sfml.Font.get_default_font()
self.texto = sfml.Text(self.__str__())
self.texto.font = self.__tipografia
self.texto.character_size = 10
self.texto.style = sfml.Text.BOLD
self.texto.color = sfml.Color.WHITE
self.loadmap("tmx/mapa prueba.tmx")

def on_event(self, event):
if type(event) is sfml.KeyEvent and event.pressed:
if event.code == common.settings.getcontrollerbutton("up_button"):
self.irescena1()

def on_update(self):
pass

def on_draw(self, window):
self.drawmap()
window.draw(self.texto)

def irescena1(self):
escena = escena_1.HelloWorld(self.scenemanager)
self.scenemanager.changescene(escena)

def __str__(self):
return "<Scene: HelloWorld, file: {0}>".format(__file__)


Para ver el modulo scenemanager y scenefactory sólo visiten el repositorio del proyecto, rama task-4.

Gracias por la posible ayuda y un saludo! :)
Avatar de Usuario
shackra
 
Mensajes: 308
Registrado: Lun Jun 15, 2009 4:10 pm
Ubicación: Costa Rica

Re: bucle del juego falla cuando se cambian escenas

Notapor Barajas » Sab Dic 29, 2012 7:30 pm

No veo nada malo con el código de las escenas. Pero como nos dice el interpetre de python, parece que el erroy existe pero en el archivo scenemanager.py, en el método loop l, en la linea 118.
type(self.__actualscene)))
src.scenemanager.TAAttrIsNotScene: Objeto <type 'instance'> no es instancia de SceneFactory

De cualquier manera, seria bueno ver el código del scenemanager para ver lo del problema.
Vi veri universum vivus vici
Avatar de Usuario
Barajas
 
Mensajes: 209
Registrado: Mar Nov 16, 2010 12:06 am

Re: bucle del juego falla cuando se cambian escenas

Notapor shackra » Sab Dic 29, 2012 8:39 pm

Barajas escribió:De cualquier manera, seria bueno ver el código del scenemanager para ver lo del problema.


servido:

scenemanager.py de la rama task-4:
# coding: utf-8
# This file is part of Thomas Aquinas.
#
# Thomas Aquinas is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Thomas Aquinas is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Thomas Aquinas. If not, see <http://www.gnu.org/licenses/>.
#
# veni, Sancte Spiritus.

import logging
import common
import sfml
import media

class TAGlobalVariableException(Exception): pass
class TAAttrIsNotScene(Exception): pass

class Director:
"""Objeto principal del juego.

Aquí es donde sucede toda la magia. Dibujamos, actualizamos
y propagamos eventos entre clases derivadas de
la clase AbstractScene.

El diseño de esta clase esta fuertemente basada en director.py
del proyecto Asadetris desarrollado por Hugo de LosersJuegos"""

def __init__(self, icon=None):
self.window = sfml.RenderWindow(sfml.VideoMode(
common.settings.getscreensize()[0],
common.settings.getscreensize()[1]),
common.settings.getscreentitle())
self.window.framerate_limit = 60
if icon:
self.window.icon = media.loadmedia(icon).pixels

self.__actualscene = None
self.__fullscreenmode = False
self.__exitgame = False
# revisar si hay Joysticks conectados al PC.
self.__globalvariables = {}
self.__camera = sfml.View()
# Reiniciamos la camara al tamaño de la pantalla.
self.__camera.reset(sfml.Rectangle((0, 0),
common.settings.getscreensize()))

# Iniciamos algunas variables globales
self.setglobalvariable("game title",
common.settings.getscreentitle())

def __getitem__(self, item):
return self.__globalvariables[str(item)]

def __iter__(self):
return self.__globalvariables.items()

def movecamera(self, playerx, playery):
""" Mueve la cámara del juego.

Esta es la forma más sencilla de realizar la técnica del
'screen scrolling'. Nos hemos basado en los cálculos realizados
por CodingMadeEasy y en el uso de objetos sfml.View.

Para mover la cámara de acuerdo al movimiento del jugador
este método debe ser llamado en algún momento dentro de una
instancia de la clase AbstractScene con las coordenadas del
sprite del jugador.
"""
screensizex, screensizey = common.settings.getscreensize()
camerax = -(screensizex / 2) + playerx
cameray = -(screensizey / 2) + playery

if camerax < 0: camerax = 0
if cameray < 0: cameray = 0

self.__camera.viewport = sfml.Rectangle((camerax, cameray),
(camerax + screensizex,
cameray + screensizey))

def loop(self):
"¡El juego se pone en marcha!"

timesleep = sfml.milliseconds(10)

while not self.__exitgame:
# propagación de eventos
for event in self.window.events:
if type(event) is sfml.CloseEvent:
self.__exitgame = True
logging.info("Cerrando el programa...")
logging.info("Salvando la configuracion...")
common.settings.saveconf()
logging.info("Configuracion del juego salvada!")
# logging.info("Guardando las variables globales...")
# pass
# logging.info("Variables globales salvadas!")
logging.info("¡Gracias por jugar!")
elif type(event) is sfml.KeyEvent and event.pressed:
if event.code is sfml.Keyboard.F3:
# alternamos entre modo pantalla completa y modo ventana
self.alternatefullscreenmode()

# Le pasamos el evento a la escena para que haga algo
try:
self.__actualscene.on_event(event)
except AttributeError:
raise TAAttrIsNotScene, ("Objeto {0} no tiene "
"atributo on_event".format(
type(self.__actualscene)))
## TODO:
# Le pasamos el evento al dialogo para que haga algo
#self.__widgetmanager.on_event(event)

# actualizamos la escena
try:
self.__actualscene.on_update()
except AttributeError:
raise TAAttrIsNotScene, ("Objeto {0} no tiene "
"atributo on_update".format(
type(self.__actualscene)))

# dibujamos la escena
self.window.clear(sfml.Color.BLACK)
try:
self.__actualscene.on_draw(self.window)
except AttributeError:
raise TAAttrIsNotScene, ("Objeto {0} no es "
"instancia de SceneFactory".format(
type(self.__actualscene)))
# TODO: crear un sistema de widgets personalisable
# con CSS.
# TODO: Dibujamos los widgets
# self.__widgetmanager.on_draw(self.window)
self.window.view = self.__camera
self.window.display()

# dormimos la aplicación unos milisegundos
sfml.sleep(timesleep)

## GAME OVER!

self.window.close()

def changescene(self, scene):
"Cambia la escena actual."
if isinstance(scene, SceneFactory):
logging.info("Cambiando de escena: {0}".format(scene))
self.__actualscene = scene
else:
raise TAAttrIsNotScene, ("El objeto {0} no es instancia "
"de SceneFactory".format(type(scene)))

def alternatefullscreenmode(self):
"Alterna entre modo pantalla completa y modo ventana"
if not self.__fullscreenmode:
self.window.recreate(
sfml.VideoMode(self.window.width,
self.window.height),
self.getglobalvariable("game title"),
sfml.Style.FULLSCREEN)
self.__fullscreenmode = True
else:
self.window.recreate(
sfml.VideoMode(self.window.width,
self.window.height),
self.getglobalvariable("game title"))
self.__fullscreenmode = False

def setglobalvariable(self, name, value):
""" Crea una variable global a la cual cualquier escena puede acceder.

es algo difícil compartir datos entre escenas, por ello se usara la
clase Director para almacenar variables que luego puedan ser usadas
por otras escenas.
"""
self.__globalvariables[str(name)] = value

def getglobalvariable(self, name):
""" Retorna alguna el valor de alguna variable global.
"""
if self.__globalvariables.has_key(str(name)):
return self.__globalvariables[str(name)]
else:
raise TAGlobalVariableException, "{0} variable no definida".format(
name)

def delglobalvariable(self, name):
""" Borra una variable global previamente definida.
"""
if self.__globalvariables.has_key(str(name)):
self.__globalvariables.pop(str(name))
Avatar de Usuario
shackra
 
Mensajes: 308
Registrado: Lun Jun 15, 2009 4:10 pm
Ubicación: Costa Rica

Re: bucle del juego falla cuando se cambian escenas

Notapor Barajas » Sab Dic 29, 2012 11:11 pm

Esta parte del código:

try:
self.__actualscene.on_draw(self.window)
except AttributeError:
raise TAAttrIsNotScene, ("Objeto {0} no es "
"instancia de SceneFactory".format(
type(self.__actualscene)))


Y por lo que revelo el error...

Traceback (most recent call last):
File "main.py", line 9, in <module>
director.loop()
File "/home/jorge/coders/desarrollo/thomas-aquinas-prueba/src/scenemanager.py", line 118, in loop
type(self.__actualscene)))
src.scenemanager.TAAttrIsNotScene: Objeto <type 'instance'> no es instancia de SceneFactory


Lo cual es muy razonable.

Intento ejecutar la linea:
self.__actualscene.on_draw(self.window)


Pero como eso mandaba error, decidió ejecutar la siguiente linea.

raise TAAttrIsNotScene, ("Objeto {0} no es " 
"instancia de SceneFactory".format(
type(self.__actualscene)))

Que es la cual manda el error.
Solo dos cosas, ¿No debería existir un a coma después de "no es " ?.

Y lo que asumo que paso a self.__actualscene.on_draw(self.window) pudo ejecutarle.

Mi recomendación es que cambies esa linea del try-except solo por lo contenido dentro de try, y que el interprete te diga por que razón no puede ejecutar "self.__actualscene.on_draw(self.window)"
Vi veri universum vivus vici
Avatar de Usuario
Barajas
 
Mensajes: 209
Registrado: Mar Nov 16, 2010 12:06 am

Re: bucle del juego falla cuando se cambian escenas

Notapor shackra » Dom Dic 30, 2012 5:23 am

Barajas escribió:¿No debería existir un a coma después de "no es " ?.


No, para nada, en realidad si le pongo una coma, el truco no funciona:
>>> print ("hola "
"mundo")
hola mundo


El error no tiene mucho sentido por que al darle la primer escena (ver main.py) el error no salta, solamente cuando le doy otra escena dentro de la escena que le di primero, el error si salta :(
Avatar de Usuario
shackra
 
Mensajes: 308
Registrado: Lun Jun 15, 2009 4:10 pm
Ubicación: Costa Rica

Re: bucle del juego falla cuando se cambian escenas

Notapor shackra » Dom Dic 30, 2012 6:53 am

Barajas, Barajas... Hombre ¿tú me creerías sí te digo que no tengo ninguna clase llamada HelloWorld en ninguna parte? ... Que vergonzoso son los dedasos xd. Yo tengo mis dos clases como Helloworld no como HelloWorld!!

Python sí notificó sobre un error, que en la salida es virtualmente invisible, cuando use pdb para depurar mi programa de prueba, ahora las escenas sí se intercambian a la orden del teclado, que dicha! :'D

gracias por la ayuda, un saludo xd
Avatar de Usuario
shackra
 
Mensajes: 308
Registrado: Lun Jun 15, 2009 4:10 pm
Ubicación: Costa Rica


Volver a General

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados

cron