Menu
CoddyTech

Maintenir pour tirer

Fait partie de la section Sprites et images du Journey Pygame de Coddy. Leçon 31 sur 36.

Appuyer sur Espace pour chaque tir fatigue les doigts. La plupart des jeux de tir font feu tant que le bouton est maintenu, mais un laser à chaque image formerait un faisceau continu. Un temps de recharge limite la cadence : après un tir, le suivant attend 250 millisecondes.

Retiens quand le dernier tir a eu lieu et ne tire que lorsque Espace est maintenue et que suffisamment de temps s’est écoulé :

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 indique depuis combien de temps le dernier tir a eu lieu. Définis last_shot = 0 avant la boucle. En maintenant Espace, tu tires maintenant quatre lasers par seconde ; en appuyant rapidement plusieurs fois, tu ne tires pas plus vite.

Cela remplace le tir avec KEYDOWN : une seule façon de tirer, avec une seule règle.

challenge icon

Défi

Moyen
  1. Supprime le déclenchement de KEYDOWN de la boucle d’événements.
  2. Définis last_shot = 0 avant la boucle.
  3. Dans la partie de mise à jour, tant que la barre d’espace est maintenue et qu’au moins 250 ms se sont écoulées depuis last_shot, tire un laser et définis last_shot sur l’heure actuelle.

Essayez vous-même

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

Toutes les leçons de Sprites et images

Entraînez-vous par vous-même : Playground Pygame