jueves, 13 de septiembre de 2012

Colisiones (Interacción entre objetos)

En esta entrada realizaremos una pequeña demostración de la interación entre objetos dentro de nuestro juego.
El ejemplo no tiene nada relacionado con la temática del  videojuego, es solo una demostración.

A estas interaciónes, se les conoce como colisiones, debido a que se necesita que 2 o mas objetos choquen entre si para que se lance la acción a realizar.

Para esta entrada yo elegi un ejercicio donde se tiene una ventana con bombas, estas se pueden mover hacia cualquier lado dentro de la ventana, pero si llega a tocar una bomba con otra, las dos explotan, cuando esto sucede salen llamas, se escucha un sonido de explosión y obviamente las bombas que choquen desaparecen.



Este ejempo lo realice con ayuda del motor gráfico Pilas, que ya habia comentado en la primera entrada en este blog, donde se hablaba de las herramientas para creae videojuegos ( aquí la entrada ) .
Al realizarlo de esta manera el código es más simple, más supuesto mas entendible y por su puesto más fácil de implementar esto.

Pilas Engine, hace uso de diferentes librerías, basicamente junta todas éstas y facilita su
uso, ya que pilas se encarga de su administración y todo lo necesario, por lo que no es necesario que conoscas las funciones de todas la librerías. Las mas importante son:
  • Pygame: para la manipulación de los personajes, imagenes, etc, 
  • Pyqt: para el manejo de las interfaces gráficas(ventanas, botones, etc) 
  • PyBox2d: para el manejo de la física de los juegos(gravedad, colisiones, etc.).
Si quieren probar Pilas Engine ( esta todo en español) :
  • Una guía de como instalarlo en Windows 7 está aquí.
  • Una guía de como instalarlo en Ubuntu 12.04 está aquí.
 ahí explican todo y ahí mismo estan los links para las cosas que se necesitan.

Sin más que decir, aquí esta el código :

import pilas
import random

def choque_explosion(bomba1, bomba2): # funcion para realizar la explosion y
 bomba1.explotar()      # la eliminacion de las bombas
 bomba1.eliminar()
 bomba2.explotar()
 bomba2.eliminar() 
 

def main():
 pilas.iniciar() #inicia pilas
 cantidad = 10
 bombas = pilas.grupo.Grupo()  #se crea un grupo para las bombas
 for i in range(cantidad):
  bomba = pilas.actores.Bomba() #se crean las bombas
  bomba.x = random.randrange(-200, +200) #coordenadas aleatorias en x
  bomba.y = random.randrange(-200, +200) #coordenadas aleatorias en y
  bombas.append(bomba)  #se agregan las bombas al grupo
 bombas.aprender(pilas.habilidades.Arrastrable) #se le agrega la posibilidad de
                                                       #ser arrastrable
  
 pilas.mundo.colisiones.agregar(bombas, bombas, choque_explosion) #se agrega la accion a realizar al motor de colisiones
 
 pilas.ejecutar()

main()


Se hace uso de las opciones que Pilas nos ofrece, donde el principal es el uso del motor de colisiones (que es controlado por el motor de física).
Lo que hace el programa a grandes rasgos:
  • Se inicia Pilas
  • Se crea un grupo para las bombas, donde un grupo es como una lista de objetos del mismo tipo, esto se hace para facilitar la manipulación de sus propiedades o personalización de los objetos de una manera mas fácil (en este caso es para esto, puede usarse para otros fines) y no estas agregando o modificando propiedades de objeto por objeto.´Hay una opción parecida a esta en PyGame o tal ves sea una derivada de ésta.
  • Se van creando las bombas, se les asignan coordenadas aleatorios y se agregan al grupo.
  • Se agrega la posibilidad de que cada bomba se pueda arrastrar independiente de las demás y moverse libremente dentro de la ventana.
  • Se hace uso del motor de colisiones de Pilas, donde se le pasan los objetos que interactuaran y la acción a realizar cuando estos colisionen. La acción se define en una función que se encarga de explotar las bombas (una propiedad de estas dentro de Pilas) y posteriormente eliminarlas (otra propiedad para los objetos en Pilas).
Dejo un video del funcionamiento de esto:


El video esta medio lento debido a que se el script consume algo de recursos y el progragra para grabar la pantalla consume una cantidad considerable de recursos, y como mi computadora no es muy rapida que digamos, pues ocurre esto.

También dejo una captura del script corriendo, pero con losmodos de Física, Colisiones y Posicion habilitados.


Cabe aclarar que los circulos verdes (producidos por el modo de Colisión) alrededor de las bombas, son los radios de colisión de cada objeto (bombas en este caso)  y que pueden ser modificables según sea necesario.
El centro de la pantalla es el origen del plano, por lo que las coordenadas negativas estan perimitidas.
El modo de Física muestras actualiza los valores mostrados de la posición de cada bomba al moverla.


La parte correspondiente al proyecto, en mi caso, es aportar al desarrollo de la física del juego.

Para esto se puede hacer uso de la librería PyBoxd2, la misma utilizada para el motor de fisica de Pilas Engine, ya que nuestro juego se desarrollara en un ambiente 2D.
Esta misma, puede proporcionarnos lo necesario para manejar las colisiones o interacciones entre varios objetos que ocurran en nuestro juego y también para establecer una gravedad dentro del juego, aunque creo  que esta no es muy necesaria debido a que practicamentee el juego es 2D.

_________________________________________________________________________
Referencias:

1 comentario: