jueves, 14 de julio de 2011

Video Juegos en Python: Un paréntesis (Parte II)

Otro paréntesis, si me lo permiten (y sino también):

El arte y ciencia de producir videojuegos es muy novedoso y creo que necesitamos ir sistematizando los conceptos y técnicas.  Sistematizar es algo que les viene fácil a ustedes como estudiantes de sistemas.  Comenzaré por sugerirles una lectura es castellano sobre las bases conceptuales de los videojuegos (el enlace aquí, por cierto es una traducción por Ciro Duran).  No lo he leido completo, pero ojeandolo encontré esto que dice el autor con respecto a la "ciencia y arte de diseñar videojuegos":

En unos pocos años hemos alcanzado finalmente lo que yo veo como una masa crítica de escritura de conceptos, análisis formales y entendimiento práctico y teórico para ser capaces de llenar el curriculum de una universidad... o por lo menos, en este caso, un curso de diez semanas.

Ok, eso no es enteramente justo. Existe actualmente una gran cantidad de material relacionado con el diseño de juegos y muchos libros (con muchos más siendo publicados a un ritmo alarmante). Pero la gran mayoría o bien es inútil, o es una lectura tan densa que nadie en el campo se molesta en leerlo. Las lecturas que tendremos en este curso son aquellas que, cualquiera que sea la razón, se han impregnado en la industria; muchos diseñadores profesionales ya están familiarizados con ellas.
 Voy a poner mi imaginación a volar un poco y me disculpan estos ensueños: ¿Se imagínan ustedes una carrera universitaria llamada "Ingeniería de Video Juegos"? ¿Como sería el campo laboral? ¿El Pensum de la carrera? Supongo yo que deberiamos estudiar cosas como estas:

  • Bases conceptuales de los video juegos
  • Diseño Gráfico
  • Animación
  • Sonido
  • Juegos de Aventura, RPG y Ficción Interactiva
  • Juegos de Estrategia
  • Juegos de Simulación: SimCity, Los Sims
  • Juegos Educativos.
  • Aspectos psicológicos: ¿qué tipo de videojuegos activan o desarrollan ciertas habilidades psico-motoras? ¿Qué hace un video juego adictivo? ¿Qué hace un videojuego divertido? ¿Como se hace un video juego educativo, según el tema a enseñar y la edad?
  • Publicidad y videojuegos: Mercadeo viral a través de videojuegos.
  • Comercialización de videojuegos y la industria de los videojuegos.
  • Videojuegos para dispositivos móviles: ¿como explotar la interconectividad?

¿Qué opinan ustedes? ¿Estudiarían una carrera así? ¿Les parece relevante o algo que pueda tener un campo laboral interesante?  Bueno, soñar no cuesta nada- volvamos a un plano más inmediato...

En este momento, una sistematización interesante por realizar sería la del uso de la librería PyGame.  Les pido a todos los que usaron esta librería que echen el cuento sobre cuales referencias o tutoriales les fueron útiles para aprender sobre PyGame.  Una vez que se dispusieron a usarlo, ¿se dieron cuenta si existe algún workflow (flujo de trabajo) para usar Pygame? Me refiero a lo siguiente: me imagino que primero tienen que declarar y activar una ventana (¿qué es una ventana y como se hace eso?), luego dibujan cosas sobre la ventana mediante blits (¿que es un blit?) y hacen un update (¿que es un update?)  Si quieren ponerse sofisticados con la animación y lograr algo de calidad, utilizarían un sprite, pero, ¿qué es un sprite?  ¿Se dan cuenta de hacia adonde quiero llegar? Pygame ofrece un conjunto de herramientas estándar para crear video juegos, pero para poder usarlas hay que manejar algo de terminología, y saber de antemano para qué tipo de tareas se utilizan las distintas herramientas.  Quisiera que de todo esto hicieramos una especie de manual de PyGame para dummies.

Al grupo de "El ahorcado", que utilizó el Tkinter, le hago la misma invitación.  ¿Existe algún texto sencillo que nos pueda instruir sobre su uso y el manejo de la terminología básica?  Como se acordarán, el documento que usamos en clase no era particularmente sencillo.

Traten de participar bastante en este post, pues la temática es universal para todos los video juegos.  De lo contrario, creo que tendré que hacer yo mismo un videojuego para lanzar estudiantes por la ventana desde el tercer piso de la UNEFA y así liberar mi frustración de no ver a los estudiantes participar.  Ahora, hablando en serio, en verdad quisiera que no dejáramos este tema hasta este semestre.  Sería excelente si terminaran de desarrollar sus videojuegos.  Y sería mejor aún si algunos de ustedes continuasen explotando esto para su provecho profesional.  Creo sinceramente que hay material para que lo puedan lograr.

