Creando disparos - Curso Pygame - Capítulo 13


Por fin lo que muchas y muchos estábais esperando, los disparos.
He tardado en llegar aquí, porque para utilizar los disparos, primero era importante que supieras trabajar con colisiones.

Para poder disparar, lo primero es añadir una clase para dichos disparos.

Aquí tienes la imagen para los disparos: disparo.png

Código

class Disparos(pygame.sprite.Sprite):
    def __init__(self, x, y):
           super().__init__()
           self.image = pygame.transform.scale(pygame.image.load("principal/disparo.png").convert(),(10,20))
           self.image.set_colorkey(NEGRO)

Por el momento, con esto heredamos de la clase Sprite de Pygame, cargamos y redimensionamos la imagen del disparo a 10 px de ancho y 20 de alto.

Una vez escrito esto, tenemos que obtener la posición del rectángulo para indicar las posiciones x e y dónde se van a generar los disparos.

Código

self.rect = self.image.get_rect()
self.rect.bottom = y
self.rect.centerx = x

Aquí tenemos que indicar unos valores dinámicos para las posiciones de x e y, por eso lo estoy pasando como argumento en el __init__, ya que en este caso no me sirve escribir un número y ya. Tiene que ir cambiando de modo que vaya en consonancia con tu personaje y salgan de su posición los disparos.

La parte baja del rectángulo (bottom) del disparo va a tener asignada la y.
y le decimos que centre la x (centerx) asignando el valor de x.

También deberás crear un grupo de sprites para las balas:

Código

balas = pygame.sprite.Group()

Y, como siempre que añades un grupo de sprites, también un balas.draw(pantalla) y un balas.draw(pantalla)

Código

balas.update()
balas.draw(pantalla)

Es el momento de crear en la clase del personaje principal (Jugador) un método para el disparo:

Código

def disparo(self):
    bala = Disparos(self.rect.centerx, self.rect.top)
    balas.add(bala)

Cada vez que se ejecute este método, va a instanciar una bala o disparo en las posiciones x e y donde se encuentre el personaje, y estas coordenadas al ser dinámicas, van cambiando con el movimiento del personaje.

Le damos una velocidad en la dirección determinada. Si yo quiero que vaya hacia arriba, le pondré un número negativo, si quiero que vaya hacia abajo, un número positivo.
Y finalmente, le decimos, que cuando el bottom del rectángulo sea inferior a cero, es decir, que las balas salgan de la parte superior, que las elimine para liberar recursos de dichas balas.

Código

def update(self):
    self.rect.y -= 25
    if self.rect.bottom < 0:
        self.kill()

Para terminar, si quieres que la nave vaya adquiriendo con los niveles de experiencia o con algún tipo de bonus nuevas habilidades, puedes hacer que se vaya incrementando el número de cañones de disparo de la nave, añadiendo más métodos de disparo.

Nave disparando

Código

def disparo2(self):
    bala = Disparos(self.rect.centerx + 23, self.rect.top)
    balas.add(bala)
def disparo3(self):
    bala = Disparos(self.rect.centerx - 23, self.rect.top)
    balas.add(bala)

Debes configurar la tecla que quieras para el disparo. Yo he elegido el espacio.

Código

if teclas[pygame.K_SPACE]:
    jugador.disparo()
    jugador.disparo2()
    jugador.disparo3()

En caso de que quieras un solo cañón de disparo, quita las líneas de disparo2 y disparo3


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.