Menu
CoddyTech

Mantén pulsado para disparar

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

Presionar la barra espaciadora para cada disparo cansa los dedos. La mayoría de los juegos de disparos disparan mientras se mantiene presionado el botón, pero un láser en cada fotograma sería un haz continuo. Un tiempo de recarga limita la frecuencia: después de un disparo, el siguiente espera 250 milisegundos.

Recuerda cuándo fue el último disparo y dispara solo cuando se mantenga presionada la barra espaciadora y haya transcurrido suficiente tiempo:

keys = pygame.key.get_pressed()
now = pygame.time.get_ticks()
if keys[pygame.K_SPACE] and now - last_shot >= 250:
    lasers.add(Laser(player.rect.centerx, player.rect.top))
    last_shot = now

now - last_shot indica cuánto tiempo ha pasado desde el último disparo. Asigna last_shot = 0 antes del bucle. Si mantienes presionada la barra espaciadora, ahora se disparan cuatro láseres por segundo, y si la pulsas rápidamente, no se dispara más rápido que eso.

Esto reemplaza el disparo con KEYDOWN: una forma de disparar, con una sola regla.

challenge icon

Desafío

Intermedio
  1. Elimina el disparo de KEYDOWN del bucle de eventos.
  2. Establece last_shot = 0 antes del bucle.
  3. En la parte de actualización, mientras mantengas pulsada la barra espaciadora y hayan pasado al menos 250 ms desde last_shot, dispara un láser y establece last_shot en el momento actual.

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()
laser_image = pygame.image.load("assets/images/laser.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())


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()


player = Player()
lasers = pygame.sprite.Group()

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
            lasers.add(Laser(player.rect.centerx, player.rect.top))

    player.update()
    lasers.update()

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

pygame.quit()

Todas las lecciones de Sprites e imágenes

Practica por tu cuenta: Playground de Pygame