11 comentarios:

  1. ¿Una Ventana? no son más que objetos. Si estoy equivocado por favor corríjanme para eso estamos aquí para aprender unos de otros.

    Así se crea una ventana en Pygame

    screen = pygame.display.set_mode((600, 400))
    pygame.display.set_caption(‘Titulo del Juego’)
    screen = pygame.display.get_surface()

    La primera linea indica el ancho y el alto. (WIDTHxHEIGHT).
    La segunda coloca el titulo de la ventana.
    La Tercera Hace que esta ventana sirva para mostrar todas las imágenes.

    Tenemos que tener una función en un bucle infinito para solucionar dos posibles problemas que pueden presentarse. Uno que debemos mantener la ventana abierta, y el otro es que al ejecutar la función se detecten los eventos de mouse teclado, y entre ellos, el evento de pulsar la X, para cerrar la ventana.

    La función la hacemos de la siguiente manera:

    def detectarEventos(eventos):
    for evento in eventos:
    if evento.type == QUIT:
    sys.exit(0)

    En mi Proyecto yo utilice lo siguiente:

    #Manejo de eventos-eventos claves
    while True:
    for i in pygame.event.get():
    if i.type==QUIT:
    exit()
    presionartecla=pygame.key.get_pressed()
    if presionartecla[K_q]:
    exit()
    if presionartecla[K_s]:
    break
    break

    #Juego en pantalla
    pantalla.fill((0,0,0))
    perdiste=pygame.font.SysFont("comicsansms",60)#Formulario Perdiste
    etiqueta5=perdiste.render("Perdiste",True,(0,255,0))
    s1=pygame.font.SysFont("comicsansms",30)
    s2=pygame.font.SysFont("comicsansms",30)
    pantalla.blit(etiqueta5,(50,50))
    pantalla.blit(etiqueta4,(200,200))
    pantalla.blit(s1.render("S para Continuar X para Salir",True,(0,255,0)),(50,250)) #En este caso se puede cerrar la ventana dando clic en la X de la misma ventana o simplemente presionando la tecla X y cerramos la ventana (QUIT).

    ResponderEliminar
  2. ¿UPDATE?
    def update(): Se podría decir que la función Update se utiliza para actualizar parte de una pantalla.
    Por ejemplo podríamos citar:
    pygame.display.update actualizar partes de la pantalla
    pygame.display.update (rectángulo = None): return None
    pygame.display.update (rectangle_list): return None
    pygame.display.flip: Esta función es como una versión optimizada de la funcion pygame.display.flip que actualiza la superficie de la pantalla completa. Se permite sólo una parte de la pantalla para actualizar, en lugar de toda la zona. Si no hay ningún argumento se actualiza toda la superficie. En conclusión Update es utilizada como una función para actualizar pantallas (Ventanas).

    ResponderEliminar
  3. Hola, un paréntesis dentro del paréntesis:

    Creo que no hay problema si un estudiante de una sección hace preguntas o comentarios a un grupo de otra sección. Al fín de cuenteas, a la hora de ser evaluado por los estudiantes de su misma sección, TODAS las preguntas y comentarios hechos por ese estudiante pueden ser tomados en cuenta como medida de cuan participativo y colaborador ha sido, sin importar a cuales grupos ha preguntado o comentado. En este post, por ejemplo, pueden participar estudiantes de todas las secciones. Acuerdense que la idea es aprender de las experiencias de los demas y que cada quien ayude a los otros según su área de experticia.

    ResponderEliminar
  4. Ahora con respecto a lo que aclara miguel:

    Segun lo que leo, con update refrescas una parte de la ventana indicada en segun las coordenadas de un rectangulo, mientras que con flip actualizas TODA la pantalla?

    ResponderEliminar
  5. Si eso es correcto y si estoy equivocado corríjanme. Por ejemplo pygame.display.flip (): return None, Esto actualizaria el contenido de la pantalla completa y si el modo de visualización está utilizando el pygame.HWSURFACE y pygame.DOUBLEBUF, este esperará un retraso vertical y un intercambio de las superficies. Si está usando un tipo diferente de modo de pantalla, simplemente se actualiza el contenido completo de la superficie. Cuando se utiliza un modo de visualización pygame.OPENGL esto llevará a cabo un intercambio de buffer gl. Para ser un poco sincero con todos ustedes ojala todas las asignatura de la unefa (o por lo menos parte del contenido de ellas) la hubiesen dado a traves de un blog uno aprende mas y le toma mas interes a las asignatura.

    ResponderEliminar
  6. buenas noches!!! bueno profe en realidad no encontramos un texto como tal "sencillo" utilizamos fue "An Introduction to Tkinter" disponible en http://www.pythonware.com/library/tkinter/introduction/ creo que fue la misma que observamos en clase, yo la traduje pero a lo google traductor, porque había cosas que en ingles no entendía, pero como sabe la traducción así es un poco confusa y no logramos mucho; aparte de eso si conseguimos un foro que nos ayudo mucho en la creación de los botones de la pantalla principal es este http://foro.elhacker.net/scripting/python_curso_de_python_con_interfaces_graficas_tk-t232514.0.html en el cual aparece un sencillo ejemplo de un botón: tomando el ejemplo (pero cambiándole las variables tendríamos)

    from Tkinter import *
    def primerboton():
    primerbotonlbl = Label(root, text="Hola Mundo")
    primerbotonlbl.grid(row=2, column=1)
    root = Tk()
    primerboton = Button(root, text="Activar Primer Boton",command=primerboton, width=20)
    primerboton.grid(row=1, column=1)
    root.mainloop()

    Espero les funcione!!!

    Sería buenísimo que hubiera un manual sencillo porque se que tkinter es muy fácil y que fuera en ESPAÑOL !!! si alguien conoce alguno pásenlo ahí pues ;)

    ResponderEliminar
  7. el .grid ubica los botones como en una tabla con filas y columnas

    ResponderEliminar
  8. Hola:

    He estado conversando con algunos de ustedes sobre la falta de buena documentación para el uso de PyGame. Ustedes me han comentado que solo hay ejemplos de código, los cuales cada programador debe cortar y pegar, previamente adaptándolos a su particular problema.

    Una forma de sistematizar todo esto, según se me ocurre es enumerar una lista de problemas "típicos" que surgen en el desarrollo de un videojuego. Aquí mi primera lista (no exhaustiva):

    1) Como montar un fondo de juego
    2) Como navegar entre distintas pantallas de fondo (Ejemplo TortuBros, donde tienen una pantalla de menú y una pantalla del juego propiamente dicho)
    3) Como crear un menú (como el de TortuBros)
    4) Crear una animación sencilla donde un objeto se mueve por la pantalla. La pantalla la llamamos "fondo" y el objeto debe de visualizarse respetando el fondo, no como un cuadrado en blanco (ver el problema de "El Helicoptero").
    Como evitar el problema del pestañeo (que al parecer es un problema tipico), tal como se le presentó al grupo de "Viajando por Venezuela". ¿Porqué se presenta este problema?
    5) Como verificar si un sprite (así se llaman a los objetos que se mueven en primer plano, aunque hay que definir de manera clara que es un sprite) choca contra algún objeto? Por ejemplo, la tortuguita de LoriTortu no "respeta" las orillas de la carretera.
    6) Como hacer una animación más compleja, en la que un objeto asume varias posiciones en su movimiento, como un pajaro volando (mueve las alas) o un muñequito caminando? Ver por ejemplo el juego de Tayupolandia.
    7) Como hacer que un muñequito se desplace por un fondo mucho más grande que la pantalla de modo que a medida que camina se va visualizando distintas partes del fondo? (Vean como camina el muñequito de MundoLibo a medida que se desplaza por el mundo)
    8) Como reproducir una musica en loop? (Viajando por Venezuela, tomen nota) Esto lo hacen en el juego TortuBros y El Helicoptero.
    9) Como reproducir sonidos en el juego? (Ver TortuBros)
    10) Si tu juego tiene muchos objetos moviendose al mismo tiempo, como gestionar el movimiento? (Vean los meteoritos en El Helicoptero). Esta situación se puede presentar si en tu juego se disparan muchos proyectiles y necesitas controlar si cada bala da con el blanco.

    Si tienen más tareas tipicas para agregar a esta lista, comenten. Los equipos aludidos pueden

    ResponderEliminar
  9. Si profe gracias a sus acotaciones y a la de los chicos hemos corregido esos detalles..!

    ResponderEliminar
  10. en futuro espero sentarme a hacer un manual sencillo para cualquier libreria en lo sucesivo empezare por las dos mencionadas pygame y tkinter luego explorare otras en sucesion, la idea de esto es que en un plazo de uno o dos años podamos hacer un video juego que valga la pena(no he dicho que los que estan no valen la pena) y con esto quiero decir que podremos hacer juegos mas completos con todas las funciones que queramos y los efectos que queramos profe espero me ayude en esta propuesta y al cabo de un año tener un manual del libre uso donde los creadores tendran sus creditos en dicho manual y podremos subir los datos de esas personas con direcciones telefonos para que puedan ser contactados a posterior

    ResponderEliminar
  11. como puedo hacer una ventana en Tkinter pero que adentro tenga botones de Tkinter que controlen a una ventana PYGAME que esta tambien adentro DESEO meter a pygame en tkinter

    ResponderEliminar