Ausblenden und Verkleinern
Teil des Abschnitts Sound und Spielgefühl der Pygame-Journey von Coddy. Lektion 10 von 23.
Ein Funke, der bis zu seinem Verschwinden gleich bleibt, sieht aus wie ein ausgeschalteter Punkt. Echte Funken kühlen ab: Sie werden kleiner und ändern ihre Farbe, während sie verglühen. Die passende Zahl hast du bereits: die life des Partikels. Berechne daraus beim Zeichnen die Größe und die Farbe.
Der Radius kann direkt der Lebensdauer folgen:
radius = p["life"] // 10 + 1Bei 40 verbleibenden Frames sind das 5; bei 9 oder weniger ist es 1. Das + 1 hält den Radius bei mindestens 1: Ein Kreis mit Radius 0 wird nicht gezeichnet, und der Funke würde vorzeitig verschwinden.
Wähle für die Farbe aus einigen Abstufungen von heiß nach kalt:
if p["life"] > 25:
color = (255, 220, 80)
elif p["life"] > 10:
color = (255, 140, 40)
else:
color = (180, 50, 40)Prüfe zuerst die größte Zahl. Andersherum geschrieben würde life > 10 auch eine Lebensdauer von 30 erfassen, und der gelbe Zweig könnte nie ausgeführt werden.
Aufgabe
MittelMit der Leertaste entsteht ein Ring aus 8 Funken, von denen jeder 40 Frames lang lebt. Lass sie während des Flugs abkühlen:
- Zeichne jeden Funken mit dem Radius
life // 10 + 1. - Färbe ihn gelb
(255, 220, 80), solange seine Lebensdauer über 25 liegt, orange(255, 140, 40), solange sie über 10 liegt, und danach dunkelrot(180, 50, 40).
Probier es selbst
import pygame
pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Ring of Sparks")
clock = pygame.time.Clock()
DIRECTIONS = [(3, 0), (2, 2), (0, 3), (-2, 2), (-3, 0), (-2, -2), (0, -3), (2, -2)]
particles = []
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:
for vx, vy in DIRECTIONS:
particles.append({"x": 240, "y": 180, "vx": vx, "vy": vy, "life": 40})
for p in particles:
p["x"] += p["vx"]
p["y"] += p["vy"]
p["life"] -= 1
screen.fill((20, 20, 36))
for p in particles:
if p["life"] > 0:
pygame.draw.circle(screen, (255, 220, 80), (p["x"], p["y"]), 4)
pygame.display.flip()
clock.tick(60)
pygame.quit()
Alle Lektionen in Sound und Spielgefühl
6Star Patrol aufpolieren
Star-Patrol-SoundsFunken bei jedem TrefferÜbe selbstständig: Pygame-Playground