Juego en PyGame - PONG - Parte 2
Jugando PONG en la Magnavox Odyssey |
Juego en PyGame - PONG - Parte 1
terminamos con
nuestras 2 barras funcionando adecuadamente, así que en esta segunda parte nos
dedicaremos a la construcción de nuestra pelota.
__init__ de Bola() |
le asignamos las coordenadas para que la pelota inicie en el centro de la
cancha (ventana), self.radio determina el
tamaño de la pelota, self.velocidad
y self.incremento_velocidad
determinan la velocidad a la que se moverá la pelota y el incremento que tendrá
cada vez que reboten contra una barra, en self.lado_impacto
vamos a guardar en qué lado de la cancha la bola impacto y por último en self.sonido_rebote cargamos el sonido que emitirá la pelota cada
vez que rebote.
información del módulo pygame.mixer.Sound
aquí: http://www.pygame.org/docs/ref/mixer.html#pygame.mixer.Sound
Método dibujar de Bola() |
nos permite dibujar un circulo en la pantalla, este nos pide donde se va a
dibujar (pantalla), de que color
sera, su posición y su radio.
Características de la pelota |
lo obtenemos con [ANCHO / 2, ALTO / 2]
y se lo pasamos al dibujar el circulo para que lo deje bien centrado.
verticalmente tendra un movimiento “y”
y horizontalmente un movimiento “x”.
llamemos nos genera un numero decimal al azar entre el 0 y el 1 (por ejemplo
0.56874), así que con esa formula, cada vez que una pelota inicie su
movimiento, saldrá en una dirección diferente (con respecto al eje de las “y”),
si no lo entiendes, escribelo y al final sabrás a lo que me refiero.
probar el modulo random en el interprete o shell de Python escribiendo import random y
cada vez que escribas random.random()
te generara un numero decimal diferente del 0 al 1.
Creando la pelota |
= Bola()
Dibujando la pelota |
perfectamente centrada.
decirle a nuestra pelota como debe comportarse, así que regresemos a la clase Bola() y en el método actualizar() escribimos lo siguiente:
Método actualizar de Bola() |
de movimiento? Pues con la pelota es prácticamente lo mismo con la diferencia
de que también modificaremos su posición horizontal para que la pelota se mueva
en todas las direcciones, asi que a los valores que tengan self.pos le sumamos los valores que contengan self.velocidad.
que funcione, tal y como lo hicimos con las barras hay que agregar la lógica al
bucle while de la función principal así:
Ejecución de la lógica de la pelota |
PAW!!! Un error!!
▐ ⊙ ▃ ⊙ ▐
Mensaje de error de la consola |
tuve un error en la linea 47, con pygame.draw.circle(pantalla,
BLANCO, self.pos, self.radio) en TypeError
me dice que esperaba un numero entero (int) y yo le di un numero con decimales
(float).
el modulo pygame.draw.circle() admite
solamente números enteros? muy bien Python dame un segundo y solucionare esto.....
que en self.velocidad = [4, 4 *
random.random() + 4] se genera un numero con décimas en el segundo valor (4 * random.random() + 4) el cual lo habíamos sumado a self.pos en el método actualizar(), así que
volvamos al método actualizar() y
hacemos una pequeña modificación:
Método actualizar de Bola() |
siempre tendrá números enteros.
la practica.
ejecuta y tu pelota ¡se mueve!, pero….. desaparece (-_-。) por lo que necesitamos establecer sus limites.
establecemos los limites superior e inferior:
Estableciendo sus limites superior e inferior |
*= -1
pelota rebota pero de forma incorrecta, es decir, cambia su dirección cuando el
centro de la pelota toca el limite de la pantalla pero queremos que rebote
cuando toque el extremo de la pelota, para eso tenemos que considerar el radio
de la pelota y lo logramos con la siguiente modificación:
Estableciendo sus limites superior e inferior |
limites izquierdo y derecho:
Situaciones de la pelota |
ponernos serios que viene lo bueno!
de la barra, esta debe de detectar si esta tocando la barra para rebotar o de
lo contrario iniciar un juego nuevo.
conocer 3 valores de la barra que son: su largo, ancho y posición vertical, así que volvemos a la clase Barra() a
crear 3 sencillos métodos para poder tener acceso a estos valores.
clase Barra() creamos los siguientes métodos:
ancho, largo y posición de Barra() |
vamos a poder accesar a estos valores.
necesitamos hacer 2 modificaciones al código que llevamos:
agregando parámetros barra1 y barra2 |
va a recibir 2 parámetros; barra1 y barra2:
pasando parámetros barra1 y barra2 |
bucle while en la lógica del juego
le pasamos las barra1 y barra2 a nuestra Pelota:
acceso a los métodos de ambas barras.
regresamos al método actualizar() de
la clase Bola() y …..
Detectando los limites |
detectaran si la pelota toca el limite izquierdo y el derecho tomando en cuenta
el ancho de las barras. Por el momento no hacen nada.
Ahora escribimos lo siguiente:
Detectando si tocamos la barra o el vació |
Detectando si tocamos la barra o el vació |
llegar al limite se encuentra dentro del largo de la barra, es decir, si la
toco (por el momento no hace nada) y de no tocarla guardara en self.lado_impacto el lado que impacto
(perdió).
Y por
ultimo le diremos que debe hacer si toca la barra:
Agregando el comportamiento si tocamos una barra |
el sonido de rebote con self.sonido_rebote.play(),
con self.pos[0] = barra1.ancho() +
self.radio esta linea se encarga de mantener la pelota siempre dentro de
los limites izquierdo y derecho porque cuando la pelota alcanza una velocidad
considerable, veríamos errores en el rebote y al final cambiamos el sentido
de la pelota multiplicando su velocidad horizontal por -1 y la incrementamos multiplicándola por self.incremento_velocidad (1.1 es igual al 10%).
-
Este comentario ha sido eliminado por el autor.
-
espero que me respondas lo más pronto amigo... en esa parte del error que mencionabas yo sigo tus pasos y aun asi me vuelve a salir el mismo tipo de error.. que podria estar pasando?
-
Hola, cual es el error??
-
Traceback (most recent call last):
File "D:UserDownloadsPONGplantilla.py", line 206, in
main()
File "D:UserDownloadsPONGplantilla.py", line 194, in main
bola.dibujar(pantalla)
File "D:UserDownloadsPONGplantilla.py", line 100, in dibujar
pygame.draw.circle(pantalla,BLANCO,self.pos,self.radio)
TypeError: integer argument expected, got float
Me sale ese error a pesar de haber puesto int() en el argumento que mencionaba el autor del juego
def actualizar(self, barra1, barra2):
self.pos[0]+=int(self.velocidad[0])
self.pos[1]+=int(self.velocidad[1])
-
Deja una respuesta
Extraordinario. Saludos!