Título: [Solucionado][Python] Ayuda con pygame
Publicado por: ddaro en 8 Noviembre 2016, 20:19 pm
Hola estoy haciendo un juego para la universidad con python y pygame pero la realidad es que nunca nos enseñaron python por eso venia a pedirles una mano. Mi problema es el siguiente como el juego tiene varias "etapas" como sea menu, ranking, el juego en si, etc busque en google como moverme entre esa etapas creando un director y estableciendo cada una de las "etapas" del juego como escenas pero al ejecutar el menu lo dibuja en el screen pero se crashea osea deja de responder y no puedo hacer nada, no me tira una error ni nada simplemente deja de responder les dejo el code main.py #!/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 # -*- 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 # -*- 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 #!/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 dirr = director.Director() scene = juego.Juego(dirr) dirr.change_scene(scene) dirr.loop()
Título: Re: [Python] Ayuda con pygame
Publicado por: ddaro en 10 Noviembre 2016, 14:01 pm
Solucionado. Gracias de todas maneras :rolleyes:
Título: Re: [Solucionado][Python] Ayuda con pygame
Publicado por: tincopasan en 10 Noviembre 2016, 18:45 pm
ya que pusiste el código, podrías poner la solución del problema para los que estamos aprendiendo. Saludos y que bueno que lo arreglaste.
Título: Re: [Solucionado][Python] Ayuda con pygame
Publicado por: ddaro en 10 Noviembre 2016, 21:18 pm
No lo subi porque la realidad es que no tengo idea de python no me adapto a su sintaxis, etc y se que hay muchas cosas que no estan del todo bien. Lo que hice fue poner el menu en el main y en base al director elijo si voy al ranking o al juego main.py # -*- coding: utf-8 -*-
# Módulos import pygame, sys import director import juego import os import ranking from pygame.locals import * salir = False
class Menu: "Representa un menú con opciones para un juego" def __init__(self, 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
def actualizar(self): """Altera el valor de 'self.seleccionado' con los direccionales."""
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] print "Selecciona la opcion '%s'." %(titulo) funcion()
# 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 imprimir(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 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) def main(): global salir os.environ['SDL_VIDEO_CENTERED'] = '1' opciones = [ ("Jugar", comenzar_nuevo_juego), ("Ranking", rranking), ("Salir", salir_del_programa) ]
pygame.font.init() screen = pygame.display.set_mode((800, 600)) fondo = pygame.image.load("Menu/Fondo.png").convert() menu = Menu(opciones)
while not salir:
for e in pygame.event.get(): if e.type == QUIT: salir = True
screen.blit(fondo, (0, 0)) menu.actualizar() menu.imprimir(screen)
pygame.display.flip() pygame.time.delay(10)
def comenzar_nuevo_juego(): dirr = director.Director() scene1 = juego.Juego(dirr,"Juan") dirr.change_scene(scene1) dirr.loop()
def rranking(): dirr = director.Director() scene2 =ranking.Ranking(dirr) dirr.change_scene(scene2) dirr.loop()
def salir_del_programa(): print " Gracias por utilizar este programa." salir=True sys.exit(1)
if __name__ == '__main__': pygame.init() main()
Espero que les sirva
|