Lo de ejemplo básico es porque no tiene interacción con el usuario, los cambios se tienen que hacer desde el código, y no tiene archivos de imagen ni de fondo, ya que así lo he visto mas conveniente.
Me hubiese gustado explicarlo pero voy falto de tiempo y no se cuando lo hubiese acabado. Si alguien quiere hacerlo por mi... no me enfadaré

Soy novato, no solo en lo de los videojuegos sino en la programación en general, por lo tanto, lo mas normal es que mi código no estará del todo bien. Si tenéis sugerencias para mejorarlo, me gustaría que las expongáis.
- Código: Seleccionar todo
# -*- coding: utf-8 -*-
#
# Autor: David Ramírez
# Licencia: GPL 2
import pygame
from pygame.locals import *
from math import *
width = 500
height = 500
def detectar_colisiones (bolas):
bolas1 = list()
colisiones = list()
for bola1 in range (len(bolas)):
bolas1.append(bola1)
for bola2 in range (len(bolas)):
if bola2 not in bolas1:
if hypot ((bolas[bola2][1][0]-bolas[bola1][1][0]), (bolas[bola1][1][1]-bolas[bola2][1][1])) < (bolas[bola1][0] + bolas[bola2][0]):
colisiones.append([bolas[bola1],bolas[bola2]])
return colisiones
def limites (screen,bolas):
for bola in bolas:
if bola[1][0]-bola[0] < 0 and bola[2][0] < 0:
bola[2][0] = -bola[2][0]
elif bola[1][0]+bola[0] > width and bola[2][0] > 0:
bola[2][0] = -bola[2][0]
if bola[1][1]-bola[0] < 0 and bola[2][1] > 0:
bola[2][1] = -bola[2][1]
elif bola[1][1]+bola[0] > height and bola[2][1] < 0:
bola[2][1] = -bola[2][1]
def colision_bolas (bola1, bola2):
if bola2[1][0]-bola1[1][0] == 0:
a = pi/2.0
else:
a = atan ((bola1[1][1]-bola2[1][1])/(bola2[1][0]-bola1[1][0]))
v1r = bola1[2][0]*cos(-a)-(bola1[2][1])*sin(-a)
v1s = bola1[2][0]*sin(-a)+(bola1[2][1])*cos(-a)
v2r = bola2[2][0]*cos(-a)-(bola2[2][1])*sin(-a)
v2s = bola2[2][0]*sin(-a)+(bola2[2][1])*cos(-a)
v1r, v2r = v2r, v1r
bola1[2][0] = v1r*cos(a)-v1s*sin(a)
bola1[2][1] = (v1r*sin(a))+(v1s*cos(a))
bola2[2][0] = v2r*cos(a)-v2s*sin(a)
bola2[2][1] = (v2r*sin(a))+(v2s*cos(a))
def actualizar_posicion(bolas):
for bola in bolas:
bola[1][0] += bola[2][0]
bola[1][1] -= bola[2][1]
def actualizar_pantalla(screen,bolas):
screen.fill((0,0,0))
for bola in bolas:
pygame.draw.circle(screen, (0,255,0), (int(bola[1][0]),int(bola[1][1])), int(bola[0]))
pygame.display.flip()
def main():
screen = pygame.display.set_mode((width,height))
bolas = list()
#bolas.append([Radio,[Posicion X, Posicion Y],[Velocidad X, Velocidad Y]])
bolas.append([25.0,[400.0,300.0],[1.5,0.3]])
bolas.append([25.0,[410.0,50.0],[1.0,0.0]])
bolas.append([25.0,[240.0,50.0],[-0.0,0.0]])
bolas.append([25.0,[360.0,50.0],[1.0,0.0]])
bolas.append([25.0,[290.0,50.0],[-0.0,0.0]])
clock = pygame.time.Clock()
while True:
clock.tick(300)
actualizar_pantalla(screen,bolas)
colisiones = detectar_colisiones(bolas)
for colision in colisiones:
colision_bolas(colision[0],colision[1])
actualizar_posicion(bolas)
limites(screen,bolas)
if __name__ == '__main__': main()
PD: no se yo si a alguien le resultará útil... pero ya que lo tenía hecho, lo comparto por si acaso.
PD2: en ejemplos de esta web he visto algo de colisiones pero escrito en c o c++ (creo, no lo se) y hay gente (como yo) que no entiende ese lenguaje.
Saludos.