Menu
CoddyTech

Disparar láseres

Parte de la sección Sprites e imágenes del Journey de Pygame de Coddy. Lección 30 de 36.

La nave dispara láseres directamente hacia arriba. Un láser es un sprite que aparece en la punta de la nave, vuela 10 píxeles por fotograma y se elimina cuando sale de la ventana:

class Laser(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        self.image = laser_image
        self.rect = self.image.get_rect(midbottom=(x, y))

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

La punta de la nave es el punto medio de su borde superior, así que un láser nuevo es Laser(player.rect.centerx, player.rect.top): su punto medio inferior queda en ese punto.

Todos los láseres están en un mismo grupo, lasers. Al pulsar la barra espaciadora, se añade uno al grupo en el bucle de eventos, así que cada pulsación dispara una vez. El grupo actualiza y dibuja todos los láseres; dibújalos antes que la nave, para que salgan desde debajo de su punta.

challenge icon

Desafío

Intermedio
  1. Carga assets/images/laser.png en laser_image y escribe la clase Laser de arriba.
  2. Crea lasers = pygame.sprite.Group().
  3. En un evento KEYDOWN de la barra espaciadora, añade Laser(player.rect.centerx, player.rect.top) a lasers.
  4. En cada fotograma, ejecuta lasers.update() y dibuja lasers antes que la nave.

Pruébalo tú mismo

import pygame

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Star Patrol")
clock = pygame.time.Clock()

ship_image = pygame.image.load("assets/images/ship.png").convert_alpha()


class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = ship_image
        self.rect = self.image.get_rect(midbottom=(320, 470))

    def update(self):
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            self.rect.x -= 6
        if keys[pygame.K_RIGHT]:
            self.rect.x += 6
        self.rect.clamp_ip(screen.get_rect())


player = Player()

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    player.update()

    screen.fill((12, 14, 30))
    screen.blit(player.image, player.rect)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Sprites e imágenes

Practica por tu cuenta: Playground de Pygame