miércoles, 10 de octubre de 2012

Reporte de la Semana 5

De acuerdo a nuestra calendarización, los objetivos a cumplir en esta semana son:
  • Animación de Personaje(Básica)
  • Movimientos de personaje dummy en pyGame
  • Side-Scrolling
  • Creación de Objetos Estáticos (Prototipos)
  • Interacción del personaje dummy con Objetos
Adición de un personaje en pyGame

Como habiamos mencionado anteriormente, el juego será 2D, por lo que para crear las animaciones de los personajes en el juego se utilizarán spritesheets, que no son más que imágenes de los personajes en diferentes posiciones. Por ejemplo, para las pruebas que estamos realizando, utilizamos el siguiente spritesheet de Scott Pilgrim:


Como se puede ver en esta imágen se encuentra el mismo personaje en diferentes posiciones.

Entonces si queremos crear la animación del personaje en movimiento, localizamos todos los sprites que contienen esta animación por separado dentro de la imágen, que son los siguientes:


Para cada uno, localizamos las coordenadas x, y de la parte superior izquierda del rectángulo que pueda cubrir todo el sprite. También, definimos un ancho y un largo, que a partir de los puntos previos se extenderá para encuadrar al sprite, cuidando que toda la imágen del sprite quede dentro del rectángulo.

Entonces si el spritesheet fuera la imágen anterior, las coordenadas del primer sprite serían:

Estos 4 datos son escritos en un archivo, que se llamará nombre.coords, donde nombre es el mismo nombre de la imágen que se usará como spritesheet. El archivo contiene en cada línea el siguiente formato:

nombre_animación (x1, y1, ancho1, largo1) (x2, y2, ancho2, largo2) ... (xn, yn, anchon, largon)
    • nombre_animación es el nombre de la animación que se creará con las coordenadas.
    • Las x, y son las coordenadas de inicio en el spritesheet para crear el rectángulo del personaje.
    • ancho y largo son las dimensiones que tomará el rectángulo a partir de las coordenadas de inicio.
Con este archivo, el programa cargara un vector con todas las coordenadas de las animaciones que se usarán para un determinado personaje. Algunos ejemplos de animaciones:



Movimiento

Moverlos dentro de la pantalla no es difícil, ya creados los vectores con las animaciones. Para esto se usa el teclado, moviendo con las flechas direccionales al personaje hacia la derecha o izquierda. Cuando se presiona una tecla, se empieza a incrementar una variable cada cierto tiempo. Cada que se incrementa se muestra un diferente sprite, creando la animación. Además dependiendo de la dirección a la que se quiere mover, se mueven las coordenadas del personaje en la pantalla a una velocidad determinada.

Es importante checar que estas coordenadas no salgan del tamaño de la ventana, y si es así basta con regresarlo dentro. A continuación se puede ver el movimiento del personaje dentro de la ventana:


Adición-interacción de objetos estáticos en pyGame

Ahora para agregar items en la ventana, basta con tomar la imagen que se usará para el item y asignarle unas coordenadas dentro de la ventana. En el caso del ejemplo estas coordenadas son aleatorias. Lo importante ahora es añadir interacción con este objeto. 

Debido a que estamos utlizando la clase sprite de pyGame, esto es sencillo. Para cada objeto-personaje en el juego debemos de guardar un Rect, que es un objeto que contiene datos del rectángulo "virtual" que cubre cada objeto-personaje. Entonces en este caso el personaje tiene su propio rect, y el item txambién lo tiene. Lo que hacemos es utilizar colliderect para checar si el personaje entro en contacto con el item, y si es así, un evento debe ocurrir, en este caso un contador se incrementa y el item vuelve a aparecer aleatoriamente en algún lugar del mapa.

Esta interacción puede observarse a continuación:


Side-Scrolling

Una parte importante del juego es el side-scrolling, es decir, mover el mapa conforme va avanzando el personaje. Para esto es necesaria una imágen enormememte larga que represente el fondo del mapa. En el caso de este ejemplo, se usó la siguiente:


Al igual que los sprites quizás sea necesario definir donde empieza y donde termina el mapa real, debido a que la imágen contiene otros datos además del mapa.

