Curso de videojuegos con Pygame

Crear disparos o proyectiles en Pygame

Capítulo 13: Creando disparos

Por fin lo que posiblemente estabais esperando, los disparos en Pygame.
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

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

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:

balas = pygame.sprite.Group()

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

balas.update()
balas.draw(pantalla)

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

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.

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

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.


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.

Programación Fácil YouTube

Suscríbete

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.