Google+ Seguidores

jueves, 28 de mayo de 2015

Juego en PyGame - PONG - Parte 3

    9

Jugando PONG en la Magnavox Odyssey
En la entradas anteriores:

Juego en PyGame - PONG - Parte 1
Juego en PyGame - PONG - Parte 2

Creamos las barras y la pelota con sus respectivos comportamientos, en esta tercera y ultima parte vamos a agregar los detalles faltantes como hacer que la pelota inicie su movimiento cuando presionemos ESPACIO, agregar las puntuaciones y dibujar la cancha.

Animo! Ya casi terminamos….

Para empezar en nuestra función principal main() vamos a agregar esto:

Variables función principal
En sonido_pierdes cargamos el sonido que se reproducirá cuando un jugador pierda, la variable pausa la usaremos para iniciar la partida, en texto_inicio cargamos el texto que se mostrara antes de iniciar la partida y por ultimo puntuacion.. amm creo que no hay que explicar para que es xD. Muy bien continuemos…..

El terreno de juego
Vamos a empezar dibujando la cancha que como habrás visto en el vídeo son 3 simples lineas; 2 en los limites de las barras y 1 en el medio, nos vamos a la función principal en la sección de dibujo y ponemos lo siguiente:

Dibujando la cancha
Con pygame.draw.line() nos permite dibujar una linea en la pantalla, este nos pide donde se va a dibujar (pantalla), color de la linea, el punto donde inicia y el punto donde termina.
Cancha

Recuerda que todo debe de llevar orden por lo que debes de dibujar la cancha primero y después las barras y pelota.

*En este juego realmente no se nota la diferencia pero en juegos mas elaborados es muy importante.


Se empieza cuando yo diga!
En la sección de la lógica del juego hacemos esta pequeña modificación:

Pausando el juego
Con el fin de que la pelota no se mueva mientras el juego este en pausa.


Y en la sección de dibujo agregamos esto:

Pausando el juego
Si el juego esta en pausa, que nos muestre el texto de inicio, en la posición que le dimos al final.


Ejecutamos y vemos que todo esta pintado correctamente, presionamos la tecla ESPACIO y..... no pasa absolutamente nada ()ノ彡┻━┻ tranquilo, en este punto creo que ya te imaginaras porque… pues no hemos asignado que debe de hacer la tecla ESPACIO en los manejadores de eventos, así que vamos  a esa sección y agregamos esto:

Tecla ESPACIO
aquí le decimos que si el juego se encuentra en pausa y en algún momento presionamos le tecla ESPACIO, que comience el juego. Sencillo!
♪~ ()

¿Cuánto vamos?
Ahora vamos a mostrar las puntuaciones en la pantalla escribiendo lo siguiente en la sección de dibujo:

Dibujando las puntuaciones

Bueno y aquí tal vez te preguntes porque no lo hice como con el texto de inicio, bueno resulta que con texto_inicio asignamos un texto que nunca va a cambiar por lo que ocupamos que solo se cargue una vez, pero aquí las puntuaciones van a estar cambiando constantemente por lo que es necesario  cargarlo cada vez que esta cambie y otra cosa importante es que esta función solo admite en formato String  es por eso que convertimos los números con str().

*puedes pasarte por articulo Tipos de datos en python

Y tal vez te surga otra pregunta como; ¿y porque la formula (ANCHO * 3 / 4) – 20 para colocar un mugriento numero?  Bueno tal y como lo mencione anteriormente, tienes que pensar en todas las posibilidades, con esa formula que realmente no tiene mucha ciencia, el numero siempre se colocara donde le corresponde independientemente de que dimensiones le demos a la ventana.

Ya estamos a un solo paso de terminar!  (~˘˘)~

La recta final
Ya solamente nos falta escribir la lógica del juego de que debe pasar cuando un jugador pierde pero antes ¿recuerdas que a nuestra clase Bola() le creamos la variable self.lado_impacto para saber que lado perdió? Pues vamos a necesitar tener acceso a esta información, así que vamos y creamos un método que llamaremos hayImpacto():

Método hayImpacto() de Bola()
Como veras es un sencillo método que nos dirá que hay en la variable self.lado_impacto.