Lo siguiente es detectar cada que un personaje se acerca al limite de la pantalla, ya sea izquierdo o derecho(si el juego tiene scrolling vertical también sería necesario checar eso). Para esto checamos la posición del personaje y sumamos 100 a su coordenada en x para checar si esta cerca del lado derecho, o restamos 100 para checar el lado izquierdo. También es necesario saber en que parte del mapa estamos, por lo cual debemos ir guardando las coordenadas actuales del mapa conforme se va haciendo scroll, para no salir del inicio o el final.

Cada que el programa detecte que el personaje se acerca a algún lado de la pantalla, se hace el scroll aumentando las coordenadas en x del mapa que se estan tomando para el fondo. Esto se puede observar a continuación:



Referencias:

miércoles, 12 de septiembre de 2012

Reporte de la Semana 4

Para la Semana 4 los objetivos a cumplir fueron:

  • Creación de Prototipo de Personaje
  • Creación de Prototipo de Mapa (Por votación decidimos separar la parte del mapa de blender, lo que mencionaremos más adelante)
  • Investigación sobre pyGame y Sprites
Creación de un Prototipo de un Personaje

Para poder mostrar más las capacidades de Blender para el modelado gráfico, buscamos modelar a una persona en el mismo, usando una plantilla del cuerpo humano como fondo para poder simplemente seguir las lineas utilizando figuras. La plantilla usada fue esta:


Entonces la idea de esto esta en crear todo a partir de cubos. Inicialmente colocamos uno en el centro del cuerpo de frente, puede ser en el área del estómago o el pecho pero es necesario que esté centrado. Para poder llevar a cabo el diseño de una forma más detallada en Blender se separa la vista en dos para poder al mismo tiempo ir modelando el cuerpo de lado. Como se puede ver:


El resto es ir "estirando" o el termino de Blender (extruding) el mismo cubo hacia arriba y abajo, ajustando para poder crear el torso, piernas y cabeza. La parte de las manos entonces se hace lo mismo, pero partiendo de un lado del torso, estirando algunos vértices para poder crearla.

El resultado final quedó así:



Investigación de nuevas formas de crear mapas

Debido a que vimos que la creación de mapas en Blender, y el hecho de darle física junto con pygame sería bastante complicado (y agregando el hecho que estamos cortos de personal) decidimos buscar nuevas alternativas para la creación de mapas:
  • Uso de Matrices 

    Una de las formas para crear mapas sería el uso de una matriz para representarlo. El gran pro a favor de esto es que ya teniendo una sólida base para la creación de mapas de esta manera, será MUY simple crear muchos más. 

    Este método funciona creando una matriz, puede ser manualmente. Ésta matriz debe contener números que representen alguna parte del mapa. Por ejemplo para algo sencillo podemos representar el número 0 como las partes solidas de un mapa, el suelo. paredes, techo, y el número 1 para el espacio por el cual podemos caminar. Entonces iterando esta matriz, podemos ir dibujando en cada posición dichos objetos, y más adelante agregándole lógica a cada uno crear un nuevo mapa.
    Un ejemplo que hicimos nosotros de éste método es el siguiente:


Investigación sobre pyGame y Sprites
  • Uso de Grupos
La clase grupo sirve de contenedor para los sprites. Similar a ellos, tiene una función add() y remove() con las cuales se puede cambiar cuales sprites pertenecen al grupo. También se puede pasar un sprite o una lista de sprites al método constructor para crear una instancia de un grupo que contenga algunos sprites iniciales.

Otros métodos que tiene son empty() para remover todos los sprites del grupo, copy() que retorna una copia del grupo con todos los miembros y has() que checa si el grupo contiene un sprite o una lista de sprites. Otro método usado frecuentemente es sprites() que retorna un objeto que puede ser iterado para accesar a cada sprite en el grupo. También existe un método update que llama a update() para cada sprite del grupo. 

Los grupos serían muy útiles en el proyecto ya que en ellos de podrían guardar los diferentes objetos y personajes del juego teniendo una cierta clasificación, por ejemplo enemigos, aliados, objetos usables, etc. 

