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: