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 = nownow - 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.
Défi
Moyen- Supprime le déclenchement de
KEYDOWNde la boucle d’événements. - Définis
last_shot = 0avant la boucle. - 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éfinislast_shotsur 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
1Charger des images
Charger une imageLa placer avec un rectangleDéplacer l’imageRépéter un arrière-planPixels transparents4Sprites et groupes
La classe SpriteGroupesSupprimer avec kill()Détecter avec spritecollideUn groupe contre un autre7Patrouille stellaire
Le vaisseau de patrouilleTirer des lasers2Tourner, retourner, redimensionner
Faire pivoter autour du centreRegarder dans la direction du volRedimensionner une imagePivoter à partir de l’original5Collisions au pixel près
Les rectangles semblent injustesMasquesSprites au pixel prèsZones de collision circulaires3Les classes pour les objets du jeu
Votre première classeLes méthodesSelf est l’objetUne liste d’objetsDes objets avec des imagesUne sous-classe6Animation à partir de feuilles de sprites
Découper une feuille de spritesUn compteur de framesAnimer avec le tempsUne explosion à déclenchement uniqueEntraînez-vous par vous-même : Playground Pygame