Diferencia entre revisiones de «Curso Python DGA 2011/pygame/ejercicios clase»
(12 revisiones intermedias por el mismo usuario no mostrado) | |||
Línea 2: | Línea 2: | ||
{{MiTitulo | Ejercicios}} | {{MiTitulo | Ejercicios}} | ||
− | + | __TOC__ | |
{{Tip| | {{Tip| | ||
Para hacer los ejercicios tienes que usar la plantilla y recursos que tienes en repositorio: | Para hacer los ejercicios tienes que usar la plantilla y recursos que tienes en repositorio: | ||
− | https://github.com/neodoo/curso_python_dga_11/tree/master/pygame/starter_kit | + | https://github.com/neodoo/curso_python_dga_11/tree/master/pygame/starter_kit Las imágenes y sonidos están en las carpetas correspondientes. |
}} | }} | ||
{{Actividad| | {{Actividad| | ||
− | Title= | + | Title=Ejercicio 1. Preparación del entorno | |
TOCdepth=2| | TOCdepth=2| | ||
* Ejecuta el starter para comprobar que has descargado bien los archivos: | * Ejecuta el starter para comprobar que has descargado bien los archivos: | ||
Línea 20: | Línea 20: | ||
pantalla.blit(fondo, (0,0)) | pantalla.blit(fondo, (0,0)) | ||
* Comprueba el resultado | * Comprueba el resultado | ||
+ | |Retroalimentacion=[[Archivo:Pygame act1.png|thumb|center|Tienes que ver algo así]] | ||
+ | }} | ||
+ | |||
+ | |||
+ | {{Actividad| | ||
+ | Title=Ejercicio 2. Creación de sprite Mono | | ||
+ | TOCdepth=2| | ||
+ | Nuestro juego va a tener 2 personajes (sprites): | ||
+ | * Un mono | ||
+ | * Bananas | ||
+ | En un archivo auxiliar ('''personajes.py''') crearemos los sprites. Desde el programa principal importaremos nuestros sprites y los utilizaremos. | ||
+ | <ul> | ||
+ | <li> | ||
+ | Crea una clase Mono que herede de Sprite: | ||
+ | <source lang="python" line="GESHI_NORMAL_LINE_NUMBERS"> | ||
+ | class Mono(Sprite): | ||
+ | def __init__(self, scr): | ||
+ | ''' | ||
+ | scr es la pantalla del juego donde se pintará el personaje | ||
+ | ''' | ||
+ | Sprite.__init__(self) | ||
+ | self.image = cargar_imagen('mono.png') | ||
+ | #self.rect = # inicializa su rectángulo | ||
+ | self.iniciar() | ||
+ | def update(self, keys): | ||
+ | pass | ||
+ | def draw(self): | ||
+ | pass # Haz que draw dibuje la imagen en la pantalla en la posición de su rectángulo. | ||
+ | def iniciar(self): | ||
+ | # self.rect.center = # Inicializa el rectángulo | ||
+ | pass | ||
+ | </source> | ||
+ | Completa: | ||
+ | * Atributo self.rect | ||
+ | * método draw | ||
+ | * método iniciar | ||
+ | </li><li> | ||
+ | Crea un objeto mono en la zona de sprites del progama principal. | ||
+ | </li><li> | ||
+ | Llama a su método draw en la zona de dibujar. | ||
+ | </li><li> | ||
+ | Comprueba el resultado | ||
+ | </li></ul> | ||
+ | |Retroalimentacion=[[Archivo:Pygame act2.png|thumb|center|Tienes que ver algo así]] | ||
+ | }} | ||
+ | |||
+ | {{Actividad| | ||
+ | Title=Ejercicio 3. Creación de sprite Banana| | ||
+ | TOCdepth=2| | ||
+ | Haz lo mismo con el sprite Banana. | ||
+ | |Retroalimentacion=[[Archivo:Pygame act3.png|thumb|center|Tienes que ver algo así]] | ||
+ | }} | ||
+ | |||
+ | {{Actividad| | ||
+ | Title=Ejercicio 4. Movimiento Banana| | ||
+ | TOCdepth=2| | ||
+ | Vamos a escribir el método update de la Banana: | ||
+ | * La banana tendrá un movimiento vertical | ||
+ | * Cada ciclo iremos aumentado el valor de y (3 pixeles por ejemplo) | ||
+ | * Puedes seguir utilizando center o top ... | ||
+ | * Cuando la banana llega abajo, vuelve a salir por la parte superior. | ||
+ | * Modificamos el métido de iniciar. La x no será siempre el centro de la pantalla, sino un número aleatorio entre 0 y el ancho de la pantalla. | ||
+ | ** Usa '''random.randint''' | ||
+ | ** Ten cuidado con el mínimo y máximo para que la banana no quede fuera de la pantalla. | ||
+ | * Introduce la llamada al método update de banana en la zona de '''actualizar sprites''' del bucle principal. | ||
+ | * Comprueba el resultado. | ||
+ | }} | ||
+ | |||
+ | {{Actividad| | ||
+ | Title=Ejercicio 5. Movimiento Mono| | ||
+ | TOCdepth=2| | ||
+ | El mono se moverá horizontalmente utilizando el teclado. Escribe el método update del mono: | ||
+ | * Le pasaremos como parámetro las teclas que están pulsadas en el ciclo. | ||
+ | * Si está pulsada la tecla flecha izquierda, moveremos su rectángulo a la izquierda 5 pasos. | ||
+ | <source lang="python" line="GESHI_NORMAL_LINE_NUMBERS"> | ||
+ | # Update de la clase Mono | ||
+ | def update(self, keys): | ||
+ | if keys[K_LEFT]: | ||
+ | self.rect.centerx -= 5 # podemos usar un atributo: self.velocidad | ||
+ | elif keys[K_RIGHT]: | ||
+ | self.rect.centerx += 5 | ||
+ | </source> | ||
+ | * Tendrás que corregirlo para que el mono no se pueda salir de la pantalla. | ||
+ | * Introduce la captura de las teclas en el bucle principal en la zona de captura de eventos: | ||
+ | <source lang="python"> | ||
+ | keys = pygame.key.get_pressed() | ||
+ | </source> | ||
+ | * Llama al método update de Mono en la zona de actualizar del bucle principal | ||
+ | * Comprueba el funcionamiento del programa. | ||
+ | }} | ||
+ | |||
+ | {{Actividad| | ||
+ | Title=Ejercicio 6. Detección de colisiones| | ||
+ | TOCdepth=2| | ||
+ | Vamos a detectar cuándo el mono toca una banana ('''el mono come una banana :)'''). Cuando detectemos la colisión, lanzaremos los métodos correspondientes en mono y en banana. | ||
+ | * Añade al programa principal la detección de la colisión: | ||
+ | <source lang="python"> | ||
+ | if pygame.sprite.collide_circle(mono, banana): | ||
+ | mono.comer() | ||
+ | banana.comida() | ||
+ | </source> | ||
+ | * Creamos los métodos correspondientes en mono y banana: | ||
+ | ** '''mono.comer()'''. Cuando el mono coma la banana mostrará durante unos ciclos (un segundo aprox.) otra imagen. | ||
+ | ** Modifica el '''__init__''' para que se cargue la imagen '''mono_contento.png''' al crear el mono. | ||
+ | ** Crea un atributo '''self.comiendo <nowiki>=</nowiki> 0''' que usaremos para saber si está comiendo el mono. Cuando el mono coma una banana, le pondremos una cantidad (30 ciclos por ejemplo). El método update tendrá que ir disminuyendo esta cantidad hasta el 0. | ||
+ | ** Modifica el método '''draw''' para que muestre la imagen del mono normal o la que está comiendo, según el atributo self.comiendo. | ||
+ | ** Cuando la banana sea comida, hay que reinicializarla para que vuelva a salir por la parte superior de la pantalla (en posición x aleatoria) | ||
+ | }} | ||
+ | |||
+ | |||
+ | {{Actividad| | ||
+ | Title=Ejercicio 7. Puntuaciones | | ||
+ | TOCdepth=2| | ||
+ | Crea un sistema de puntuaciones. | ||
+ | * Crea un nuevo sprite Marcador. Si utilizas una fuente especial, tendrás que descargarla. En el ejemplo, usamos ésta: http://www.thealmightyguru.com/GameFonts/Series-OregonTrail.html | ||
+ | <source lang="python"> | ||
+ | def __init__(self): | ||
+ | self.puntos = 0 | ||
+ | self.font = pygame.font.Font('fuentes/Yukon_Font.ttf', 42) | ||
+ | </source> | ||
+ | * Crea un método suma_punto() | ||
+ | * Crea el método draw() | ||
+ | <source lang="python"> | ||
+ | def draw(self): | ||
+ | texto = font.render("Puntos: %d" % puntos, 1, (255, 124, 0)) # Texto, antialiasing, color en RGB | ||
+ | self.scr.blit(texto, (10, 10)) | ||
+ | </source> | ||
+ | * Inserta en el código del juego las llamadas necesarias: | ||
+ | ** Creación del objeto Marcador | ||
+ | ** Sumar puntos cuando mono come banana | ||
+ | ** Draw en cada ciclo (aunque no haya comido) | ||
+ | }} | ||
+ | |||
+ | {{Actividad| | ||
+ | Title=Ejercicio 8. Vidas| | ||
+ | TOCdepth=2| | ||
+ | Crea un objeto similar para las vidas: | ||
+ | * Al principio tiene 3 vidas. | ||
+ | * Cada vez que cae una banana al suelo, resta una vida | ||
+ | * Tendrás que hacer varias modificaciones en el código principal del juego. | ||
+ | }} | ||
+ | |||
+ | |||
+ | {{Actividad| | ||
+ | Title=Ejercicio 9. Sonidos| | ||
+ | TOCdepth=2| | ||
+ | Añade sonidos a los objetos mono y banana. | ||
+ | * Cuando el mono come, lanzará el sonido '''come_fruta.wav'''. Tienes una utilidad para cargar los sonidos: | ||
+ | <source lang="python"> | ||
+ | self.sonido_comer = cargar_sonido("come_fruta.wav") | ||
+ | </source> | ||
+ | : El sonido se ejecuta así: | ||
+ | <source lang="python"> | ||
+ | self.sonido_comer.play() | ||
+ | </source> | ||
+ | * Cuando cae la banana, lanzará el sonido '''pierde_vida.wav''' | ||
+ | * Puedes añadir una música de fondo. Tienes una ayuda '''play_music'''. | ||
+ | * Cuidado con los sonidos. No debes cargarlos en el bucle principal. | ||
+ | }} | ||
+ | |||
+ | {{Actividad| | ||
+ | Title=Ejercicio 10. Control de estados: Inicio, juego, fin| | ||
+ | TOCdepth=2| | ||
+ | El juego tendrá tres estados: inicio, juego y fin. | ||
+ | * Si estado es inicio, mostrará un mensaje en la pantalla con el nombre del juego y sólo responde a los eventos de salir y '''enter''' (iniciar juego). | ||
+ | * Si estado es juego, funcionará el juego como hemos visto hasta ahora. | ||
+ | * Si estado es fin, muestra el mensaje final '''Game Over''' y sólo responde a los eventos de salir y enter (volver a jugar) | ||
+ | * Tendrás que modificar el bucle principal. Ahora según el estado tendrá que realizar una actividad diferente. | ||
}} | }} |
Última revisión de 21:24 30 ago 2011
Contenido
- 1 Ejercicio 1. Preparación del entorno
- 2 Ejercicio 1. Preparación del entorno
- 3 Ejercicio 2. Creación de sprite Mono
- 4 Ejercicio 3. Creación de sprite Banana
- 5 Ejercicio 4. Movimiento Banana
- 6 Ejercicio 5. Movimiento Mono
- 7 Ejercicio 6. Detección de colisiones
- 8 Ejercicio 7. Puntuaciones
- 9 Ejercicio 8. Vidas
- 10 Ejercicio 9. Sonidos
- 11 Ejercicio 10. Control de estados: Inicio, juego, fin
Para hacer los ejercicios tienes que usar la plantilla y recursos que tienes en repositorio: https://github.com/neodoo/curso_python_dga_11/tree/master/pygame/starter_kit Las imágenes y sonidos están en las carpetas correspondientes.
Ejercicio 1. Preparación del entorno
$ python juego_mono.py
pygame.display.set_caption('Mono zampador')
pantalla.blit(fondo, (0,0))
|
Ejercicio 2. Creación de sprite Mono
Nuestro juego va a tener 2 personajes (sprites):
En un archivo auxiliar (personajes.py) crearemos los sprites. Desde el programa principal importaremos nuestros sprites y los utilizaremos.
|
Ejercicio 3. Creación de sprite Banana
Ejercicio 4. Movimiento Banana
Vamos a escribir el método update de la Banana:
|
Ejercicio 5. Movimiento Mono
El mono se moverá horizontalmente utilizando el teclado. Escribe el método update del mono:
keys = pygame.key.get_pressed()
|
Ejercicio 6. Detección de colisiones
Vamos a detectar cuándo el mono toca una banana (el mono come una banana :)). Cuando detectemos la colisión, lanzaremos los métodos correspondientes en mono y en banana.
if pygame.sprite.collide_circle(mono, banana): mono.comer() banana.comida()
|
Ejercicio 7. Puntuaciones
Crea un sistema de puntuaciones.
def __init__(self): self.puntos = 0 self.font = pygame.font.Font('fuentes/Yukon_Font.ttf', 42)
def draw(self): texto = font.render("Puntos: %d" % puntos, 1, (255, 124, 0)) # Texto, antialiasing, color en RGB self.scr.blit(texto, (10, 10))
|
Ejercicio 8. Vidas
Ejercicio 9. Sonidos
Añade sonidos a los objetos mono y banana.
self.sonido_comer = cargar_sonido("come_fruta.wav")
self.sonido_comer.play()
|
Ejercicio 10. Control de estados: Inicio, juego, fin
El juego tendrá tres estados: inicio, juego y fin.
|