Menu
CoddyTech

Zum Feuern gedrückt halten

Teil des Abschnitts Sprites und Bilder der Pygame-Journey von Coddy. Lektion 31 von 36.

Bei jedem Schuss die Leertaste zu drücken, macht die Finger müde. Die meisten Shooter feuern, solange die Taste gedrückt gehalten wird, aber ein Laser in jedem Frame wäre ein durchgehender Strahl. Eine Abklingzeit begrenzt die Feuerrate: Nach einem Schuss wartet der nächste 250 Millisekunden.

Merke dir, wann der letzte Schuss abgegeben wurde, und feuere nur, wenn die Leertaste gedrückt ist und genügend Zeit vergangen ist:

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 gibt an, wie lange der letzte Schuss zurückliegt. Setze last_shot = 0 vor der Schleife. Wenn du jetzt die Leertaste gedrückt hältst, werden vier Laser pro Sekunde abgefeuert. Schnelles Tippen führt auch nicht zu einer höheren Feuerrate.

Damit wird das Feuern mit KEYDOWN ersetzt: eine Möglichkeit zu feuern, mit einer Regel.

challenge icon

Aufgabe

Mittel
  1. Entferne das Auslösen von KEYDOWN aus der Ereignisschleife.
  2. Setze last_shot = 0 vor der Schleife.
  3. Feuere im Aktualisierungsteil einen Laser ab, solange die Leertaste gedrückt gehalten wird und seit last_shot mindestens 250 ms vergangen sind, und setze last_shot auf jetzt.

Probier es selbst

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

Alle Lektionen in Sprites und Bilder

Übe selbstständig: Pygame-Playground