Buenas!
A simple vista el patrón state es un poquito difícil, pero dá muy buenos resultados.
La idea general, es construir una clase por cada escena. Por ejemplo, una para la
prensentación, una para el menú y otra para el juego. Durante la ejecución de tu
juego, solamente va a existir una sola escena activa (o instanciada).
Y como tu juego va a tener varias escenas, tendrías que crear al menos
un objeto que pueda maniplarlas, es decir, pasar de una escena a otra y
mantenerlas en ejecución. A este objeto se lo suele llamar "director" o "mundo".
Te escribo una idea general:
class Mundo:
def __init__(self):
self.iniciar_ventana()
self.cambiar_escena(EscenaIniciar(self))
def cambiar_escena(nueva_escena):
self.escena = nueva_escena
def iniciar(self):
# bucle principal.
while True:
for evento in pygame.events.get():
self.escena.cuando_ocurre_evento(evento)
self.escena.actualizar()
self.dibujar_ventana()
pygame.time.sleep(10)
Es decir, la clase Mundo serviría para representar al juego completo, tienes
una función para crear la ventana, para definir la escena principal
y el bucle de juego.
Esta clase se encargaría de capturar eventos y pasárselos a una escena, y a
su vez, la escena es la que implementará una parte del juego y dará la orden
de pasar a otra escena:
class EscenaMenu:
def __init__(self, mundo):
self.mundo = mundo
def actualizar(self):
# este metodo se llamará frecuentemente (desde el bucle principal).
pass
def cuando_ocurre_evento(self, evento):
if evento.type == KEYDOWN:
if evento.key == K_SPACE:
self.mundo.cambiar_escena(EscenaJuego(self.mundo))
Entonces, la escena solamente va a tener los métodos iniciar, actualizar y
"cuando_ocurre_evento". Podrías agregar mas cosas, pero en general con
esos 3 alcanza...
Voy a intentar escribir algún programita de ejemplo en la semana, si llego
a encontrar algo de tiempo te aviso y lo publico en la sección de ejemplos
de losersjuegos.
Saludos!