Añadiendo movimiento a los enemigos y físicas de desaceleración - Curso Pygame - Capítulo 11


En este capítulo verás cómo hacer que los enemigos se muevan solos en la dirección que quieras o en direcciones aleatorias.

Lo primero que tienes que hacer es añadir a la clase Enemigo una velocidad en x y otra en y. Esto en el método __init__.

Código

self.velocidad_x = 5
self.velocidad_y = 5

Si ponemos en los valores de velocidad un 0, el enemigo no se va a mover hasta que pase algún tipo de evento, en cambio, si inicialmente tienen otro valor numérico, se van a mover desde el primer instante.

Es el momento de que añadas el método update a tu clase Enemigo.

Código

def update(self):
    self.rect.x += self.velocidad_x
    self.rect.y += self.velocidad_y

Estas velocidades en x e y, si están en incremento, irán hacia abajo en diagonal y si las ponemos en decremento, lo mismo pero para arriba.

No obstante, los enemigos instanciados se perderán por los bordes de la pantalla en un espacio infinito.

Para evitar esto, hay que establecer unos márgenes como los que le pusimos a la nave del jugador.

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

# 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

Enemigos con velocidades aleatorias

Puedes añadir aletoriedad a la velocidad inicial de los enemigos creados, para ello solo tienes que cambiar el valor de velocidad x e y de la clase Enemigo por random.

El siguiente código dotará de una velocidad aleatoria de instanciación a los enemigos de entre 1 y 10.
Por lo que habrá enemigos que serán más rápidos que otros, pero eso lo decide el juego.

Código

self.velocidad_aleatoria_x = random.randrange(1, 10)
self.velocidad_aleatoria_y = random.randrange(1, 10)

Para que los enemigos sean capaces de cambiar de rumbo al tocar los bordes de la pantalla y que así vayan moviéndose y cambiando de dirección, deberás añadir el siguiente código:

Código

# Limita el margen izquierdo
if self.rect.left 0:
    self.v_aleatoria_x -= 1

# Limita el margen derecho
if self.rect.right > ANCHO:
    self.v_aleatoria_x += 1

# Limita el margen inferior
if self.rect.bottom > ALTO:
    self.v_aleatoria_y += 1

# Limita el margen superior
if self.rect.top < 0:
    self.v_aleatoria_y -= 1

Básicamente, lo que hace esto, es modificar el rumbo de la nave enemiga en cuanto toca el borde. Cuando va hacia la izquierda, la nave se está incrementando en x, por eso, hay que poner lo contrario, decremento, y lo mismo pasa con los otros bordes.

No sé si te has fijado, pero hemos añadido también algo de física al juego.
Las naves más rápidas se salen más de los bordes y las más lentas menos o no llegan a salirse.

Esto es por la velocidad inicial, que puede ser de entre 1 y 10 píxeles según mi código.
Aquí en los márgenes, tenemos un incremento o decremento en 1, por lo tanto, como ocurre con cualquier objeto en la vida real, como por ejemplo un coche que viaja a 100 km/h tendrá una mayor distancia de frenado hasta llegar a 0 que si viaja a 50 km/h.
Y eso es lo que está ocurriendo con nuestros enemigos, los que viajan más rápido les cuesta más recorrido quedarse a cero e iniciar el rumbo hacia otro lado. De otra forma, quedaría muy poco realista, si por ejemplo, se detuviera de golpe y cambiase el rumbo.


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.