Razón Artificial

La ciencia y el arte de crear videojuegos

Pygame IX: Sistema de puntuación

Escrito por adrigm el 15 de febrero de 2010 en Desarrollo Videojuegos, Noticias, Programación | 5 Comentarios.

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.

5 Comentarios en "Pygame IX: Sistema de puntuación"

  1. Sebastián dice:

    Excelente el tutorial, muy bien explicado.
    Lo unico fijate que pusiste def update en vez de def actualizar como lo venias definiendo anteriormente

  2. admin dice:

    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ó.

  3. Aradenatorix dice:

    Interesante tu post, sin embargo tengo una duda. Estoy mejorando un juego muy similar a este solo que en vez de tener 2 jugadores con 2 palas y la bola tengo un jugador con una pala que se mueve en este caso horizontalmente y una bola que hay que golpear para romper unos ladrillos que hay arriba. El reto es crear un sistema de puntos que dependiendo de la habilidad del jugador, reduzca un poco la velocidad de la pelota y agrande la pala en la direccion horizontal nada mas (x) o bien acelere la bola y reduzca un poco la superficie de la pala. Soy nuevo no solo en pygame y python sino programando, asi que no se si exista alguna clase o metodo que ayude a esto, ¿alguna sugerencia de como lograrlo?

  4. […] Adrián Guerra Marrero. Pygame IX: Sistema de puntuación. Actualizada: Febrero 15, 2010. Fecha de consulta: Enero 26, 2012. Disponible en: http://razonartificial.com/2010/02/pygame-9-sistema-puntuacion/ […]

  5. […] Pygame IX: Sistema de puntuación […]

Deja un comentario