
Movimiento de sprites y límites de pantalla
Capítulo 9: Movimiento de sprites con el teclado y límites de pantalla
Ya vimos en capítulos anteriores como mover al personaje con el teclado, en este haremos eso, pero con el sistema de clases y sprites.
Además, vamos a establecer unos límites en los bordes de la pantalla, para evitar que los personajes desaparezcan.
Hasta este punto, seguimos con la clase jugador casi igual, he cambiado al personaje Exterminator por una nave, te ayudará a aprender mejor estos ejemplos y los siguientes.
Aquí tienes el enlace para descargar la imagen de la nave: nave.png
class Jugador(pygame.sprite.Sprite)
# Sprite del jugador
def __init__(self):
# Heredamos el init de la clase Sprite de Pygame
super().__init__()
# Rectángulo (jugador)
self.image = pygame.image.load("principal/nave.png").convert()
self.image = pygame.image.set_colorkey(AZUL2)
# Obtiene el rectángulo (sprite)
self.rect = self.image.get_rect()
# Centra el rectángulo (sprite)
self.rect.center = (ANCHO // 2, ALTO // 2)
def update(self):
# Actualiza esto cada vuelta de bucle.
self.rect.y += 10
if self.rect.top > ALTO:
self.rect.bottom = 0
Añadimos a la nave del jugador una velocidad inicial, que debe ser 0
para que la nave no se mueva hasta que se lo indiquemos con un mando o un teclado.
La velocidad hay que especificarla tanto en 'x' como en 'y', veamos primero en 'x'.
# Velocidad inicial del personaje
self.velocidad_x = 0
Entramos en el método update
del personaje. Aquí debemos poner el valor de velocidad_x
a 0
, ya que cada vuelta del bucle tiene que evaluar si la velocidad es 0
o se está moviendo, si no, cuando pulsases una tecla, el personaje se movería infinitamente hasta pulsar otra. Por lo tanto, aquí repites la línea del __init__
.
# Velocidad inicial del personaje
self.velocidad_x = 0
Seguimos en el método update
. Ahora queda configurar el teclado.
Con get_pressed()
ya sabes lo que hace. Permite mantener pulsada la tecla que quieras. Así que, añade esta línea.
# Mantiene las teclas pulsadas
teclas = pygame.key.get_pressed()
Y voy a poner que se mueva a la izquierda y a la derecha con dos if
.
# Mueve al personaje hacia la izquierda
if teclas[pygame.K_a]:
self.velocidad_x = -10
if teclas[pygame.K_d]:
self.velocidad_x = 10
Para terminar, con estos movimientos, hay que decirle que vaya actualizando la posición de nuestro personaje en 'x'.
# Actualiza la velocidad del personaje.
self.rect.x += self.velocidad_x
Hasta este punto, el jugador puede salirse por los bordes de la pantalla. Entonces, debemos crear unos límites para que no pueda salir.
Puesto que nos movemos solo en 'x' (derecha / izquierda) por el momento, añadiremos márgenes para el borde derecho y el izquierdo.
# Limita el margen derecho
if self.rect.right > ANCHO:
self.rect.right = ANCHO
# Limita el margen izquierdo
if self.rect.left < 0:
self.rect.left = 0
En las teclas, puedes añadir una velocidad de la nave al pulsarlas.
Por ejemplo, para que la nave vaya a derecha e izquierda a una velocidad de 25
, lo haremos asi:
# Mueve al personaje hacia la izquierda
if teclas[pygame.K_a]:
self.velocidad_x = -25
# Mueve al personaje hacia la derecha
if teclas[pygame.K_d]:
self.velocidad_x = 25
Ahora, ya tienes la parte del movimiento en 'x' configurada, hay que hacer lo mismo con la 'y' si te quieres poder mover también en 'y'.
En la clase jugador, debajo de la velocidad_x
puedes colocar otra variable para la velocidad_y
:
# Velocidad inicial del personaje
self.velocidad_y = 0
En el método update
añades la velocidad_y
y las teclas.
self.velocidad_y = 0
if teclas[pygame.K_w]:
self.velocidad_y = -10
if teclas[pygame.K_s]:
self.velocidad_y = 10
Además, deberás poner los bordes superior e inferior también en el update
:
# Limita el margen inferior
if self.rect.bottom > ALTO:
self.rect.bottom = ALTO
# Limita el margen superior
if self.rect.top < 0:
self.rect.top = 0
Y por último, actualizamos también la posición de velocidad_y
.
self.rect.y += self.velocidad_y
Quizás sea difícil de entender o de saber donde va cada cosa, pero si miras el vídeo de este capítulo, tienes todo explicado de forma detallada.
Comentarios
Si te quedan dudas sobre el temario, sobre Python, Pygame o cualquier otra cosa relacionada o simplemente quieres agradecer, aquí tienes tu sitio para dejar tu granito de arena. Gracias por tus comentarios y por darle vida a este sitio web.