main.py
Código:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Módulos
import pygame
import director
import juego
import menu
def main():
dirr = director.Director()
opciones = [
("Jugar", comenzar_nuevo_juego),
("Opciones", mostrar_opciones),
("Creditos", creditos),
("Salir", salir_del_programa)
]
scene = menu.Menu(dirr,opciones)
dirr.change_scene(scene)
dirr.loop()
def comenzar_nuevo_juego():
scene1 = juego.Juego(dirr)
dirr.change_scene(scene1)
def mostrar_opciones():
print " Función que muestra otro menú de opciones."
def creditos():
print " Función que muestra los creditos del programa."
def salir_del_programa():
import sys
print " Gracias por utilizar este programa."
sys.exit(0)
if __name__ == '__main__':
pygame.init()
main()
director.py
Código:
# -*- encoding: utf-8 -*-
# Módulos
import pygame
import sys
import os
class Director:
"""Representa el objeto principal del juego.
El objeto Director mantiene en funcionamiento el juego, se
encarga de actualizar, dibuja y propagar eventos.
Tiene que utilizar este objeto en conjunto con objetos
derivados de Scene."""
def __init__(self):
self.screen = pygame.display.set_mode((800, 600))
os.environ['SDL_VIDEO_CENTERED'] = '1'
pygame.display.set_caption("Defensa de Chorros")
self.scene = None
self.quit_flag = False
self.clock = pygame.time.Clock()
def loop(self):
"Pone en funcionamiento el juego."
self.scene.LoadContent()
while not self.quit_flag:
time = self.clock.tick(60)
# detecta eventos
self.scene.Events()
# actualiza la escena
self.scene.Update()
# dibuja la pantalla
self.scene.Draw(self.screen)
pygame.display.flip()
def change_scene(self, scene):
"Altera la escena actual."
self.scene = scene
def quit(self):
self.quit_flag = True
scene.py
Código:
# -*- encoding: utf-8 -*-
# Módulos
import pygame
import sys
class Scene:
"""Representa un escena abstracta del videojuego.
Una escena es una parte visible del juego, como una pantalla
de presentación o menú de opciones. Tiene que crear un objeto
derivado de esta clase para crear una escena utilizable."""
def __init__(self, director):
self.director = director
def LoadContent(self):
"Se llama cuando llega un evento especifico al bucle."
raise NotImplemented("Tiene que implementar el método LoadContent.")
def Update(self):
"Actualización lógica que se llama automáticamente desde el director."
raise NotImplemented("Tiene que implementar el método Update.")
def Events(self):
"Se llama cuando llega un evento especifico al bucle."
raise NotImplemented("Tiene que implementar el método Events.")
def Draw(self, screen):
"Se llama cuando se quiere dibujar la pantalla."
raise NotImplemented("Tiene que implementar el método Draw.")
menu.py
Código:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Módulos
import random
import pygame
from pygame.locals import *
import scene
import Util
class Menu(scene.Scene):
"Representa un menú con opciones para un juego"
def __init__(self,director, opciones):
self.opciones = opciones
self.font = pygame.font.Font('Menu/dejavu.ttf', 52)
self.seleccionado = 0
self.total = len(self.opciones)
self.mantiene_pulsado = False
self.fondo = Util.imagen("Menu/Fondo.png")
scene.Scene.__init__(self, director)
def LoadContent(self):
pass
def Events(self):
k = pygame.key.get_pressed()
if not self.mantiene_pulsado:
if k[K_UP]:
self.seleccionado -= 1
elif k[K_DOWN]:
self.seleccionado += 1
elif k[K_RETURN]:
# Invoca a la función asociada a la opción.
titulo, funcion = self.opciones[self.seleccionado]
funcion()
"""Altera el valor de 'self.seleccionado' con los direccionales."""
# procura que el cursor esté entre las opciones permitidas
if self.seleccionado < 0:
self.seleccionado = 0
elif self.seleccionado > self.total - 1:
self.seleccionado = self.total - 1
# indica si el usuario mantiene pulsada alguna tecla.
self.mantiene_pulsado = k[K_UP] or k[K_DOWN] or k[K_RETURN]
def Update(self):
pass
def Draw(self, screen):
"""Imprime sobre 'screen' el texto de cada opción del menú."""
total = self.total
indice = 0
altura_de_opcion = 70
x = 280
y = 180
screen.blit(self.fondo, (0, 0))
for (titulo, funcion) in self.opciones:
if indice == self.seleccionado:
color = (200, 0, 0)
else:
color = (29, 0, 80)
imagen = self.font.render(titulo, 1, color)
posicion = (x, y + altura_de_opcion * indice)
indice += 1
screen.blit(imagen, posicion)
Si cambio de scene en el main y la inicializo con el juego anda a la perfeccion
Código:
dirr = director.Director()
scene = juego.Juego(dirr)
dirr.change_scene(scene)
dirr.loop()