Además al ser un juego tipo beat 'em up, muchas veces existen situaciones en las que tienes que derrotar a todos los enemigos en un área para poder avanzar. Usando grupos podríamos crear uno donde cada sprite sea un enemigo de estos, y así podemos remover los sprites de los enemigos derrotados y permitir el avance cuando el grupo este vació.

Detección de Colisiones


La clase sprite contiene un par de funciones que pueden ser útiles para implementaciones sencillas de colisiones:
  • spritecollide(sprite, group, dokill) -> list
    Este método verifica colisiones entre un solo sprite con todos los de un grupo. El método retorna una lista con los sprites que se están sobreponiendo con el sprite especificado. 
  • groupcollide(group1, group2, dokill1, dokill2) -> dictionary
    Es un método como el anterior pero más complejo, ya que verifica por colisiones en cada sprite de un grupo, con colisiones con cada sprite de otro segundo grupo.
Enlaces Útiles:

miércoles, 29 de agosto de 2012

Reporte de la Semana 3

Para esta semana, los milestones a cumplir fueron:
  • Selección de la Temática
  • Investigación sobre la Creación de personajes
  • Investigación sobre la Creación de Mapas
  • Inicio de Uso de Blender
Todo esto por 10 puntos.

Selección de la Temática 

En cuanto a selección de género nos referimos más que nada al tema principal del juego, o sobre que se desarrollaría la historia. No tenemos pensado realizar una historia muy profunda, con dialogos y demás, debido a que eso requeriría mucho tiempo, o más personas, cosa que no tenemos, al ser un equipo reducido(los estudios generalmente cuentan con escritores que se encargan de escribir las historias de los juegos). Por lo tanto, la temática será lo que dirigira la mayoría de la historia del juego.

Dicha temática, a decisión del equipo, será ambientada en un mundo post-apocalíptico, en un estilo de supervivencia. Dicho ésto, los enemigos principales serían zombies, y quizás otros supervivientes. Esto nos da libertad de omitir la mayoría de la historia, por lo menos por ahora, debido a que al decir esto damos solamente un motivo al jugador, sobrevivir. Claro, esto no debería afectar la jugabilidad.

Investigación Sobre la Creación de Personajes

Para el uso de Blender, la principal fuente de información sobre su uso y tips en general son videos de youtube. Investigando sobre la creación de personajes, encontramos que es posible utilizar una imágen de fondo como plantilla para construir alrededor de ella los modelos 3D.


Entonces, si desearamos por ejemplo modelar el cuerpo humano, para los diferentes personajes del videojuego, podemos utilizar una plantilla como la siguiente:


A partir de esa plantilla, construiramos el modelo utilizando figuras geométricas. El uso de plantills es una ventaja muy grande, porque gracias a esto podríamos crear personajes utilizando nuestras propias plantillas hechas a mano, o con algún programa.

En el video el modelo parte desde cubos debido a que es bastante fácil extenderlos de distintas formas, y haciendolo de la forma correcta, es posible hacer hasta un modelo de un cuerpo sin una forma cúbica real, como el de un humano. El modelo hecho de polígonos suele verse algo así (sin agregar texturas y demás):



Investigación Sobre la Creación de Mapas

Cuando hablamos de mapas, nos referimos a localizaciones donde el juego tomara lugar. Por lo tanto, es importante saber como poder hacer esto en blender. Si bien no tenemos planeado que el juego sea 3D, tener el fondo, aunque sea estático, con gráficos 3D, sería un buen añadido al juego.


El mismo autor del video anterior, tiene en su canal un video tutorial muy bueno de como crear terrenos en blender. El terreno es una parte importante del mapa, refleja la localización de una forma parcial, ya que puedes darte cuenta facilmente si estas en un campo, en una ciudad, en el mar, en una montaña, etc.



Básicamente lo que se hace para crear terrenos, es crear una figura plana, un cuadro, y dividirlo en partes muy pequeñas, cientos de pequeños cuadros. Después para crear altibajos en el terreno, simplemente se estiran vértices de éstos pequeños cuadros.

Inicio con Blender

Para comenzar a acostumbrarnos al uso de Blender, algunos de nosotros comenzamos a hacer pequeños modelos de objetos sencillos, como es el caso de una copa, que hizo Emmanuel basado en un excelente tutorial de un video

