Pygame IX: Sistema de puntuación
En este tutorial y el próximo vamos a aprender a manejar fuentes tipográficas en Pygame. Crearemos un sistema de puntuación para nuestro Pong, consistirá en dos marcadores para cada jugador que si consigues meter un punto al rival aumenta en uno. ¿Sencillo no? Vamos allá
Creando un sistema de puntuación
Lo primero es crear un sistema que controle los puntos, es decir, comprobar si la bola traspasa las palas y toca el borde de la ventana que tiene detrás. Esto lo controlará como siempre la bola y su método actualizar.
def update(self, time, pala_jug, pala_cpu, puntos): self.rect.centerx += self.speed[0] * time self.rect.centery += self.speed[1] * time if self.rect.left <= 0: puntos[1] += 1 if self.rect.right >= WIDTH: puntos[0] += 1 if self.rect.left <= 0 or self.rect.right >= WIDTH: self.speed[0] = -self.speed[0] self.rect.centerx += self.speed[0] * time if self.rect.top <= 0 or self.rect.bottom >= HEIGHT: self.speed[1] = -self.speed[1] self.rect.centery += self.speed[1] * time if pygame.sprite.collide_rect(self, pala_jug): self.speed[0] = -self.speed[0] self.rect.centerx += self.speed[0] * time if pygame.sprite.collide_rect(self, pala_cpu): self.speed[0] = -self.speed[0] self.rect.centerx += self.speed[0] * time return puntos
Como vemos le añadimos un nuevo parámetro llamado puntos, puntos es una lista que contiene los puntos de los dos jugadores en el el puntos[0] los puntos del jugador y en el puntos[1] los puntos de la cpu.
Luego añadimos las líneas de la 5 a la 8 que controlan si la parte izquierda de la pelota (línea 5) toca el el borde izquierdo de la ventana en cuyo caso aumenta puntos[1] (el marcador de la cpu) en 1 (línea 6). La líneas 7 y 8 hacen lo mismo, pero a la inversa.
Por último al final del método se retorna puntos, necesario para almacenarla en una variable.
Ahora debemos crear la lista puntos en nuestra función principal, yo la he creado justo antes de entrar en el bucle del juego:
puntos = [0, 0]
Ahora tenemos que modificar la llamada a bola.actualizar dentro del bucle del juego para pasarle nuestra lista puntos y recuperarla de nuevo con los posibles nuevos valores.
puntos = bola.actualizar(time, pala_jug, pala_cpu, puntos)
Por lo que el código nos queda así:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Módulos
import sys, pygame
from pygame.locals import *
# Constantes
WIDTH = 640
HEIGHT = 480
# Clases
# ---------------------------------------------------------------------
class Bola(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = load_image("images/ball.png", True)
self.rect = self.image.get_rect()
self.rect.centerx = WIDTH / 2
self.rect.centery = HEIGHT / 2
self.speed = [0.5, -0.5]
def actualizar(self, time, pala_jug, pala_cpu, puntos):
self.rect.centerx += self.speed[0] * time
self.rect.centery += self.speed[1] * time
if self.rect.left <= 0:
puntos[1] += 1
if self.rect.right >= WIDTH:
puntos[0] += 1
if self.rect.left <= 0 or self.rect.right >= WIDTH:
self.speed[0] = -self.speed[0]
self.rect.centerx += self.speed[0] * time
if self.rect.top <= 0 or self.rect.bottom >= HEIGHT:
self.speed[1] = -self.speed[1]
self.rect.centery += self.speed[1] * time
if pygame.sprite.collide_rect(self, pala_jug):
self.speed[0] = -self.speed[0]
self.rect.centerx += self.speed[0] * time
if pygame.sprite.collide_rect(self, pala_cpu):
self.speed[0] = -self.speed[0]
self.rect.centerx += self.speed[0] * time
return puntos
class Pala(pygame.sprite.Sprite):
def __init__(self, x):
pygame.sprite.Sprite.__init__(self)
self.image = load_image("images/pala.png")
self.rect = self.image.get_rect()
self.rect.centerx = x
self.rect.centery = HEIGHT / 2
self.speed = 0.5
def mover(self, time, keys):
if self.rect.top >= 0:
if keys[K_UP]:
self.rect.centery -= self.speed * time
if self.rect.bottom <= HEIGHT:
if keys[K_DOWN]:
self.rect.centery += self.speed * time
def ia(self, time, ball):
if ball.speed[0] >= 0 and ball.rect.centerx >= WIDTH/2:
if self.rect.centery < ball.rect.centery:
self.rect.centery += self.speed * time
if self.rect.centery > ball.rect.centery:
self.rect.centery -= self.speed * time
# ---------------------------------------------------------------------
# Funciones
# ---------------------------------------------------------------------
def load_image(filename, transparent=False):
try: image = pygame.image.load(filename)
except pygame.error, message:
raise SystemExit, message
image = image.convert()
if transparent:
color = image.get_at((0,0))
image.set_colorkey(color, RLEACCEL)
return image
# ---------------------------------------------------------------------
def main():
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Pruebas Pygame")
background_image = load_image('images/fondo_pong.png')
bola = Bola()
pala_jug = Pala(30)
pala_cpu = Pala(WIDTH - 30)
clock = pygame.time.Clock()
puntos = [0, 0]
while True:
time = clock.tick(60)
keys = pygame.key.get_pressed()
for eventos in pygame.event.get():
if eventos.type == QUIT:
sys.exit(0)
puntos = bola.actualizar(time, pala_jug, pala_cpu, puntos)
pala_jug.mover(time, keys)
pala_cpu.ia(time, bola)
screen.blit(background_image, (0, 0))
screen.blit(bola.image, bola.rect)
screen.blit(pala_jug.image, pala_jug.rect)
screen.blit(pala_cpu.image, pala_cpu.rect)
pygame.display.flip()
return 0
if __name__ == '__main__':
pygame.init()
main()
Esto como vemos no hace “nada” en el juego, ahora tenemos que buscar la manera de mostrar los puntos en nuestro juego. En el próximo tutorial trataremos con Fuentes tipográficas.
2 Comentarios
Excelente el tutorial, muy bien explicado.
Lo unico fijate que pusiste def update en vez de def actualizar como lo venias definiendo anteriormente
cierto, eso es porque primero cree el juego con las variables en inglés y para hacer el tutorial las traduje para que fuera más comprensible y se me pasó.