Sistema de colisiones en Pygame

Pygame proporciona una serie de funciones básicas a la hora de trabajar el tema de colisiones con objetos, de esta manera nos ahorra el uso de “complejas” formulas matemáticas dándonos la posibilidad de por ejemplo detectar colisiones entre rectas, sprites contra rectas, entre varios sprites y así sucesivamente.

Supongamos que estamos trabajando con sprites y hemos dibujado en el escenario un rectángulo (con la función pygame.draw.rect), lo que queremos hacer ahora es detectar la colisión cuando nuestro sprite toca el rectángulo:

if rectangulo.colliderect(sprite1):
        print "Hubo una colision"

Algo muy interesante aquí que podemos usar para evitar que el personaje pase a través del rectángulo es guardando la posición del X o el Y antes de detectar la colisión, así por ejemplo podemos usar el siguiente codigo resaltando el uso de las variables oldx y oldy.

import pygame
from pygame.locals import *
 
pygame.init()
 
pantalla = pygame.display.set_mode((320,240),0,32)
imagen = pygame.image.load("mario.png")
 
x = 10
y = 10
 
sprite1 = pygame.sprite.Sprite()
sprite1.image = imagen
sprite1.rect = imagen.get_rect()
 
sprite1.rect.top = y
sprite1.rect.left = x
 
rectangulo = pygame.Rect(100, 0, 10, 200)
 
reloj = pygame.time.Clock()
while True:
    for eventos in pygame.event.get():
        if eventos.type == pygame.QUIT:
            exit()
    pulsada = pygame.key.get_pressed()
    if pulsada[K_UP]:
        sprite1.rect.top -= 5
    if pulsada[K_DOWN]:
        sprite1.rect.top += 5
    if pulsada[K_LEFT]:
        sprite1.rect.left -= 5
    if pulsada[K_RIGHT]:
        sprite1.rect.left += 5
    if rectangulo.colliderect(sprite1):
        sprite1.rect.left = oldx
        sprite1.rect.top = oldy
 
    oldx = sprite1.rect.left
    oldy = sprite1.rect.top
    reloj.tick(25)
    pantalla.fill((0,0,0))
    pantalla.blit(sprite1.image, sprite1.rect)
    pygame.draw.rect(pantalla, (255, 255, 255), rectangulo )
    pygame.display.update()

Podemos usar también sistemas de colisión clásicos como los de tipo rectangulares o circular. esto requiere el entendimiento del teorema de pitágoras y otras variaciones de su formula.