Básicamente lo que se hizo fue utilizar un background como plantilla, en este caso esta simple imágen de un dibujo de una copa de vino:
Entonces, usando esta imágen de plantilla, a partir de un circulo inicial en la base, se iba construyendo parte a parte la copa, estirando dicho círculo verticalmente, y acomodandolo en los demás ejes para que quedara también de forma proporcional en 3D, como se puede ver en la siguiente imágen:


Creando el contorno, lo siguiente era añadir una capa más, para darle un grosor a lo que sería el interior de la copa, un detalle muy interesante que se explica muy bien en el tutorial(link incluido más abajo). Con esto podemos darle al modelo la apariencia de tener un fondo interior, como una copa real.


    



Enlaces:

miércoles, 22 de agosto de 2012

Reporte de la Semana 2

Para ésta semana los objetivos a cumplir fueron:
  • Selección de género del juego
  • Elección - Instalación de herramientas
Selección de Género

Realizamos una votación en el grupo de Facebook, para poder decidir que tipo de juego escogeríamos.
Inicialmente teníamos contemplado elegir entre un fighter 1 vs 1, o un beat 'em up, como se puede ver en el post pasado, pero surgió la idea de un juego tipo brawler, como el famoso Super Smash Bros. Brawl, aunque aún así la idea triunfante fue el género Beat 'em up.


Cada uno de nosotros buscó un juego de este género para poder tomar ideas de dichos juegos, aquí a continuación están los videos de los juegos que encontró cada persona:
IntegranteJuego Video
EmmanuelScott Pillgrim vs The World
Roberto RafaelDouble Dragon
VictorMighty Morphin Power Rangers
RaúlRenegade



Elección - Instalación de Herramientas
  • Python
    • Como lenguaje de programación, elegímos Python por su simplicidad de uso, además de que es un lenguaje muy versátil con el que podemos disponer de múltiples módulos para todo tipo de cosas que nos ayudarian en el proyecto.
    • Para instalar Python, hicimos lo siguiente:
        • Fedora, Ubuntu: Python ya viene incluido en estos sistemas operativos por lo cual solo actualizamos a la versión 2.7.3, descargandola de aquí, y descromprimiendo para luego ejecutar los comandos: ./configure, make, make install, en ese orden.
        • Mac: Python igualmente ya viene incluido en Mac OS X, pero también es necesario actualizarlo a la versión 2.7.3, para esto es posible descargar el instalador, y correrlo. El instalador se puede descargar de aquí: http://www.python.org/getit/.
        • Windows: Para Windows, solo es necesario descargar y correr el instalador respectivo, disponible en el mismo link.
  • Pygame
    • Pygame es un conjunto de módulos del lenguaje de programación Python que permiten la creación de videojuegos en dos dimensiones de una manera sencilla. Funciona como interfaz de las bibliotecas SDL, y está orientado al manejo de sprites. Dada la simplicidad de Python, se pueden crear prototipos y desarrollar rápidamente. 
    • Para agregar el módulo Pygame a python, se hizo lo siguiente:
      • Fedora: Para Fedora, simplemente desde una terminal se debe ejecutar el comando: sudo yum install python-pygame.
      • Ubuntu: En Ubuntu, igualmente es posible instalar pygame con un simple comando de terminal, en este caso: sudo apt-get install python-pygame.
      • Windows y Mac: Aquí también es posible descargar los instaladores directamente desde la siguiente página: http://www.pygame.org/download.shtml.
  • Blender
    • Blender es un programa informático multiplataforma, dedicado especialmente al modelado, animación y creación de gráficos tridimensionales. En nuestro caso, que desarrollaremos un juego 2D, el uso que le daremos a Blender será crear un objeto (personaje, item) y modelarlo de forma 3D, dandole diferentes animaciones. Dichas animaciones entonces las exportaremos como PNGs, que después GIMP se encargará de convertir en sprites que usaremos en Pygame.
    • Para la instalación de blender, se realizó lo siguiente:
      • Fedora, Ubuntu, Mac: Es posible descargar el source de blender para Linux del siguiente link: http://www.blender.org/download/get-blender/. De ahí, solo es necesario movernos a la carpeta, y correr el ejecutable blender.
      • Windows: Windows cuenta con su propio ejecutable para poder instalar blender, por lo que simplemente debemos bajarlo de la misma página, y seguir los pasos para instalarlo.
  • GIMP
    • Para la creación de los personajes y los mapas(en forma gráfica), encontramos que mediante GIMP y el uso de capas, es posible convertir una sucesión de imágenes PNG en un sprite con movimiento, mediante el uso del plugin Sprite Sheet.
    • Para instalar GIMP se realizó lo siguiente:
      • Fedora: Con un simple comando en una terminal: sudo yum install gimp.
      • Ubuntu: Igualmente con un comando: sudo apt-get install gimp.
      • Mac: Para instalar GIMP en Mac, debemos descargar y correr el instalador descargable de la siguiente página: http://www.gimp.org/macintosh/.
      • Windows: Igualmente, solo es necesario descargar y correr el instalador, que se puede conseguir aquí: http://www.gimp.org/windows/.

