Pygame IV: Creando Sprites
La parte 1, parte 2 y parte 3 nos sirvieron como introducción a Pygame, aprendimos a iniciar pygame, crear ventanas y poner imágenes. con ello creamos una plantilla básica desde la que trabajar con Pygame.
Ahora empieza lo divertido, vamos a crear nuestro primer juego, y como no será un clon del clásico Pong. Lo primero que necesitamos es hacer una copia de nuestra plantilla creada en los anteriores tutoriales y guardarla con el nombre pong.py que será sobre el archivo que trabajaremos. Lo primero que haremos será descargar este fondo, mucho más apropiado y guardarlo en la carpeta images de nuestro directorio base.
Recordad cambiar el nombre de la imagen en el programa.
background_image = load_image('images/fondo_pong.png')
La clase Bola
Para crear la pelota de nuestro Pong lo primero que necesitamos es la imagen de la pelota, descargar esta y guardarla como siempre en el directorio images.
Ahora vamos a crear una clase para la pelota, que será el Sprite de nuestra pelota, un Sprite es más que una imagen, es una superficie que puede interactuar, moverse y demás.
class Bola(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = load_image("images/ball.png", True)
self.rect = self.image.get_rect()
self.rect.centerx = WIDTH / 2
self.rect.centery = HEIGHT / 2
self.speed = [0.5, -0.5]
La línea 1 crea la clase Bola que hereda los métodos de la clase pygame.sprite.Sprite, esto es muy importante debido a que contiene métodos necesarios para el manejo de Sprites.
La línea 2 crea el método __init__ que inicializa la clase.
La línea 3 invoca al método init de la clase heredada, muy importante también y difícil de explicar para comenzar.
La línea 4 ya nos suena más y lo que hace es cargar con nuestra función load_image() la imagen de la pelota, como vemos tenemos puesto True porque la pelota si tiene zonas transparentes.
La línea 5 es de las cosas más útiles de pygame la función self.image.get_rect() obtiene un rectangulo con las dimensiones y posición de la imagen (en este caso self.image) y se lo asignamos a self.rect
Aquí hago un inciso para comentar que get_rect() tiene unos parámetros muy útiles que podemos modificar para posicionar y redimensionar nuestra imagen, son los siguientes:
- top, left, bottom, right
- topleft, bottomleft, topright, bottomright
- midtop, midleft, midbottom, midright
- center, centerx, centery
- size, width, height
- w, h
Así que podemos acceder a los diferentes valores como self.rect.centerx que nos devuelve la posición central de la pelota respecto al ancho de la pantalla, y así con todos es cuestión de probarlos, pero más o menos se entiende lo que devuelve cada uno. Lo mejor de todos ellos es que si cambias el valor de alguno el resto se actualiza. Aquí lo tenéis mejor expliado.
En la línea 6 y 7 usamos las propiedades de rect y con centerx y centery definimos el centro de la pelota en el centro de la pantalla. (aquí vemos porque pusimos WIDTH y HEIGHT como constantes globales).
La línea 8 define la velocidad que queremos para la pelota, separamos la velocidad en dos, la velocidad en el eje x y la velocidad en el eje y, luego veremos porqué.
Poniendo una Bola en nuestro juego
Bien una vez creada la clase Bola vamos a crear una bola, para ello como cuando cargamos el fondo, debemos cargarla antes del bucle del juego, con la siguiente línea:
bola = Bola()
Ahora solo debemos "ponerla" en nuestra ventana, ejecutando la siguiente sentencia, después de la sentencia idéntica a la del fondo.
screen.blit(bola.image, bola.rect)
Como puedes ver ahora no le pasamos la imagen y en vez de unas coordenadas como en el fondo (entonces le pasamos (0, 0)) le pasamos el rect de la bola, con esto conseguiremos más tarde que cada vez que movamos el rect, moveremos la pelota de sitio.
Es muy importante "ponerla en pantalla después y no antes que el fondo porque si pones la pelota y luego pones el fondo encima esta no se verá, como es lógico.
El programa nos queda así:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Módulos
import sys, pygame
from pygame.locals import *
# Constantes
WIDTH = 640
HEIGHT = 480
# Clases
# ---------------------------------------------------------------------
class Bola(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = load_image("images/ball.png", True)
self.rect = self.image.get_rect()
self.rect.centerx = WIDTH / 2
self.rect.centery = HEIGHT / 2
self.speed = [0.5, -0.5]
# ---------------------------------------------------------------------
# Funciones
# ---------------------------------------------------------------------
def load_image(filename, transparent=False):
try: image = pygame.image.load(filename)
except pygame.error, message:
raise SystemExit, message
image = image.convert()
if transparent:
color = image.get_at((0,0))
image.set_colorkey(color, RLEACCEL)
return image
# ---------------------------------------------------------------------
def main():
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Pruebas Pygame")
background_image = load_image('images/fondo_pong.png')
bola = Bola()
while True:
for eventos in pygame.event.get():
if eventos.type == QUIT:
sys.exit(0)
screen.blit(background_image, (0, 0))
screen.blit(bola.image, bola.rect)
pygame.display.flip()
return 0
if __name__ == '__main__':
pygame.init()
main()
Ahora tenemos una pelota en el centro de nuestra pantalla lo siguiente es conseguir que se mueva e interactúe con los bordes. Todo eso en el próximo tutorial.
4 Comentarios
Tengo una corrección,
En la línea que indicas que hay que agregar
ball = Ball()
debería ser
bola = Bola()
lo mismo en
screen.blit(ball.image, ball.rect)
debería ser
screen.blit(bola.image, bola.rect)
en el código del programa completo está bien.
Chihau, cierto muchas gracias, en seguida corrijo.
La razón de eso es que el juego primero lo programe yo entero con las variables en inglés y luego lo fui montando poco a poco en otro archivo para hacer el tutorial y en este decidí poner las variables en español para mayos compresión, pero a la hora de pones el código se me paso por lo que veo.
hola como estas soy de venezuela, es muy bueno el tutorial, pero apenas comienzo a entender y no se como realizar un funcion en donde las imagenes de los jugadores chuteen la pelota y esta pase a otro jugador si es posible que me expliques te agradeceria
Muchas gracias por tu trabajo!! No sabría como empezar a meterle mano a esto si no fuera por este magnifico tutorial!!