Trefferblinken
Teil des Abschnitts Sound und Spielgefühl der Pygame-Journey von Coddy. Lektion 13 von 23.
Wenn du einen Gegner triffst, sollte das Spiel es sofort anzeigen, noch bevor sich eine Lebensleiste ändert. Üblicherweise verwendet man dafür ein Treffer-Aufblinken: Für ein paar Frames wird der Gegner ganz weiß gezeichnet.
Dafür braucht man einen Zähler, der angibt, wie viele Frames das Aufblinken noch andauert. Ein Treffer setzt ihn; jeder Frame verringert ihn:
flash = 0
...
# ein Treffer
hp -= 1
flash = 6
...
# in jedem Frame
if flash > 0:
flash -= 1Beim Zeichnen bestimmt der Zähler die Farbe:
if flash > 0:
pygame.draw.rect(screen, (255, 255, 255), enemy)
else:
pygame.draw.rect(screen, (220, 80, 80), enemy)Sechs Frames entsprechen einer Zehntelsekunde: lang genug, um das Aufblinken zu sehen, aber kurz genug, damit der nächste Treffer erneut aufblinken kann. Der Spieler erkennt auf einen Blick, dass der Angriff getroffen hat.
Ein Sprite mit einem Bild kann auf dieselbe Weise aufblinken: Behalte eine weiße Kopie seines Bildes oder fülle eine Kopie mit Weiß und blitte sie, solange der Zähler läuft. Viele Spiele lassen den Spieler rot aufblinken, wenn er Schaden erleidet, ebenfalls mithilfe desselben Zählers.
Aufgabe
EinfachDie Leertaste trifft den roten Gegner und senkt seine HP. Lass jeden Treffer kurz aufblitzen:
- Setze
flash = 0vor der Schleife. - Setze bei einem Treffer
flash = 6. - Verringere in jedem Frame
flashum 1, solange der Wert größer als 0 ist. - Zeichne den Gegner weiß
(255, 255, 255), solangeflashgrößer als 0 ist, andernfalls rot.
Probier es selbst
import pygame
pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Training Dummy")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 32)
hit_sound = pygame.mixer.Sound("assets/sounds/hit.ogg")
player = pygame.Rect(120, 150, 60, 60)
enemy = pygame.Rect(300, 150, 60, 60)
hp = 5
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 and hp > 0:
hp -= 1
hit_sound.play()
screen.fill((30, 30, 46))
pygame.draw.rect(screen, (80, 160, 255), player)
if hp > 0:
pygame.draw.rect(screen, (220, 80, 80), enemy)
label = font.render(f"Enemy HP: {hp}", True, (240, 240, 240))
screen.blit(label, (300, 110))
pygame.display.flip()
clock.tick(60)
pygame.quit()
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Sound und Spielgefühl
Übe selbstständig: Pygame-Playground