miércoles, 15 de agosto de 2012

Reporte Inicial

 Proyecto: Puddi Fighters
Gerente del Proyecto: Víctor Briones

Descripción: 
Juego de Peleas en 2D diseñado en python ya sea el género Beat ‘em up, o un clásico juego de 2 peleadores 1 Vs 1 a la vez.



Scott Pilligrim Vs. The World, ejemplo de videojuego Beat 'em Up.





Marvel Vs Capcom, clásico juego de peleas


Metodología

Scrum es un marco de trabajo para la gestión y desarrollo de software basada en un proceso iterativo e incremental utilizado comúnmente en entornos basados en el desarrollo ágil de software:

  • Requerimiento
  • Análisis
  • Diseño
  • Evolución
  • Entrega

Éste método nos sería útil debido a que se realizan entregas parciales y regulares del producto final, priorizadas por el beneficio que aportan al  proyecto. Scrum está especialmente indicado para proyectos en entornos complejos, como el desarrollo de videojuegos,, donde se necesita obtener resultados pronto, donde los requisitos son cambiantes o poco definidos, donde la innovación, la competitividad, la flexibilidad y la productividad son fundamentales.


La desventaja que encontramos es el hecho de tener que separar al equipo de desarrollo para las reuniones necesarias, pero debido a que no es un proyecto de tiempo completo, esto podría no ser necesario, habiendo otras formas de contactarnos, agregando que hay una persona que sería asignada directamente para realizar las pruebas.

El product backlog es un documento de alto nivel para todo el proyecto. Contiene descripciones genéricas de todos los requerimientos, funcionalidades deseables, etc. priorizadas según su retorno sobre la inversión. En el caso de desarrollo de videojuegos, esta parte es muy importante es que un documento de diseño del juego, no es necesario debido a que el backlog lo reemplaza.

Éste documento es un documento de diseño vivo, debido a que se va editando frecuentemente en el diseño de un video juego. Lo que incluiriamos sería texto, imágenes, diagramas y otros conceptos u otros medios útiles para ilustrar mejor las decisiones de diseño, como los mapas, interfaz y personajes.

Roles del Equipo:


