Juego en PyGame - PONG - Parte 3
Jugando PONG en la Magnavox Odyssey |
En la
entradas anteriores:
Juego en PyGame - PONG - Parte 1
Juego en PyGame - PONG - Parte 2
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.
Variables función principal |
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…..
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.
nota la diferencia pero en juegos mas elaborados es muy importante.
modificación:
Pausando el juego |
fin de que la pelota no se mueva mientras el juego este en pausa.
sección de dibujo agregamos esto:
Pausando el juego |
juego esta en pausa, que nos muestre el texto de inicio, en la posición que le
dimos al final.
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 |
presionamos le tecla ESPACIO, que comience el juego. Sencillo!
vamos a mostrar las puntuaciones en la pantalla escribiendo lo siguiente en la
sección de dibujo:
Dibujando las puntuaciones |
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().
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.
a un solo paso de terminar! (~˘▾˘)~
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() |
es un sencillo método que nos dirá que hay en la variable self.lado_impacto.
vamos a la lógica del juego y agregamos lo siguiente:
¿Quien perdió? |
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.
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() |
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.
queda llamar este método en la lógica del juego:
Llamamos al método reiniciar() de la pelota |
Para concluir
Extra:
Crea un ejecutable de este juego para que lo puedas compartir y presumir a tus amigos
-
Se puede descargar el codigo fuente del juego?
-
Claro que si, voy a agregar un link de descarga al final del articulo
-
el link ya esta subido
-
-
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!
-
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/principlescomputing1Saludos
-
Gracias por el enlace. Aunque buscaba algo en la lengua de Cervantes. Por eso di con tu blog. Saludos!
-
Si, lamentablemente casi toda la buena documentación sobre estos temas esta en ingles.
-
-
Como todos vuestros artículos excelente y muy bien explicado. Gracias por la info.
Deja una respuesta
Excelente artículo Salvador. Felicitaciones 😉