Ahora vamos a la lógica del juego y agregamos lo siguiente:

¿Quien perdió?
Como recordaras la variable self.lado_impacto la iniciamos como un string vacio (“”)  por lo que la condición if bola.hayImpacto() la considera como falso, si en algún momento la pelota impacta cualquiera de los 2 lados (derecha o izquierda) quiere decir que alguien perdió por lo que reproducimos el audio sonido_pierdes y ponemos el juego en pausa, enseguida verificamos que lado fue el que impacto y le damos 1 punto al que gano.

Ejecuta, el juego funciona bien…, pero cuando un lado pierde encuentras un problema, la pelota se queda atorada… A pues claro! ¿como pude olvidarlo?, tenemos que reiniciar la pelota con cada partida nueva.

Nos vamos a la clase Bola() y le creamos el método reiniciar();

Método reiniciar() de Bola()
en el que reiniciamos su posición y velocidad, la condición if  lo que hace es cambiar la dirección de la pelota dependiendo de quien gano, es decir, si la partida la gano el jugador 1 en la siguiente la pelota comenzara yendo hacia la izquierda y volvemos a poner la variable self.lado_impacto vacía. 

Solo nos queda llamar este método en la lógica del juego:

Llamamos al método reiniciar() de la pelota

Y por increíble que parezca... hemos terminado!!

(ノ◕ヮ◕)ノ*:・゚✧

Por ultimo, eres libre de probar cambiando valores como el tamaño de la pelota o de las barras, la dimensión de la ventana o mejor aun; agregar nuevas características a tu juego, las posibilidades son infinitas..



Para concluir
Hay muchos tutoriales de como crear un PONG en Python (la gran mayoría en ingles), pero quise hacer el mio tratando de explicar cada concepto con la intención de que pueda ser entendido por cualquiera y al mismo tiempo también aprender yo.

Extra:
Crea un ejecutable de este juego para que lo puedas compartir y presumir a tus amigos

Con esto concluyo este articulo, cualquier pregunta, comentario, sugerencia y critica es bienvenida, Gracias por su atención.

Salvador Ramírez  Google+


Parte 1 - Parte 2 - Parte 3

9 comentarios:
Write comentarios
  1. Excelente artículo Salvador. Felicitaciones ;)

    ResponderEliminar
  2. Se puede descargar el codigo fuente del juego?

    ResponderEliminar
    Respuestas
    1. Claro que si, voy a agregar un link de descarga al final del articulo

      Eliminar
  3. Muchas gracias por los tutoriales. Sobre todo, por que no abundan muchos sobre juegos. Que por otra parte, ayudan mucho aprender programacion evitando algoritmos mas tediosos. Por otro lado, seria fenomenal un tuto sobre el 3 en raya y juegos de logica. Mas que nada, para explicar con detalle el algoritmo minimax. Y el tema de arboles de estado y binarios. Algo hay por la red. Pero algunas explicaciones se quedan a medias o dan por entendidos algunos conceptos. Muchas gracias!

    ResponderEliminar
    Respuestas
    1. Por el momento mi intención es hacer estos tutoriales como una introducción a los videojuegos utilizando PyGame mas que nada conceptos basico y poco a poco ir incrementando la dificultad.

      Hace poco termine un curso donde enseñan el 3 en raya en el que utilizábamos 2 técnicas: Monte Carlo y Minimax, pero todavía me siento muy verde como para intentar hacer algún tipo de tutorial, probablemente ya que comprenda bien el tema haga alguno.

      Por si te interesa este es el curso:
      https://www.coursera.org/course/principlescomputing1

      Saludos

      Eliminar
    2. Gracias por el enlace. Aunque buscaba algo en la lengua de Cervantes. Por eso di con tu blog. Saludos!

      Eliminar
    3. Si, lamentablemente casi toda la buena documentación sobre estos temas esta en ingles.

      Eliminar
  4. Como todos vuestros artículos excelente y muy bien explicado. Gracias por la info.

    ResponderEliminar

Tu comentario es importante y nos motiva a seguir escribiendo...

Entradas más recientes

© 2014 Mi diario Python. Designed by Bloggertheme9 | Distributed By Gooyaabi Templates
Powered by Blogger.