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 = nownow - 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.
Aufgabe
Mittel- Entferne das Auslösen von
KEYDOWNaus der Ereignisschleife. - Setze
last_shot = 0vor der Schleife. - Feuere im Aktualisierungsteil einen Laser ab, solange die Leertaste gedrückt gehalten wird und seit
last_shotmindestens 250 ms vergangen sind, und setzelast_shotauf 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
1Bilder laden
Ein Bild ladenMit einem Rect platzierenDas Bild bewegenEinen Hintergrund kachelnTransparente Pixel4Spriters und Gruppen
Die Sprite-KlasseGruppenMit kill() entfernenMit spritecollide abfangenGruppe gegen Gruppe7Sternenpatrouille
Das PatrouillenschiffLaser abfeuern2Drehen, Spiegeln, Skalieren
Um den Mittelpunkt drehenIn Flugrichtung ausrichtenEin Bild skalierenVom Original aus drehen3Klassen für Spielobjekte
Deine erste KlasseMethodenSelf ist das ObjektEine Liste von ObjektenObjekte mit BildernEine Unterklasse6Animation mit Sprite Sheets
Ein Sprite Sheet zuschneidenEin Frame-ZählerMit Zeit animierenEine einmalige ExplosionÜbe selbstständig: Pygame-Playground