Definimos las áreas en las que cada persona participará para aportar el proyecto. Concordamos en que cada persona debe participar por lo menos en un par de ellas, pero estar informado del progreso de las demás, sobre todo si está relacionadas a lo suyo, para poder más fácilmente incorporar todo junto cuando sea necesario.
  • Victor (Product Owner): Física del Juego, Interfaz-Menú, Cálculos Matemáticos(Golpes, barras de vida, etc),  Pruebas
  • Emmanuel (Scrum Master): Movimiento-Incorporación de Personajes, Inteligencia Artificial, Física del Juego
  • Raúl: Cálculos Matemáticos(Golpes, barras de vida, etc),Creación de Personajes, Documentación
    • Roberto: Creación de Mapas, Creación de Personajes
    Descripción de las áreas:

    • Movimiento-Incorporación de Personajes 

    En ésta área el objetivo será agregar personajes ya creados o definidos (sprites) a un ventana, y poder darle los movimientos básicos(caminar, golpear, brincar) en una ventana en la computadora, esto incluye tanto personajes jugables como posibles NPCs o enemigos.
    • Inteligencia Artificial 
    El área se refiere a la creación de enemigos “inteligentes” que puedan jugar por sí solos para combatir contra el jugador. En sí, lo que se espera es que los movimientos ya programados para los enemigos sean realizados en respuesta a los movimientos el jugador, agregando dificultad variable al juego.
    • Física del Juego
    Ésta área se encargará de todo lo relacionado con física involucrado en el juego. Esto sería los brincos, golpes(y contacto necesario para ellos), caídas, y demás.
    Interfaz-Menú: Creación de los menús, y retroalimentación visual del juego. Esto incluye desde los menús introductorios, la selección de personajes y opciones hasta el HUD (head-up-display) con la vida, puntos, tiempo y otras cosas.  

    • Creación de Personajes 
    Involucra la creación de personajes como sprites, ya sean enemigos o amigos. Estos sprites seran imágenes de los personajes en todas las posiciones posibles que puedan tomar, golpeando, pateando, brincando, etc.
    • Creación de mapas 
    Creación de los mapas en los que se moverán los personajes. Está relacionada con la física del juego, ya que pueden tener diferentes formas y texturas que afectan al personaje.
    • Cálculos matemáticos  
    Todos los cálculos necesarios para la interacción del personaje con objetos. Aumento de puntos, disminución-incremento de la barra de vida, llenado de una barra de combos o algo similar, etc.

    Milestones


    Los objetivos a cumplir, son los siguientes:
    MilestoneFechaPuntaje
    Definición del Proyecto
    Definición de herramientas
    Reparto de roles
    16 Agosto10
    Selección de género del juego
    Instalación de herramientas
    23 Agosto5
    Selección de la temática del juego
    Creación de un personaje(Investigación)
    Creación de un mapa (Investigación)
    30 Agosto10
    Creación de Prototipo de Personaje
    Creación de Prototipo de Mapa
    Investigación sobre pyGame y Sprites
    13 Septiembre10
    Animación de Personaje(Básica)
    Creación de Objetos Estáticos (Prototipos)
    Incorporación de Objetos a Pygame
    27 Septiembre10
    Movimientos del Personaje
    Interacción del Personaje con Objetos
    4 Octubre10
    Creación-Animación de Personaje Enemigo
    Adición de Vida a Personajes
    Contacto con Enemigo
    Puntaje del Personaje
    18 Octubre10
    Adición de Inteligencia Artificial Al enemigo(básica)
    Adición de diferentes enemigos
    7 Noviembre10
    Interfaz del juego y Sonido(Básico)14 Noviembre5
    Prototipo 21 Noviembre20
    Total -100


    Como Prototipo Final, llamaremos a lo siguiente. El juego de peleas terminado, con por lo menos un mapa jugable en su totalidad, interacción con el personaje jugable y los enemigos con una inteligencia artificial aceptable. Con interacción referimos a la capacidad de realizar golpes al enemigo, reducir la vida de el mismo(y la del jugador si es golpeado) incrementar puntos, manejar un número de vidas limitado en caso de perder toda barra de vida, y otros factores más.
    En pocas palabras, deseamos tener un demo-beta de un videojuego.

    Bitácora semanal

    Semanalmente reportaremos los avances del proyecto, y cuales milestones se cumplieron, o que cambios se hicieron a éstos mismos, debido a que al ser un juego, pensamos que debemos de tener la libertad de realizar cambios en algunos puntos para mejorar el mismo.

    La semana actual, el equipo definió los roles en los cuales cada uno aportaría al proyecto, para lo cual acordamos que cada uno seleccionaría por lo menos dos áreas de trabajo en las cuales ayudar a construir el proyecto.

    Planeamos hablar semanalmente todo el equipo para poder discutir los avances personales, y dar opiniones sobre posibles cambios o adiciones que se pueden hacer o sugieren que se haga en otras áreas en las que no se participa.

    También se definieron los objetivos o milestones que deseamos cumplir paso a paso, hasta llegar al prototipo que se entregara al finalizar este semestre. También definimos como es que deseamos que funcione este prototipo, para saber cual sería entonces el "producto completo" (por lo menos hasta el final de Proyecto Integrador 1).