Movimiento de sprites con el teclado y límites de márgenes - Curso Pygame - Capítulo 9


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.

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

Código

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.

Código

# 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 cero, 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.

Código

# 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.

Código

# 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.

Código

# 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.

Código

# 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ñadiremosm márgenes para el borde derecho y el izquierdo.

Código

# 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:

Código

# 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:

Código

# Velocidad inicial del personaje
self.velocidad_y = 0

En el método update añades la velocidad_y y las teclas

Código

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:

Código

# 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.

Código

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.


Suscríbete a mi canal de YouTube para apoyarme

Si te ha gustado este curso y crees que el trabajo merece la pena, te agradeceré eternamente que te suscribas a mi canal de YouTube para apoyarme y que pueda seguir haciendo cursos gratuitos.

Además, si te encanta la programación, tienes un montón más de cursos gratuitos para ver.

No solo eso, podrás participar enviándome comentarios con tus sugerencias para temas específicos o cursos completos o incluso las dudas que tengas y las intentaré ir resolviendo en los cursos que estén todavía abiertos.


Comentarios

Si te quedan dudas sobre el temario, sobre Python, 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.